UART高级应用:从RS-485组网到红外遥控的寄存器配置与实战

1. UART通信:嵌入式世界的“通用语言”与核心原理

在嵌入式开发的日常里,调试信息输出、传感器数据读取、模块间通信,几乎都绕不开一个看似古老却无比坚韧的接口:UART。它就像电子设备间的“通用语言”,简单、直接、无处不在。你可能已经无数次地调用printf重定向到串口,或者用USB转TTL模块与开发板“对话”,但你是否真正理解数据是如何一位一位地、异步地、可靠地从A点传到B点的?更重要的是,当简单的点对点通信无法满足需求时,如何让UART变身为支持上百个节点的工业总线,或是化身为电视遥控器的红外信号发射器?

这正是我们今天要深入探讨的。UART远不止是“发送”和“接收”两根线。其核心在于一套精密的异步协议:通信双方没有统一的时钟线,全靠预先约定好的速率(波特率)和格式,在电平的跳变中捕捉信息。一个完整的UART数据帧,始于一个标志性的起始位(逻辑低电平),然后是5到9位的数据位,可选的奇偶校验位用于最基础的错误检测,最后以1、1.5或2个停止位(逻辑高电平)收尾。这个简单的结构,是数十年稳定通信的基石。

然而,标准的UART(常表现为TTL电平)通信距离短、抗干扰能力弱,且只能点对点。于是,在其物理层之上,衍生出了强大的扩展模式。RS-485模式通过差分信号和硬件方向控制,将通信距离延伸至上千米,并构建起多设备共享的通信网络,是工业自动化领域的脊梁。IrDA模式则“扔掉”了导线,利用红外光脉冲进行无线数据传输,从早期手机间的“红外互传”到某些设备的配置接口,都能见到它的身影。而CIR模式,则专门为红外遥控器这类需要特定载波调制的应用而生,你手里的电视、空调遥控器,很可能就是它的杰作。

这些模式并非魔法,它们都基于同一套UART内核,通过配置一系列功能寄存器来切换“角色”。理解如何操作UART_MDR1选择模式、用UART_LCR设定帧格式、用UART_EFR2开启多播寻址,是让UART适应复杂场景的关键。接下来,我们将从基础寄存器操作讲起,逐步拆解RS-485的多节点组网、IrDA的红外编解码,以及CIR的遥控信号生成,并附上实际配置中极易踩坑的细节。无论你是正在调试一个工业控制器,还是想为产品增加红外遥控功能,这些内容都将提供直接的参考。

2. UART核心机制深度解析与寄存器操作精要

在直接动手配置RS-485或IrDA之前,我们必须夯实基础,透彻理解UART内核是如何工作的。很多高级功能下的异常,根源往往在于对基础机制的一知半解。这部分我们将聚焦两个核心:数据流与错误处理机制,以及关键的寄存器访问模式。

2.1 数据流、FIFO与错误状态管理

现代UART控制器内部通常包含收发FIFO(先入先出缓冲区),这极大地减轻了CPU的中断负担。但数据在FIFO、状态机和外部引脚间的流动,以及错误如何被捕获和报告,是稳定通信的基石。

数据接收与错误捕获流程:当RX引脚检测到起始位,接收状态机便开始采样,组装成一个完整的字符后,会将其存入RX FIFO。与此同时,该字符的状态(是否出现错误)会被记录。这里有一个至关重要的细节:错误状态是与字符数据本身分离管理的。读取数据寄存器UART_RHR会弹出FIFO中的一个字符数据,而读取线路状态寄存器UART_LSR_UART获取的,则是当前位于FIFO顶部(即下一个将被读出的字符)的错误状态位,如帧错误(FE)、奇偶错误(PE)或间隔中断(BI)。

关键操作顺序与陷阱:务必注意读取顺序。正确的做法是,在读取UART_RHR获取数据之前,先读取UART_LSR_UART来检查即将读出的这个字符是否有错。因为一旦读取了UART_RHR,FIFO读指针就会后移,对应的错误状态也可能被更新或清除。如果顺序颠倒,你可能会将错误状态与错误的字符数据对应起来。

溢出错误(Overrun)的处理:这是最严重的接收错误之一。当RX FIFO已满,而接收状态机又试图写入一个新字符时,就会发生溢出。此时,控制器不仅会丢弃这个溢出的帧,还会设置一个内部标志,彻底禁用后续接收。许多开发者遇到“突然收不到数据”的问题,根源就在于此。恢复流程是严格的:

  1. 复位RX FIFO(通过相应控制位)。
  2. 读取UART_RESUME寄存器。这一步至关重要,目的是清除那个禁用接收的内部标志。缺少第二步,通信将无法恢复。

