你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的SPI传输时会丢失数据吗?

[复制链接]
攻城狮Melo 发布时间:2023-12-11 14:45

' w0 ?7 n) W9 O1 H* t. A
微信图片_20231211144442.png

) H5 `1 E7 J6 i! x8 P2 h
+ c, R" V3 }* t9 `有人使用STM32F4芯片验证SPI功能。当使用片内两个SPI模块基于中断方式进行收发时,发现总是出现接收数据丢失的情况,貌似总丢失末尾2个数据。代码使用HAL库提供的API函数。这是怎么回事呢?, T8 u5 d: }6 O# f) ]2 [; ?; V) C- E

2 Z4 {6 s- T+ i8 F* J我拿STM32F407开发板进行验证测试。使用SPI1做发送,SPI3做接收,都使用中断方式。
/ _% I$ [# l: D5 P2 r

3 K& J: j/ f  | 微信图片_20231211144439.png : u$ y3 x# N+ I8 Q- W

# n0 i' k/ H, C, K: y7 f" c4 U很快重现了问题现象,即发生接收数据丢失的情形。见下图验证结果,发了8个数据,只收到6个数据。! Z, |7 y. s* U$ y+ C( ]
- F  R  t' R9 Z" a) c
微信图片_20231211144435.png 3 P/ W6 n. w6 V5 a4 B/ O
3 z0 W4 w/ Q! A3 I
现在是同一颗芯片,即同一CPU基于中断方式完成收发。怀疑会不会是不同SPI收发模块中断优先级的安排不合理导致的问题。如果二者优先级一样的话,这里的发送中断往往先于接收中断的产生,势必会出现接收不及时的情形。通过对代码跟踪调试,也的确发现了SPI接收溢出的现象,即接收数据提取不及时。
1 k1 [* F1 O" h. K+ k
* [* a" o  a; o6 x8 M( V) i1 `
微信图片_20231211144432.png
$ }7 p" o2 `% D/ H& R+ K  ~) E& g' f
这样分析下来,感觉数据丢失应该跟通信速率有关,丢失数据的多少不应该固定。于是,我大幅度提升SPI通信速率再行测试,果真丢失的数据更多了。见下图测试结果,发8个数据只收到1个数据。【前面测试时SPI波特率是5.25Mb/s,现在改为21Mb/s了】; @  G4 N. x) e

0 e% i# p: N8 f  r% @ 微信图片_20231211144429.png # Z, ^! p5 C! P: @
4 a/ n) I6 v- T! O" [
我将SPI3接收中断的优先级调得比SPI1发送中断的还高,如下图所示。& @  Y& B- U/ ~8 K6 b/ ]: D

# `7 k% U7 x; F 微信图片_20231211144425.png * e) A0 _& C& q5 n7 W6 H8 ?

5 v9 p1 e* U, e; t" o基于重新调整中断优先级后的代码再做测试,结果就完全正常了。, C7 e1 h; d( A6 _3 ^; F
+ V; |! H6 H- \! p
微信图片_20231211144419.png 0 H6 A6 @; g* v& G% H! O* K* y
+ d- u! [. {8 b0 c5 J
当然,我们还可以有其它灵活处理的办法。比方发送用中断,接收用DMA,或者发送用轮训,接收用中断或DMA,或者都用DMA方式也行。  L8 S/ l+ Y* B/ ?- E9 d9 y; n
' C$ M. i' ]( F; y
这里的核心问题是中断优先级没有合理安排好。STM32 ARM核中断的内容不多,不过内容不多的东西往往意味着使用上更为灵活。好,今天的话题就分享到这里。
7 g6 i1 k5 i% I- E7 |  x

' _7 O9 B1 Y  `/ X2 h# ^转载自: 茶话MCU/ i$ g7 m9 ~3 h" u: F
如有侵权请联系删除# K7 v' L0 {0 r% }
& T( D, u4 K( G  `) x2 l1 |% m# L! y  o

- A, e% W# B: G, y: c) e. i/ e9 F0 j+ [0 z  }. B
收藏 评论0 发布时间:2023-12-11 14:45

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版