FPGA(主机)STM32(从机)SPI通信(HAL库实现)

FPGA 作主机,
传输ADC的数据
STM32F4 作从机。

目录

    • 1、FPGA通过ADC模块采集信号(AD9220 10M采样率的模块)
    • 2、存储到RAM中
    • 3、通过SPI与单片机进行数据传输(POL=1,PHA=1)
    • 4、单片机SPI采集到信号打印到串口上
    • 5、由EXCEL显示出来
    • 6、Github
    • 7、踩坑记录

1、FPGA通过ADC模块采集信号(AD9220 10M采样率的模块)

我这是12位的就接了12根引脚,和一根10M时钟线

2、存储到RAM中

设置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发送第一数据时,单片机可能跳过了,所以我选择往后移几个点接收。

3、通过SPI与单片机进行数据传输(POL=1,PHA=1)

SPI 我的结构
顶层模块,例化了,计数,sck,数据移位三个模块
这个比较复杂,可以直接套网上的代码

Start为单片机发送的开始传输的标志

FPGA(主机)STM32(从机)SPI通信(HAL库实现)_第1张图片

4、单片机SPI采集到信号打印到串口上

这里有一点 MOSI 接 MOSI 而不像串口反接
FPGA(主机)STM32(从机)SPI通信(HAL库实现)_第2张图片

FPGA(主机)STM32(从机)SPI通信(HAL库实现)_第3张图片

  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 */
  }

5、由EXCEL显示出来

最终展示一下采集到的信号 500kHz
FPGA(主机)STM32(从机)SPI通信(HAL库实现)_第4张图片

6、Github

FPGA和STM32工程文件

7、踩坑记录

完成这个花费了4天时间,踩了许多坑
因为STM32没接电源导致数据丢失就成了下面这图,还花费了一天去检查
FPGA(主机)STM32(从机)SPI通信(HAL库实现)_第5张图片


2021.9.26 日复测,距离上次完成过了20天左右
这一次失败了,莫名出现了如上图的丢包现象


9.28
换了stm32的spi1(之前为spi2) 成功采集500kHz的三角波
原因推测,可能是硬件NSS口出问题

但是出现了第一个数据丢失的情况,所以我就不再循规蹈矩,谁说了一定要从ram的第一个发送,我第3个不行吗?
FPGA(主机)STM32(从机)SPI通信(HAL库实现)_第6张图片


23/4/26
代码已经上传到github上了,有需要的自取。
曾经写的代码,虽然能用,但是感觉很垃圾(>_<) ,各位可以修改一番。

你可能感兴趣的:(FPGA,单片机,stm32,fpga,spi)