超时与间隔(Break)条件:超时计数器用于检测RX线路空闲。当线路空闲时间达到(4 × 字长 + 12)个比特时间,或寄存器设定的特定值时,可触发中断。这在处理不定长数据包时非常有用,可以判定一包数据接收完毕。间隔条件则是TX线被主动拉低超过一个完整字符传输时间,通常用作数据流中的复位或唤醒信号。需要注意的是,超时和间隔功能仅在标准UART模式下有效,在IrDA或CIR模式下不起作用

2.2 寄存器访问模式:通往高级功能的“钥匙”

TI等厂商的UART模块寄存器空间有限,但功能繁多。为了解决地址冲突,引入了“寄存器访问模式”的概念。这是配置过程中的第一个,也是极易出错的一个环节。

三种核心模式

  1. 操作模式(Operational Mode)UART_LCR[7] DIV_EN = 0。这是正常工作模式,可以访问UART_RHR(读)、UART_THR(写)等数据寄存器以及部分控制寄存器。
  2. 模式A(Divisor Latch Access Mode)UART_LCR[7] DIV_EN = 1,且UART_LCR[7:0] != 0xBF。在此模式下,可以访问波特率分频器寄存器UART_DLLUART_DLH,用于设置通信速率。
  3. 模式B(Enhanced Feature Mode)UART_LCR[7:0] = 0xBF。这是通往高级功能的门户。只有在此模式下,才能访问和设置UART_EFR(增强功能寄存器)、UART_XON1等关键寄存器。

子模式(Submode)的切换:在模式B下,还可以通过配置UART_EFR[4] ENHANCED_ENUART_MCR[6] TCR_TLR等位,进入更细分的子模式,例如TCR_TLR子模式用于设置FIFO触发深度,XOFF子模式用于软件流控配置。

实操心得:模式切换的固定套路:配置UART时,我习惯遵循一个清晰的流程,避免模式混乱:

  1. 软件复位后,首先进入模式B(写0xBFUART_LCR)。
  2. 在模式B下,使能增强功能访问(设置UART_EFR[4] = 1),然后进入所需的子模式(如设置UART_MCR[6] = 1进入TCR_TLR)。
  3. 完成子模式下的配置(如设置FIFO触发值)。
  4. 退出子模式和模式B,回到模式A(写0x80UART_LCR,此时DIV_EN=1但值不为0xBF)。
  5. 在模式A下,设置波特率分频器(UART_DLL,UART_DLH)。
  6. 最后,写0x00UART_LCR(或其他帧格式值,但保证DIV_EN=0),进入操作模式,并同时完成帧格式(数据位、停止位、校验位)的配置。这个流程能确保所有寄存器被正确写入。

3. RS-485模式实战:构建稳健的多节点网络

RS-485标准建立在UART的异步串行协议之上,主要改进了物理层:采用差分信号传输,具有极强的抗共模干扰能力,通信距离可达1200米以上,并且支持总线式拓扑,一条总线上可以挂载多达32个甚至128个收发器。

3.1 硬件方向控制:自动收发切换的核心

UART��身是双工或半双工的,而RS-485总线通常是半双工的,即同一时刻只能有一个设备发送。这就需要控制收发器的方向引脚(DE/RE)。高级的UART控制器如本文所述的型号,提供了硬件自动方向控制功能,这比软件延时控制要可靠得多。

硬件方向控制逻辑:通过设置UART_MDR3[4] DIR_EN = 1来启用此功能。方向信号由DIR引脚输出。其核心逻辑是:控制器硬件会监控TX FIFOTX移位寄存器的状态。当两者都为空时,表明当前没有数据需要发送,DIR引脚被拉低(假设DIR_POL=1时低电平为接收),将收发器切换到接收模式。

这里有一个至关重要的细节:保护时间(Guard Time)。在TX移位寄存器发送完最后一个字符的停止位后,硬件并不会立即切换方向。它会等待一个“保护时间”,默认为3个比特时钟周期。这是为了确保最后一个停止位已经完全通过收发器并出现在总线上了,避免在切换方向的瞬间,最后一个bit被“切断”或产生毛刺。这个时间可以通过UART_TIMEGUARD寄存器调整,以适应不同速度的收发器。

