基于FPGA主机STM32从机的SPI通信的实现

以 FPGA 为主机、STM32 为从机实现 SPI 通信,SPI 的时钟极性和相位设置:SCPH=0,SCPOL=0,即时钟的初始状态为低电平,时钟的上升沿采样数据,下降沿发送数据。更多的时钟极性和相位设置可参考“SPI 通信协议介绍及调试方法”。

一、FPGA 的 SPI 主机

FPGA 作为主机控制 SPI 时序时,需要控制片选信号和时钟信号,当有数据发送时,片选信号拉低,时钟信号正常输出;否则,片选信号保持高电平,时钟信号保持低电平。

另外,上面提到 SPI 的时钟极性和相位设置为 SCPH=0,SCPOL=0,即时钟的初始状态为低电平,时钟的上升沿采样数据,下降沿发送数据。所以在 SPI 通信时,STM32 将在上升沿采样数据,但是 FPGA 在时钟下降沿发送数据,所以就会存在一个错位的问题,解决办法就是另外生成一个用于发送数据的时钟,代码如下:

reg spi_clk_r;
always@(negedge clk_150m or negedge rst_n)
	if(!rst_n)
		spi_clk_r <= 1'd0;
	else
		spi_clk_r <= spi_clk | spi_cs; 

最后,通过 modelsim 仿真和示波器抓取波形,可以看出 FPGA 能够正确的发送数据。

基于FPGA主机STM32从机的SPI通信的实现
图 1 SPI 主机 modelsim 仿真结果
基于FPGA主机STM32从机的SPI通信的实现
图 2 SPI 主机实际波形

二、STM32 的 SPI 从机

STM32CubeMX 生成初始代码,设置如下:

基于FPGA主机STM32从机的SPI通信的实现
图 3 STM32 SPI 从机分配管脚和设置参数
基于FPGA主机STM32从机的SPI通信的实现
图 4 STM32 SPI 从机时钟设置

最后生成初始化代码。之后打开工程在 main 函数中添加 SPI 收发代码即可,为了便于观察,同时也增加了串口发送程序,可以通过串口助手直接看到 STM32 接收到 SPI 的数据。

		HAL_SPI_TransmitReceive(&hspi4,(uint8_t *)0xaa,spi_buffer,4,1000);
		HAL_UART_Transmit(&huart6,(uint8_t *)spi_buffer,4,100);	

通过串口工具,可以看到 STM32 接收数据正确。

基于FPGA主机STM32从机的SPI通信的实现
图 5 通信成功
附件仅博主测试所用,暂不提供下载

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年7月25日 11:15
下一篇 2020年9月3日 11:09

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注