当前位置:科技动态 > STM32 的 HAL 库 SPI 通信例程

STM32 的 HAL 库 SPI 通信例程

  • 发布:2023-10-08 04:45

STM32 的 HAL 库 SPI 通信例程

stm32如何实现多个SPI通信

使用DMA进行SPI双机通信的几个容易出错的点:
1)分频值:SPI最高频率为18M,SPI1在APB2上频率为72M,SPI2开启频率为36M APB1。如果芯片时钟频率为72M,那么SPI1的分频值为4,SPI2的分频值为2。
2)开启DMA序列:我看到网上有人说需要开启从机先发送,再开启主机。发送,然后开启从机接收,最后开启主机接收。我不知道为什么要这样启用,而且这种启用DMA的方法很难实现。您可能需要再添加两条握手线来确定对方是否启用了 DMA。我的程序“从机接收-从机发送-主机接收-主机发送”的顺序也是可行的。
3)DMA中断:当数据发送到最后一个字节的第一位时,如果打开DMA发送中断,则会进入DMA发送中断功能。此时,不能立即清除该标志位。必须查询ISR寄存器以确定剩余的7位数据是否已发送,然后确定SR寄存器是否忙。只有全部完成后才能清除标志位并重新配置DMA数据长度,否则你后续的数据将是错误的。
4)上拉电阻:如果不加上拉电阻,偶尔会出现错误。通过模拟无法看出该错误。我的模拟每次都是正确的,但是拔掉模拟器不断测试后,发现数据错误,有5次。重新启动可能会出现 1 个错误。添加后,数据极其稳定。我不明白为什么网上的资料没有引体向上。
5)重置缓冲区地址:由于项目需要变长缓冲区,我多次使用malloc和free来分配缓冲区大小,导致缓冲区地址不断变化,所以必须禁用DMA,然后重新配置DMA 缓冲区地址。
6)主机传输过程不中断:我在网上看到资料说主机使能DMA后,会等待检查DMA传输是否完成,这样就无法发挥DMA的作用。 SPI的频率是18M,DMA据说是10M左右。如果使用死等待方式,最好不要使用DMA。
所以,如果主机不使用DMA中断,那么可以写两个函数,一是使能DMA,二是判断DMA传输是否已经完成。在这两个功能之间,CPU可以做自己的事情。反正楼主有主动权。
对于多从机,建议添加243等三态驱动芯片,spi速度可以很快而且稳定。如果允许的话,更好的办法是每个slave加一个,将其与master隔离,这样即使某个slave出现问题,也不会影响总线。

stm32的Spi通信问题:程序前面没有问题,但是到了发送和接收的同时就出不来了。你能帮我找出问题所在吗?紧急

首先解释一下:你没有开​​启时钟,它怎么能正常运行呢?
还有一点:STM32首先等待发送数据完成。如果没有发送,进入循环,说明数据发送错误,所以这里的顺序也有问题。应该是:
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定SPI标志位是否置位:发送缓冲区空标志位
SPI_I2S_SendData(SPI1, 0x54); //通过外部假设SPI1发送数据
printf("\n\r 数据发送完成.\n\r");

以上是小编对STM32 HAL库SPI通信例程及相关问题的解答。我希望它对你有用!

相关文章