新唐MCU技术
直播中

李桂兰

8年用户 1537经验值
私信 关注
[问答]

当UART数据传输过程中发生RLS(接收线状态)中断时,如何处理PEF、FEF和BIF标志?

当UART数据传输过程中发生RLS(接收线状态)中断时,如何处理PEF、FEF和BIF标志

回帖(2)

李淑华

2025-8-22 16:34:28
由于这三个标志与 UART 数据一起保存在 FIFO 中,因此在读取数据之前,必须通过向它们写入 1 来清除这些标志。这样可以避免FIFO级别的变化,导致保存在FIFO上层的PEF、FEF和BIF无法清除。
如果数据已读出,但三个标志未清除,则这些标志将保留在先进后出中。下次读出相同级别的FIFO数据时,由于这些旧标志,可能会无意中发生RLS中断。
举报

李秀兰

2025-8-27 17:45:45

当UART传输过程中发生RLS(接收线状态)中断时,表明接收线路出现错误,需要通过读取LSR(线状态寄存器)来处理PEF(奇偶校验错误)、FEF(帧错误)和BIF(中止中断)标志。以下是详细的处理步骤和原理:




1. 读取LSR寄存器



  • 目的:识别具体错误类型。

  • 操作:读取UART的LSR寄存器值,检查错误标志位:

    • PEF (Bit 2):奇偶校验错误(数据校验位不匹配)。

    • FEF (Bit 3):帧错误(停止位未正确检测到)。

    • BIF (Bit 4):中止中断(接收线持续低电平超过一帧时间)。


  • 示例:若LSR值中Bit 2置1,表示发生奇偶校验错误(PEF)。




2. 错误类型处理


(1) 奇偶校验错误 (PEF)



  • 原因:接收数据与奇偶校验不匹配。

  • 处理步骤

    1. 记录错误日志(如递增PEF计数器)。

    2. 丢弃错误数据:从RBR(接收缓冲寄存器)读取错误数据字节并忽略。

    3. 检查通信配置(如波特率、数据位、校验位设置)。



(2) 帧错误 (FEF)



  • 原因:未检测到有效的停止位(时序或信号干扰)。

  • 处理步骤

    1. 记录错误日志(递增FEF计数器)。

    2. 丢弃错误数据:读取RBR并忽略数据字节。

    3. 检查硬件连接/波特率设置(如波特率不匹配)。



(3) 中止中断 (BIF)



  • 原因:传输线持续低电平(BREAK信号)。

  • 处理步骤

    1. 记录BREAK事件(递增BIF计数器)。

    2. 清空中断:读取RBR(即使无有效数据)。

    3. 通知系统处理BREAK状态(如重置设备或切换模式)。





3. 清除错误标志



  • LSR特性:读取LSR后,错误标志位(PEF、FEF、BIF)会被自动清除

  • 关键操作:  

    • 必须读取RBR(接收缓冲寄存器):即使数据无效,也需读取RBR以确保状态更新。

    • 防止错误堆积:未读取时,后续错误可能无法触发中断。





4. 错误恢复流程




  • 步骤顺序


     void UART_RLS_IRQHandler(void) {
         uint8_t lsr = UART->LSR;           // 1. 读取LSR

         if (lsr & PEF_MASK) {              // PEF处理
             error_log_pef++;
             uint8_t data = UART->RBR;       // 丢弃错误数据
         }

         if (lsr & FEF_MASK) {              // FEF处理
             error_log_fef++;
             uint8_t data = UART->RBR;       // 丢弃错误数据
         }

         if (lsr & BIF_MASK) {              // BIF处理
             error_log_bif++;
             uint8_t data = UART->RBR;       // 清除中止状态
             handle_break_signal();          // 通知系统
         }
    }


  • 注意事项

    • 先读LSR判断错误类型,再读RBR清理状态。

    • 错误可能同时发生(需多条件判断)。





5. 预防措施



  • 波特率匹配:确保收发双方波特率误差<2%。

  • 抗干扰设计:添加滤波电路,降低信号噪声。

  • FIFO启用:使用FIFO缓存+超时中断减少错误处理频率。

  • 状态监控:周期性检查LSR错误计数器,主动排查配置问题。




总结



  • 核心动作:读LSR → 分类处理 → 读RBR清标志。

  • 关键逻辑:错误标志通过读取LSR和RBR复位,不处理会导致后续中断丢失。

  • 恢复目标:清除错误状态,保障后续数据正常接收。


通过严谨的错误标志处理,可提升UART通信的稳定性,避免因单次错误导致通信瘫痪。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分