以 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 能够正确的发送数据。
二、STM32 的 SPI 从机
STM32CubeMX 生成初始代码,设置如下:
最后生成初始化代码。之后打开工程在 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 接收数据正确。
附件仅博主测试所用,暂不提供下载
扫码关注尚为网微信公众号
每天学习电路设计和嵌入式系统的专业知识,关注一波,没准就用上了。
原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/702.html