赞
踩
FPGA 作主机,
传输ADC的数据
STM32F4 作从机。
我这是12位的就接了12根引脚,和一根10M时钟线
设置12位 258字的RAM (设置>=258)
勾选读使能
ram u_ram(
.address (address),
.clock (clk10M),
.data (Data),
.rden (rden),
.wren (wren),
.q (q)
);
读写的过程(暂时没优化)
always@(posedge clk10M, negedge rst_n) if(!rst_n) begin address<=0; wren<=1; flag<=0; tend<=0; start<=0; end else if(address<=260&&wren==1&&flag==0) begin if(address==260) //写完了开始读 begin flag<=1; wren<=0; address<=0; rden<=1; start<=1; end else address<=address+1; //地址+1 end else if(flag==1&&rden==1&&address<=260&&nc==1&&tend==0) begin if(Start==0)begin address<=0; add0<=0; end else if(add0==0)begin//延时一个周期,读取地址0的数据 这个没用了 address<=0; add0<=1; end else if(address==260) begin flag<=0; wren<=1; address<=0; rden<=0; //读完重写 tend<=1; start<=0; end else address<=address+1; tend<=1; //SPI传输完才进行地址增加 end else if(address>260) address<=0; else begin if(nc==0)tend<=0; address<=address; //地址不变 end
(可能fifo更简便些,只是想试一试RAM)
因为要做FFT,所以需要256个点,但是为什么RAM设置>256的深度,经过反复的测试,在FPGA发送第一数据时,单片机可能跳过了,所以我选择往后移几个点接收。
SPI 我的结构
顶层模块,例化了,计数,sck,数据移位三个模块
这个比较复杂,可以直接套网上的代码
Start为单片机发送的开始传输的标志
这里有一点 MOSI 接 MOSI 而不像串口反接
while (1)
{
HAL_GPIO_WritePin(Start_GPIO_Port,Start_Pin,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(Start_GPIO_Port,Start_Pin,GPIO_PIN_SET);
HAL_SPI_Receive(&hspi1,(uint8_t *)data2,259,0xff);
for(int i=2;i<258;i++)
printf("%d\r\n",data2[i]); //不管黑白猫,能得到正确的数据,就行
HAL_Delay(2000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
最终展示一下采集到的信号 500kHz
完成这个花费了4天时间,踩了许多坑
因为STM32没接电源导致数据丢失就成了下面这图,还花费了一天去检查
2021.9.26 日复测,距离上次完成过了20天左右
这一次失败了,莫名出现了如上图的丢包现象
9.28
换了stm32的spi1(之前为spi2) 成功采集500kHz的三角波
原因推测,可能是硬件NSS口出问题
但是出现了第一个数据丢失的情况,所以我就不再循规蹈矩,谁说了一定要从ram的第一个发送,我第3个不行吗?
23/4/26
代码已经上传到github上了,有需要的自取。
曾经写的代码,虽然能用,但是感觉很垃圾(>_<) ,各位可以修改一番。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。