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

LPUART 单线半双工通信过程中 stop 位与 start 位重叠的问题

[复制链接]
STMCU小助手 发布时间:2023-2-18 16:00
1. 问题描述客户在使用 STM32G071RB 的 LPUART 单线半双工模式开发相关的应用时,进行连续接收发送数据时,客户在检测到 RXNE 位时,认为接收完成,立即进行发送,发现 stop位(波形不完整)与 start 位发生了重叠。4 _9 G- B$ A- W  }/ f* L! ^- I
6 A! t! C6 s6 @, ?0 D% Z% I

/ q0 Y6 r" f6 W客户配置:
- s6 `; H8 E+ c  C3 S, ~# @' y时钟频率: HSI=16MHz: A- T/ H! M+ }7 s6 d
波特率: 9600 bits/s.
$ t' {3 P7 y% z! O. Z停止位: 1bit0 t  ]9 ?9 |2 {  J+ Y
字长: 8 bits " O( `4 g4 [6 P( d5 u* V6 M
校验: none! o& i& h+ m5 @& ^; Z8 m6 F

/ H! i) G! l/ P& X" W
+ a8 f, t+ _' L3 O( L) t0 X
2. 问题分析# O  R3 k  F0 |7 M" q
复现客户问题:8 ?( E5 Z5 n9 v
实验环境搭建:使用两块 STM32G071RB NUCLEO 板子采用单线半双工通信,将两块板子编号为 STM32G071RB NUCLEO_A 和 STM32G071RB NUCLEO_B。使用逻辑分析仪抓取信号波形。7 y6 |$ j  {* q2 E, Y1 g
使用 STM32CubeMX 进行基础配置生成代码,具体配置如图& O  }+ Z; M4 D/ y, W. w9 P
6 h/ W  V( g! i9 G# \( h
: i2 r" ^& {" h- S* E
EX~[$A1U~TD9]RQ6U@%0U.png
2 m9 n* M. Z( D. E. A8 r: g/ ]: j* S1 v! X' U
)MIQ35%KX]EU@TMBW$@[7TH.png
5 H7 y" H7 q  v/ z' K5 E6 z7 Q- C: X6 G+ u& d& q3 M) Y8 }  k/ u

! h& T/ z* {6 E复现客户问题代码如下:( u' O2 e4 m8 S- K6 F4 g
STM32G071RB NUCLEO_A 发送 0b0101 0101
7 y- @9 C% y$ P5 E
  1. if(__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE))) _( {. g$ @" v# N# V
  2. {5 A9 ^1 c; |7 ^, B& V2 O5 s4 j, }
  3. __asm("SEV");% D+ S+ A3 f8 y0 a/ g4 f/ I- p
  4. pdata8bits = READ_BIT(hlpuart1.Instance->RDR, USART_RDR_RDR);! |( c( U7 B& o" k( M$ Y, E
  5. }6 J" R6 ~  D  D$ L& ~" q4 {  N
  6. hlpuart1.Instance->TDR = (uint8_t)(0x55 & 0xFFU); //发送数据 0b0101 0101
    1 Z, t" v4 E, m$ g% l, _1 }
  7. HAL_Delay(100);  ~6 k& ^2 n7 |4 b1 D
  8. HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
复制代码
3 _' @& ]# j9 ?* m6 x& D4 R% X

+ R" R$ ^4 j. W) v9 D" v- pSTM32G071RB NUCLEO_B 收到后发送数据 0b0101 1010
9 [7 `- \# z! W# N4 W/ `
  1. if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE)) {+ W, }' I! A& K
  2. __asm("SEV");% l  o% h4 w' [9 S% X5 B% |9 Y3 e1 N
  3. pdata8bits = READ_BIT(hlpuart1.Instance->RDR, USART_RDR_RDR);3 P+ O. H# {6 i6 a! [1 S8 X. v
  4. while (!__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_IDLE))
    8 _, W& u6 p% R: F
  5. ;
    " K& p. _4 O6 c! g6 g
  6. hlpuart1.Instance->TDR = (uint8_t) (0x5A & 0xFFU); 9 Q+ \% @( e+ @
  7. //发送数据 0b0101 1010- O5 u5 j0 G% H! w% X  D6 n
  8. HAL_Delay(10);7 b" r* M4 ?1 p2 Z7 g
  9. HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);, `' E  ]3 ]( h* S1 r' _
  10. while (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE)) {) D+ A! j! w" c- ^# f4 a
  11. pdata8bits = READ_BIT(hlpuart1.Instance->RDR, / ?. m7 k4 J- @5 A3 i1 W
  12. USART_RDR_RDR);
    7 Z) n: E$ k0 O8 q& x: o- L
  13. }  ?5 B5 I% f3 {3 f( p& R
  14. }
复制代码

4 ^3 [5 y5 a; N" q" R
+ N; A( q6 V: V- l+ A$ R5 R测试结果如下图:
9 n1 L- ?! S8 @
& v+ g( j+ U- y, Z6 X0 q# ]# [
0 q3 D( T+ f& \
)(Z2~L9PMWBKQGXHRJ~7}U0.png 5 m8 F) Z1 p+ z! F

7 T4 B& Z7 j+ E8 z4 \

- [* j! \. W8 e1 d: ~从图中可以看出 1bit 约为 100us,设备 A 的 stop 位仅有 54.82us 。A 设备的 stop 位与 B 设备的 start 位重叠在了一起。B 设备检测到 RXNE 置位后,接收数据后立即发送数据,导致 B 开始发送的时候,stop 位只有一半,导致波形不完整。
0 T1 A( e) l2 n  Z/ K; m' s7 {* {. _5 X$ O! F) s& v( P" Z5 N6 c
( x) N5 }+ d: O
那怎样控制 stop 位与 start 位之间的时间使之区分开呢?- a% h3 r8 k, X) f& u# ]

/ N% B- J- G8 B* v, Z* C
4 |& Z% h5 l0 z0 H9 E
完整版请查看:附件 LPUART 单线半双工通信过程中 stop 位与 start 位重叠的问题.pdf (466 KB, 下载次数: 0)
赞 收藏 评论0 发布时间:2023-2-18 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版