
: K) \5 R- s4 B p8 ~3 q3 _0 i![]() / n6 o, T$ o$ E# p: T0 I 有人使用STM32F4芯片验证SPI功能。当使用片内两个SPI模块基于中断方式进行收发时,发现总是出现接收数据丢失的情况,貌似总丢失末尾2个数据。代码使用HAL库提供的API函数。这是怎么回事呢? 我拿STM32F407开发板进行验证测试。使用SPI1做发送,SPI3做接收,都使用中断方式。# H( ]) O1 x6 O' j / b) ~ R# f. V4 X5 R3 P& V ![]() 8 l/ @9 _; R% Y+ \ 很快重现了问题现象,即发生接收数据丢失的情形。见下图验证结果,发了8个数据,只收到6个数据。 A/ e$ g' I$ R- c: q! R9 C ![]() 现在是同一颗芯片,即同一CPU基于中断方式完成收发。怀疑会不会是不同SPI收发模块中断优先级的安排不合理导致的问题。如果二者优先级一样的话,这里的发送中断往往先于接收中断的产生,势必会出现接收不及时的情形。通过对代码跟踪调试,也的确发现了SPI接收溢出的现象,即接收数据提取不及时。 ![]() 9 c G F2 @) C 这样分析下来,感觉数据丢失应该跟通信速率有关,丢失数据的多少不应该固定。于是,我大幅度提升SPI通信速率再行测试,果真丢失的数据更多了。见下图测试结果,发8个数据只收到1个数据。【前面测试时SPI波特率是5.25Mb/s,现在改为21Mb/s了】$ Q% Y; j! h! L ![]() 6 A$ S8 m% o4 X 我将SPI3接收中断的优先级调得比SPI1发送中断的还高,如下图所示。5 `/ o$ S# p P3 f/ _6 d 6 ^, g; u9 n1 I1 V) k ![]() 3 Q! `) d3 j$ B/ I( i 基于重新调整中断优先级后的代码再做测试,结果就完全正常了。 . [/ B/ p4 @4 |, @ ![]() 0 w- p" V' f) J9 O 当然,我们还可以有其它灵活处理的办法。比方发送用中断,接收用DMA,或者发送用轮训,接收用中断或DMA,或者都用DMA方式也行。 这里的核心问题是中断优先级没有合理安排好。STM32 ARM核中断的内容不多,不过内容不多的东西往往意味着使用上更为灵活。好,今天的话题就分享到这里。% o: V! }' L& Z3 Z1 s2 d 转载自: 茶话MCU* j1 X) a; W# c- r5 q 如有侵权请联系删除 ' Q. N8 ]3 `# b8 A5 F/ |% z* o 0 t- }0 ^- {5 s3 T( `: U1 ?! m |
使用Nano板验证驱动SPI串口屏的颜色显示
【经验分享】STM32的SPI的原理与使用(W25Q128附代码)
【STM32C0评测】4、驱动Lorasx126x,实现透传
基于STM32基础的SPI总线概述
基于STM32的SPI读取数据的最后位出错问题经验分享
基于STM32关闭SPI会导致WRPERR错误的问题分析
基于STM32关闭SPI导致WRPERR错误经验分享
基于STM32CubeMX的SPI总线经验分享
如何实现基于STM32 SPI+DMAWS2812灯的驱动
基于STM32F030硬件SPI经验分享