对于单片机应用中的通信,UART(通用异步收发传输)是最常见和简单的一种通信方式。它使用单根传输线实现全双工通信,可以实现较低的通信速率,常见的波特率都在1Mbps以下。UART通信的优点是简单易实现,适用于一般的通信需求。
然而,在需要高速数据传输或大数据量频繁交互的场景下,UART通信的速率可能无法满足要求。这时候可以考虑使用SPI(串行外设接口)或I2C(串行总线)等更高速的通信方式。
SPI是一种高速的同步串行通信接口,可以支持十几兆甚至几十兆bps的传输速率。SPI通信需要4根线(CLK、MISO、MOSI、CS)进行数据传输,相比于UART的单根传输线,需要更多的管脚连接。SPI通信在程序实现上相对复杂一些,但是它的高速传输能力使得它适用于高要求的通信场景。
I2C是一种使用两根线(SDA、SCL)进行数据传输的串行总线,支持多主机和多从机的通信。它的传输速率较低,一般在几百kbps的范围内,但是它具有简单的硬件连接和通信协议,适用于一些简单的通信需求。
综上所述,单片机应用中的通信方式选择需要根据具体的需求来决定。如果需要简单、易实现的通信,可以选择UART。如果需要高速传输或大数据量频繁交互的通信,可以考虑使用SPI或I2C。
这里的使用场景是两个stm32之间需要实现大量且频繁的数据传输。鉴于这一需求,我们选择SPI作为通信协议。尽管我之前在网上查阅过其他人的实现过程,但由于并非自己亲手操作,理解起来颇为困难。因此,我希望能以最简洁的方式来实现这一功能。在自己动手尝试并成功实现后,我发现自己的方法相对简便。于是,我决定撰写一篇文章,详细记录整个实现过程。
参考了安富莱V7开发板的SPI双机通信程序,不过安富莱的初始化SPI程序都是手写的,在移植过程中发现按照例程里初始化spi的参数来设置cubemx的选项比较麻烦,像我比较懒就尽可能的使用默认设置。这里我还使用了DMA减少资源消耗。
配置spi
- 要根据自己的实际情况进行分频,在使用过程中发现频率高了会卡在spi的传输函数里一直while读取寄存器。
- 硬件主从机的NSS也一定要打开。
打开DMA