配置步骤与注意事项

  1. 引脚复用:确保UART的TX、RX以及DIR引脚已正确映射到芯片外部引脚。
  2. 模式与方向控制:设置UART_MDR1[2:0] MODE_SELECT = 0x0(标准UART模式)。然后使能方向控制:UART_MDR3[4] DIR_EN = 1,并根据收发器逻辑设置UART_MDR3[3] DIR_POL(通常为1,表示高电平发送)。
  3. 总线终端电阻:在RS-485总线的最远端(两端),必须并联一个120欧姆的终端电阻,以匹配电缆的特性阻抗,消除信号反射。这是很多通信不稳定问题的根源。
  4. 共地:所有RS-485节点必须有良好的共地连接,为差分信号提供参考地。

3.2 多播地址匹配:软件层面的设备寻址

在一条总线上有多个从设备时,主机需要一种寻址机制来与特定从机通信。RS-485硬件本身不提供此功能,但可以在UART的软件协议层实现,即“多播地址匹配”模式。

工作原理:该模式巧妙地复用奇偶校验位来标识地址帧。当启用多播模式(UART_EFR2[2] MULTIDROP = 1)且字符长度设置为8位(UART_LCR[1:0] = 0x11)时,协议发生变化:

  • 发送方:发送地址字节前,设置UART_ECR[0] A_MULTIDROP = 1,这将强制该字节的校验位为1。发送数据字节时,则需清除该位(A_MULTIDROP = 0),校验位为0。
  • 接收方:所有从机都会接收地址帧(校验位为1)。每个从机都有自己的地址掩码设置(通过UART_MARUART_MMRUART_MBR寄存器)。只有当地址帧与自己的地址匹配时,该从机才会接收后续的数据帧(校验位为0),直到下一个地址帧出现。

地址匹配逻辑详解

  • UART_MAR:本地地址值。
  • UART_MMR:地址掩码。掩码位为0表示该位是“不关心”位,为1表示必须精确匹配UART_MAR对应位。
  • UART_MBR:广播地址。
  • UART_EFR2[7] BROADCAST:使能广播地址匹配。

例如,设置MAR = 0xF3MMR = 0xF9(二进制1111 1001),MBR = 0xFFBROADCAST = 1

  • 单播/组播地址:由于MMR的 bit1 和 bit2 为0(不关心),所以地址0xF1(1111 0001),0xF3(1111 0011),0xF5(1111 0101),0xF7(1111 0111) 都能匹配。这实现了单地址(0xF3)和一组地址(0xF1,0xF5,0xF7)的匹配。
  • 广播地址:地址0xFF会作为广播地址被所有使能了广播功能的从机接收。

避坑指南:中断与状态读取:启用多播模式后,奇偶错误中断(UART_IER_UART[2] LINE_STS_IT)的意义变了。它不再表示校验错误,而是表示地址匹配成功。当发生地址匹配时:

  1. UART_IIR_UART[5:1]会指示为接收线路状态错误(0x03)。
  2. 读取UART_LSR_UART寄存器,若RX_PE位为1,则表明是地址匹配事件(而非校验错)。
  3. 匹配到的地址字节会被存入RX FIFO。特别注意:如果FIFO深度大于1,这个地址字节可能不是FIFO中最新的数据。你需要结合状态FIFO(在IrDA/CIR模式中详细讨论)或通过UART_LSR_UART[7] RX_FIFO_STS位来判断是否有带“错误”(此处即地址匹配标记)的帧在FIFO中,并找到它。

4. IrDA模式详解:红外无线数据传输

IrDA(Infrared Data Association)模式将UART的电信号转换为红外光脉冲进行传输。它主要分为三种速率:SIR (Serial Infrared, 最高115.2 kbps), MIR (Medium Infrared, 0.576/1.152 Mbps) 和 FIR (Fast Infrared, 4 Mbps)。它们共享核心逻辑,但在编码和时钟分频上有所不同。

4.1 时钟生成与波特率计算

IrDA模式需要将系统主时钟分频到特定的脉冲频率。其内部有一个可编程的波特率发生器,后接固定分频器。

分频公式

  • SIR模式分频值 = 系统时钟频率 / (16 × 目标波特率)
  • MIR模式分频值 = 系统时钟频率 / (41 × 目标波特率)(实际是41/42交替,取平均值)
  • FIR模式:固定使用6分频,分频值 = 系统时钟频率 / (6 × 4 Mbps),通常直接设置UART_DLH/DLL为特定值。

