当前位置:   article > 正文

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

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

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

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)
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

读写的过程(暂时没优化)

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

(可能fifo更简便些,只是想试一试RAM)

因为要做FFT,所以需要256个点,但是为什么RAM设置>256的深度,经过反复的测试,在FPGA发送第一数据时,单片机可能跳过了,所以我选择往后移几个点接收。

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

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

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

在这里插入图片描述

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

这里有一点 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 */
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5、由EXCEL显示出来

最终展示一下采集到的信号 500kHz
在这里插入图片描述

6、Github

FPGA和STM32工程文件

7、踩坑记录

完成这个花费了4天时间,踩了许多坑
因为STM32没接电源导致数据丢失就成了下面这图,还花费了一天去检查
在这里插入图片描述


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


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

但是出现了第一个数据丢失的情况,所以我就不再循规蹈矩,谁说了一定要从ram的第一个发送,我第3个不行吗?
在这里插入图片描述


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/585903
推荐阅读
相关标签
  

闽ICP备14008679号