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

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

[复制链接]
STMCU小助手 发布时间:2023-2-18 16:00
1. 问题描述客户在使用 STM32G071RB 的 LPUART 单线半双工模式开发相关的应用时,进行连续接收发送数据时,客户在检测到 RXNE 位时,认为接收完成,立即进行发送,发现 stop位(波形不完整)与 start 位发生了重叠。
, O- I; e# `" i, @- x1 V# H3 j% P' v& H  E( o- l1 H
& l7 S- T$ u, Q
客户配置:8 }; @" z) n: M& D0 n
时钟频率: HSI=16MHz$ N9 s- p0 D! R+ N
波特率: 9600 bits/s.
. K. o/ ?$ Q: L$ b2 U' y/ o停止位: 1bit
. j5 e& r; c. X  E+ T字长: 8 bits 8 g# n+ D% S' H& Z2 _
校验: none. h! r' D2 X% S8 e! P' D1 H0 n
6 ^8 S0 U0 @0 J
7 s: ~# [; m* S0 c5 @8 E
2. 问题分析1 P1 q% _% [1 b! s( J
复现客户问题:( `; n, l$ q. F# J: A8 l
实验环境搭建:使用两块 STM32G071RB NUCLEO 板子采用单线半双工通信,将两块板子编号为 STM32G071RB NUCLEO_A 和 STM32G071RB NUCLEO_B。使用逻辑分析仪抓取信号波形。
# {8 \# K1 x4 k+ V- T  S使用 STM32CubeMX 进行基础配置生成代码,具体配置如图' T3 c% Y+ u0 L- p8 Z, |- M4 o, p
8 K7 Q' F: ~( z; h
* H! C4 }- k3 G# j: N& Q5 @
EX~[$A1U~TD9]RQ6U@%0U.png
* @" U% S4 I/ a" J5 S$ b) ~) a8 q0 @. }7 J2 p7 p
)MIQ35%KX]EU@TMBW$@[7TH.png % z4 {; Z% n' \5 w) J! @9 X% b/ E; k
# E5 k& v& w/ H: Z4 r: \

3 B4 A  L0 n$ e2 s$ `) y复现客户问题代码如下:& ]  B+ V; Z$ d0 Z
STM32G071RB NUCLEO_A 发送 0b0101 0101
! j8 O' @0 j- i0 d$ \. K
  1. if(__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE))
    & f4 R+ C" l* `7 I) f% N* H
  2. {
    , O/ p" Z9 q2 N4 z3 |& ~  B0 l
  3. __asm("SEV");3 U4 L8 ^7 W: H
  4. pdata8bits = READ_BIT(hlpuart1.Instance->RDR, USART_RDR_RDR);
      [& c, h/ q/ Z/ t& Z6 D
  5. }
    4 u) {' u* g9 S, X2 v& J, `2 ~! R
  6. hlpuart1.Instance->TDR = (uint8_t)(0x55 & 0xFFU); //发送数据 0b0101 0101
    9 [2 X6 C" F% F# p4 w
  7. HAL_Delay(100);
    * ^6 j$ K; w& u6 l7 z* i8 g% Q7 Z: D
  8. HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
复制代码
! @+ l" T. K2 \! ?

6 ?6 ?6 H, b9 o' Y' C- ZSTM32G071RB NUCLEO_B 收到后发送数据 0b0101 1010
  i* c/ A* k5 U6 {
  1. if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE)) {5 r4 w$ v7 S( t; Q% w
  2. __asm("SEV");
    5 T. {6 A2 D2 t/ J, M/ x
  3. pdata8bits = READ_BIT(hlpuart1.Instance->RDR, USART_RDR_RDR);
      K: K# ^2 R7 }0 i; I& D; @7 x
  4. while (!__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_IDLE))
    + ]5 w) o4 x2 B0 n
  5. ;
    2 v$ s  a' [8 K. |3 t
  6. hlpuart1.Instance->TDR = (uint8_t) (0x5A & 0xFFU);
    0 H0 x( m# `6 Q" B' e# S
  7. //发送数据 0b0101 1010$ G3 ]8 g/ l6 S7 h* O
  8. HAL_Delay(10);
    % w: |) `* I. h4 Z5 I9 l
  9. HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
    ) ]* U2 M& Q% ^, ~1 F
  10. while (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE)) {
    / F- d: w& `- y7 D$ t: r( A6 p
  11. pdata8bits = READ_BIT(hlpuart1.Instance->RDR,
    & ]) s7 m9 M. {$ M+ y* |3 d3 r) g+ @
  12. USART_RDR_RDR);) n- D3 ?, H! ]
  13. }. |3 y( p1 j4 f9 z% [. I8 c* J; Y
  14. }
复制代码

" J2 y7 b! Y6 S- L
* n' ^$ N  E7 E( _) F! n4 F9 i& [测试结果如下图:
9 R  D8 P+ B. l% W3 S$ X
! o$ k1 ^% g: q" t, q1 d

' T4 @2 {1 ]) @/ u$ ]- l7 o; l- f )(Z2~L9PMWBKQGXHRJ~7}U0.png
: Y" n8 d; Z; n. C( Y# D" W( i+ x/ d0 I$ |
# M, A/ j1 z  k
从图中可以看出 1bit 约为 100us,设备 A 的 stop 位仅有 54.82us 。A 设备的 stop 位与 B 设备的 start 位重叠在了一起。B 设备检测到 RXNE 置位后,接收数据后立即发送数据,导致 B 开始发送的时候,stop 位只有一半,导致波形不完整。% {/ Z/ M0 T" S  I

* [! |$ k# C/ U# n5 `

9 x0 b" Q. _1 H  `* C% v9 S那怎样控制 stop 位与 start 位之间的时间使之区分开呢?4 g7 P8 n8 W. M6 _

! m7 j7 T$ l, n3 f
4 P4 B( [! L( v, n3 C6 q
完整版请查看:附件 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 手机版