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为单片机发送的开始传输的标志
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 */
}
FPGA和STM32工程文件
完成这个花费了4天时间,踩了许多坑
因为STM32没接电源导致数据丢失就成了下面这图,还花费了一天去检查
2021.9.26 日复测,距离上次完成过了20天左右
这一次失败了,莫名出现了如上图的丢包现象
9.28
换了stm32的spi1(之前为spi2) 成功采集500kHz的三角波
原因推测,可能是硬件NSS口出问题
但是出现了第一个数据丢失的情况,所以我就不再循规蹈矩,谁说了一定要从ram的第一个发送,我第3个不行吗?
23/4/26
代码已经上传到github上了,有需要的自取。
曾经写的代码,虽然能用,但是感觉很垃圾(>_<) ,各位可以修改一番。