用STM32F4系列,SPI1做主机,SPI2做从机
SPI1 设置
SPI2从机
经验分享1:
SPI2 不能主动发送,必须被动发送,即SPI 1请求,SPI2才能发送
经验分享2:
数据错位问题,SP1发送 {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
SPI2接收总是发生错位
偶然发现是因为初始化的时候,把SPI1的接收DMA打开影响了
把HAL_SPI_Receive_DMA(&hspi1, spi1_rxdata, 8); 屏蔽后,SPI2接收正常
没有深入分析原因,有知道的大神可以告知一下哈~
7.29
我后面把主机和从机分开两块板做实验,但是现象原因分析是一样的。
分析上面原因,是因为SPI的协议
实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
这里有篇文章写得很好
参考链接:
【STM32笔记】两块STM32之间的SPI主从通信实例(附代码工程)-腾讯云开发者社区-腾讯云
对于从机而言,调用HAL_SPI_TransmitReceive_DMA只是把要发送的内容放在待发送区,并不是真正的发送。而真正的发送是从机接收到主机的消息,这时同一时刻从机才会把spi_txdata的内容发送出去。
数据的错位分析
*******************************错误操作************************************
主机在while 1里循环发送
从机在接收中断应答
另外我这边很容易出错的地方就是从机接收中断里调用HAL_SPI_TransmitReceive_DMA,从机会因为状态busy而不没有执行向发送区填充数据,导致主机接收数据不对。
原因是DMA1_Stream3的中断,SPI还没接收完成,所以此时让SPI发送,它BUSY
*******************************错误操作************************************
↓下面是正确操作
解决方法是在从机接收完成中断记录一个标记位。
从机while 当识别到接收完成,回复信息