例如,系统时钟为48MHz,目标波特率为115.2kbps的SIR模式:分频值 = 48,000,000 / (16 * 115200) = 26.0416 ≈ 26将26写入UART_DLL(低8位)和UART_DLH(高6位)。实际波特率 = 48M / (16 * 26) = 115384.6 bps,误差约+0.16%,在可接受范围内。

致命警告(CAUTION):在修改波特率分频器(UART_DLH,UART_DLL之前必须先将UART_MDR1[2:0] MODE_SELECT设置为0x7(禁用模式)。否则会导致模块行为不可预测。这是一个硬性规定,务必在配置流程中严格遵守。

4.2 数据格式化与高级控制

IrDA的数据以帧为单位传输,类似于HDLC帧结构,包含开始标志、数据、CRC校验和结束标志。

帧结束的两种方式

  1. 帧长度法:设置UART_MDR1[7] FRAME_END_MODE = 0。主机CPU将本帧数据长度写入UART_TXFLHUART_TXFLL寄存器。当发送字节数达到该长度时,硬件自动附加结束标志。
  2. 设置EOT位法:设置UART_MDR1[7] FRAME_END_MODE = 1。在将帧的最后一个字节写入TX FIFO之前,主机先设置UART_ACREG[0] EOT = 1。当最后一个字节被写入时,硬件会标记该字符,并在发送时正确结束帧。这种方式更灵活,适合动态长度的帧。

存储与控制传输(SCT)模式:在某些应用(如短帧、应答帧)中,我们希望将一帧数据全部准备好后再一起发送,避免发送过程中出现FIFO欠载。通过设置UART_MDR1[5] SCT = 1来启用SCT模式。在此模式下,数据写入TX FIFO后不会立即发送。只有当主机设置UART_ACREG[2] SCTX_EN = 1时,整帧数据才开始发送。

状态FIFO与错误处理:IrDA模式有一个独立的状态FIFO,深度通常为8。每成功接收一个完整帧,该帧的长度和错误状态(如CRC错误、帧中止)就会被写入状态FIFO。主机通过读取UART_SFREGH/L获取帧长度,通过UART_SFLSR获取错误状态。这允许DMA在后台搬运大量数据,而CPU只需在状态FIFO达到触发水平时中断一次,批量处理多个帧的状态信息,极大提高了效率。

发送欠载(Underrun)处理:如果在帧结束之前TX FIFO就空了,会发生欠载。硬件会使用结束标志关闭帧,但CRC是错误的。接收方会因此丢弃该帧并可能请求重传。同时,一个内部标志会被置位,禁止后续发送。恢复步骤与接收溢出类似:1. 复位TX FIFO;2. 读取UART_RESUME寄存器以清���内部标志。可以通过设置UART_ACREG[4] DIS_TX_UNDERRUN来禁用此功能(不推荐,除非有特殊流控)。

4.3 SIR自由格式编程

SIR自由格式是一种简化模式,它使用标准的UART模式(MODE_SELECT = 0x0),但通过使能脉冲整形(UART_MDR2[3] PULSE = 1)来产生IrDA脉冲。此时,帧格式必须固定为:8位数据位、1位停止位、无校验位(UART_LCR[1:0]=0x11,[2]=0,[3]=0)。中断使用UART模式的中断,但许多与流控相关的中断(如CTS、RTS)在此模式下无关。

5. CIR模式实践:红外遥控编码与解码

CIR模式专为消费电子红外遥控设计。它与IrDA的关键区别在于调制方式:IrDA使用短脉冲(如3/16位时间或1.6µs)代表“0”,无脉冲代表“1”;而CIR使用特定频率(如36kHz, 38kHz)的载波对脉冲进行调制,以提高抗干扰能力和发射距离。

5.1 载波生成与数据格式化

CIR发射器需要生成一个占空比固定的载波脉冲串。其时钟链如下:系统时钟 -> 可编程分频器(UART_DLH/DLL) -> 固定16分频(SIR)或41/42分频(MIR) ->载波频率预分频器(UART_CFPS-> 脉冲占空比控制。

载波频率计算:这是CIR配置的核心。公式为:分频值 = (F_CLK / 12) / F_MOD其中,F_CLK是系统时钟(如48MHz),12是固定的波特率倍数,F_MOD是目标调制频率(单位Hz)。 例如,目标频率为36kHz:分频值 = (48,000,000 / 12) / 36,000 = 4,000,000 / 36,000 ≈ 111.111取整后为111,写入UART_CFPS寄存器。实际频率 = 4MHz / 111 ≈ 36.036 kHz,误差很小。

占空比选择:通过UART_MDR2[5:4] CIR_PULSE_MODE选择,常见的有1/3、1/4、1/2等。不同遥控协议可能要求不同的占空比,需查阅对应协议规范(如NEC协议常用1/3或1/4)。

5.2 发送与接收的实时性挑战

CIR模式对时序要求苛刻,因为遥控协议(如NEC、RC5)不仅定义“0”和“1”,还定义了精确的脉冲和间隔时间。

发送控制:待发送的数据(“0”和“1”的序列及其时间信息)需要由主机CPU预先组织成数据包,写入TX FIFO。难点在于控制数据包之间的间隔。有两种方法:

  1. 填充空闲位:在TX FIFO中填充足够数量的“0”比特,利用其固定的比特周期(t)来产生精确的延迟。这种方法简单,但不够灵活,且浪费FIFO空间。
  2. 外部定时器控制:这是更专业的方法。利用UART_IIR_UART[5] TX_STATUS_IT(发送状态中断)或UART_MDR1[5] SCT模式配合UART_ACREG[2] SCTX_EN位。例如,在SCT模式下,CPU可以准备好下一帧数据,然后等待外部定时器超时,再触发SCTX_EN开始发送,从而精确控制帧间间隔。

接收与自动停止:CIR接收端需要知道一帧数据何时结束。除了主机主动禁用接收(UART_ACREG[5] DIS_IR_RX = 1)外,还可以使用自动停止功能。 通过设置UART_EBLR(BOF长度寄存器)为一个非零值N,当接收端连续检测到N个比特时间为“0”(即无载波)时,便认为一帧结束,自动停止接收并产生中断(UART_IIR_CIR[2] RX_STOP_IT)。当再次检测到“1”(有载波)时,自动重新开始接收。这个功能对于解析变长遥控信号非常有用。

一个关键的硬件限制:文档中指出了一个实际开发中可能遇到的“坑”。CIR接收端的解调电路对输入脉冲的宽度有要求。例如,当系统周期为0.9µs,调制频率36kHz,占空比1/4时,发送的脉冲宽度应为约7µs。然而,市面上许多红外接收头(如HS0038B)在解调后输出的脉冲宽度会显著变窄(可能只有2µs)。如果这个脉宽小于UART接收滤波电路能识别的最小窗口,数据将无法被正确接收。解决方案:可以尝试调整UART_MDR2[5:4]的占空比设置,或者,在确认接收头输出信号质量尚可的情况下,通过设置UART_MDR3[0] DISABLE_CIR_RX_DEMOD = 1旁路内部的CIR解调电路,直接对接收头输出的数字信号进行采样。这需要你精确了解接收头的输出特性。

6. 完整配置流程与常见问题排查

结合官方编程指南和实际经验,下面给出一个从零开始配置UART模块的稳健流程,并总结常见问题。

6.1 标准UART模式配置流程

  1. 全局初始化与软件复位

    • 执行软件复位:UART_SYSC[1] SOFTRESET = 1
    • 等待复位完成:轮询UART_SYSS[0] RESETDONE,直到其等于1。
  2. 配置寄存器访问模式与波特率

    • 进入模式B:写0xBFUART_LCR
    • 使能增强功能:设置UART_EFR[4] ENHANCED_EN = 1
    • (可选)配置FIFO触发深度:进入TCR_TLR子模式(UART_MCR[6]=1),设置UART_TLRUART_FCR
    • 退出到模式A:写0x80UART_LCRDIV_EN=1)。
    • 禁用UART模式:这是关键一步!设置UART_MDR1[2:0] MODE_SELECT = 0x7
    • 设置波特率分频器:计算分频值,写入UART_DLLUART_DLH
  3. 配置协议与中断

    • 仍在模式A或再次进入模式B配置中断。
    • 进入模式B:写0xBFUART_LCR
    • 确保UART_EFR[4] ENHANCED_EN = 1
    • 退出到操作模式并设置帧格式:向UART_LCR写入一个值,其中DIV_EN=0,并同时设置数据位、停止位、校验位。例如,8N1格式:UART_LCR[1:0]=0x11(8位),[2]=0(1停止位),[3]=0(无校验),[7]=0,结果值0x03
    • 配置中断使能:在操作模式下或通过模式B配置UART_IER_UART,使能所需中断(如接收数据可用RHR_IT、接收线路状态LINE_STS_IT)。
  4. 启用UART功能

    • 最后,将UART_MDR1[2:0] MODE_SELECT设置为0x0(标准UART模式)。

6.2 模式切换配置流程(以配置IrDA SIR为例)

  1. 完成上述步骤1、2(复位、波特率设置)。
  2. 设置帧格式为8N1(UART_LCR=0x03)。
  3. 进入模式B(UART_LCR=0xBF)。
  4. 配置IrDA特定寄存器,如UART_MDR2[3] PULSE = 1(使能脉冲整形)。
  5. 退出模式B,回到操作模式(UART_LCR=0x03)。
  6. 最后,设置UART_MDR1[2:0] MODE_SELECT = 0x1(选择IrDA SIR模式)。注意:务必在设置完所有参数后再切换模式选择位。

6.3 常见问题排查速查表

现象可能原因排查步骤与解决方案
完全无法收发数据1. 时钟未使能。
2. 引脚复用未配置。
3. 波特率严重错误。
4. 软件复位后未等待完成或未正确退出复位。
1. 检查系统时钟控制器,确认UART模块时钟已开启。
2. 核对芯片手册,确认TX、RX引脚复用功能已设置为UART。
3. 使用示波器测量TX引脚,检查是否有波特率正确的信号输出。双检查波特率分频值计算,确认UART_MDR1[2:0]=0x7时设置分频器。
4. 确认在写SOFTRESET=1后,轮询RESETDONE直到为1。
能发送,不能接收1. RX引脚连接错误或损坏。
2. 对方设备TX未工作或电平不匹配。
3. 发生了溢出错误,接收被禁用。
1. 交换TX、RX线进行交叉测试。
2. 用示波器测量对方TX引脚和本方RX引脚信号。
3. 检查UART_LSR_UART寄存器的OE(溢出错误)位。如果置位,按流程复位RX FIFO并读取UART_RESUME
数据错误(乱码)1. 波特率不匹配(误差过大)。
2. 帧格式不匹配(数据位、停止位、校验位)。
3. 电气干扰(RS-485未加终端电阻,线路过长)。
1. 精确计算波特率分频值,双方使用相同晶振频率。
2. 确认通信双方UART_LCR中关于数据位、停止位、校验位的设置完全一致。
3. 对于RS-485,检查总线两端是否已接120Ω终端电阻,线缆是否屏蔽良好。
IrDA/CIR通信距离极短或不通1. 红外发射管电流不足。
2. 接收头被环境光干扰。
3. 载波频率或占空比设置错误。
4. CIR接收脉宽问题。
1. 检查发射管驱动电路,确保有足够电流(通常20-100mA)。
2. 避免强光直射接收头,或使用带滤波的接收头。
3. 用示波器测量发射管两端信号,核对载波频率(如38kHz)和占空比是否符合协议要求。
4. 对于CIR,尝试设置DISABLE_CIR_RX_DEMOD = 1,并直接测量接收头输出信号是否符合UART识别要求。
多播地址匹配不工作1. 未启用多播模式。
2. 字符长度不是8位。
3. 地址掩码寄存器配置错误。
4. 中断处理逻辑错误。
1. 确认UART_EFR2[2] MULTIDROP = 1
2. 确认UART_LCR[1:0] = 0x11(8 bits)。
3. 仔细计算UART_MARUART_MMR,理解“不关心”位的含义。用发送的地址帧反推验证。
4. 注意此时奇偶错误中断表示地址匹配,需读取UART_LSR_UART[2] RX_PE确认,并从FIFO中正确提取地址字节。
FIFO触发中断不按预期产生1. FIFO未使能。
2. 触发级别设置错误。
3. DMA模式与触发级别设置冲突。
1. 确认UART_FCR[0] FIFO_EN = 1
2. 检查UART_FCRUART_TLR中的触发级别值是否小于等于FIFO深度。
3. 在DMA模式0/1下,触发级别由UART_FCR设置;在DMA模式2/3下,或当RX/TX_TRIG_GRANU1=1时,触发级别由UART_TLRUART_FCR共同决定。核对UART_SCR寄存器中DMA模式控制位的设置。

调试UART,尤其是其高级模式,最有效的工具永远是逻辑分析仪示波器。逻辑分析仪可以直观地解码UART、IrDA的比特流,验证帧结构、地址、数据是否正确。示波器则能看清信号的模拟特性,如RS-485的差分电压幅值、红外载波的实际频率和占空比,这些都是软件配置无法替代的硬件验证环节。当你遇到棘手的通信问题时,不妨回归到最基础的信号层面,往往能发现配置疏忽之外的硬件问题。