UART/IrDA模块FIFO、中断与DMA机制深度解析与配置实战

发布时间:2026/7/27 5:54:24
UART/IrDA模块FIFO、中断与DMA机制深度解析与配置实战 1. 串行通信基础与UART/IrDA模块概览在嵌入式开发和硬件通信领域串行通信是连接微处理器与传感器、显示器、无线模块乃至另一台计算机的“血管”。它不像并行通信那样需要多条数据线同时传输一个字节而是将数据拆分成一个个比特bit在单条线路上按顺序发送。这种“排队上车”的方式虽然牺牲了瞬时带宽却换来了布线简单、成本低廉、传输距离远的巨大优势使其成为嵌入式系统的标配。UART即通用异步收发传输器是实现这种异步串行通信最经典、最通用的硬件模块。所谓“异步”意味着通信双方没有共享的时钟信号来同步数据节奏而是依靠预先约定好的参数——波特率每秒传输的比特数、数据位、停止位和校验位——来正确地解读每一位数据。你可以把它想象成两个相隔很远的人用闪光灯打摩尔斯电码只要双方约定好每个“点”和“划”的持续时间就能准确传递信息而无需时刻对表。我们讨论的UART/IrDA模块则是一个功能更为集成的硬件单元。它本质上是一个“二合一”的通信控制器在UART模式下它通过物理导线如RX、TX、RTS、CTS引脚进行有线通信在SIR慢速红外模式下它则遵循IrDA标准通过红外光进行无线数据传输最高速率可达115.2 kbps。无论哪种模式其核心任务都是完成数据的“串并转换”接收时将外部设备送来的一连串比特流串行组装成处理器能理解的字节数据并行发送时则将处理器准备好的字节数据拆分成比特流发送出去。这个转换过程完全由硬件自动完成极大地解放了CPU。模块内部有一个关键的线路状态寄存器LSR它就像通信管道的“仪表盘”。工程师可以在任何时候读取它来获取每个通道的完整状态信息比如是否收到了新数据发送缓冲区是否已空在传输过程中是否出现了奇偶校验错误、帧错误或线路中断这些实时状态是软件进行流控和错误处理的基础。然而如果处理器必须为每一个收到的字节都立即执行一次中断服务程序或者在发送每个字节前都去查询发送缓冲区是否就绪那么CPU将陷入频繁的上下文切换或忙等待中效率极低。为了解决这个问题现代UART模块普遍引入了FIFO先进先出缓冲区。你可以把FIFO想象成一个小型的快递分拣站。接收FIFO可以暂存最多64个字节外加每个字节的3位错误状态信息发送FIFO也能缓存64个字节。当收到一定数量的数据例如达到FIFO深度的一半时模块才通知处理器“有一批货到了快来取”。这就像快递站攒够一车包裹再通知你去取远比每到一个包裹就喊你一次要高效得多。这个“通知”的阈值就是可编程的触发水平Trigger Level它决定了FIFO在多少数据量时产生中断或DMA请求。数据在FIFO和主机MPU或DSP之间的搬运可以通过两种高效的机制完成中断Interrupt和直接内存访问DMA。中断模式下当FIFO达到触发水平时模块会拉低一个中断请求引脚UART_nIRQ通知CPU来处理数据。DMA模式则更进一步它允许外设在不需要CPU介入的情况下直接与内存交换数据。当FIFO满足条件时模块会向DMA控制器发出请求由DMA控制器自动完成数据搬运CPU在此期间可以完全处理其他任务系统吞吐量得到质的提升。这两种机制配合硬件RTS/CTS或软件XON/XOFF流控共同构成了一个高效、可靠的串行通信子系统。注意理解UART通信关键在于抓住“异步”和“串行”这两个核心。所有配置如波特率、数据格式必须保证通信双方严格一致否则接收到的将是毫无意义的乱码。FIFO、中断和DMA则是提升系统性能、降低CPU负载的关键优化手段。1.1 核心工作模式解析UART与SIRUART/IrDA模块提供了两种截然不同的物理层通信方式以适应有线和无线场景。UART模式是我们最熟悉的 wired有线接口。它使用TX发送、RX接收两根基本数据线实现全双工通信可同时收、发。为了更可靠地管理数据流特别是当接收方处理速度跟不上发送方时通常会引入额外的硬件流控引脚RTS请求发送输出和CTS清除发送输入。当接收方的接收FIFO快满时可以通过拉高RTS信号变为无效告诉对方“暂停发送”同样发送方在发送前会检查CTS信号只有对方CTS有效拉低表示“可以发送”时才会真正发出数据。这个过程完全由硬件自动完成软件无需干预极大地减少了开销。除了硬件流控UART也支持软件流控即通过在线路上插入特殊的控制字符XOFF表示暂停XON表示继续来协调流量这种方式不需要额外的物理引脚但会占用数据带宽。SIRSlow Infrared模式则是IrDA标准下的红外通信。它与UART模式在“串并转换”的核心逻辑上共享硬件但在数据的封装、编码和物理传输上截然不同。红外通信不是用电平高低表示0和1而是用特定时间宽度的红外光脉冲来表示。一个SIR数据帧不是简单的字节流而是一个结构化的“数据包”起始标志BOF通常是一个或多个0xC0字节用于通知接收方帧的开始。有些配置也允许在0xC0前添加多个0xFF作为前导码。帧数据包含地址A、控制C和信息I字段的实际载荷数据。CRC-16校验2个字节的循环冗余校验码用于检测传输过程中是否发生错误。结束标志EOF一个0xC1字节标识帧的结束。红外通信有一个特殊需求如何确保数据字段中偶然出现的、与起始/结束标志或转义字符相同的字节不被误解这就需要**异步透明传输Asynchronous Transparency**机制。在发送端控制器会检查即将发送的载荷和CRC字段中的每一个字节。如果发现字节等于0xC0BOF、0xC1EOF或0x7D控制转义符它会自动在该字节前插入一个转义字符0x7D并将原字节的第5位bit 5取反与0x20进行异或后再发送。在接收端过程则相反遇到0x7D就知道下一个字节是经过“伪装”的特殊字节将其第5位取反即可恢复原貌。这个过程对上层软件完全透明确保了数据的完整性。此外SIR模式支持**地址检查Address Checking**功能。在多设备红外环境中如多个PDA之间一个设备可能收到发给其他设备的帧。通过编程设置XON1/ADDR1和XON2/ADDR2寄存器并启用地址检查设置EFR[1:0]模块会比对接收帧中的地址字段。只有地址匹配的帧才会被写入接收FIFO其他帧则被静默丢弃这有效避免了无关数据对处理器的干扰。2. FIFO机制深度解析与配置实战FIFO缓冲区是提升UART通信效率的基石。理解其工作原理和配置细节是进行高性能嵌入式通信编程的关键。2.1 FIFO的工作模式中断、轮询与DMA模块的FIFO支持三种基本操作模式以适应不同的应用场景和系统资源状况。1. FIFO中断模式FIFO Interrupt Mode这是最常用、最高效的模式。通过设置FCR[0] 1来启用FIFO并通过中断使能寄存器IER开启相应的中断。在此模式下处理器无需持续查询状态而是由硬件在特定条件满足时主动通知。接收中断当接收FIFO中积累的数据量达到或超过预设的触发水平由TLR[7:4]或FCR[7:6]设定时模块会产生一个接收数据就绪中断。中断信号会一直保持有效拉低直到处理器读取了足够多的数据使FIFO中的数据量低于触发水平中断才会被清除。这确保了处理器每次被中断时都有“一批”数据待处理而非单个字节。发送中断当发送FIFO从满状态开始被取走数据其数据量低于预设的发送触发水平由TLR[3:0]或FCR[5:4]设定时会产生发送FIFO空中断通知处理器“可以继续填充数据了”。当中断被响应处理器写入数据使FIFO数据量达到或超过触发水平后中断信号被清除。2. FIFO轮询模式FIFO Polled Mode Operation这是一种简单的、无中断驱动的模式。通过设置FCR[0] 0并禁用IER中的相关中断来进入此模式。此时软件需要主动、周期性地读取线路状态寄存器LSR来检查接收数据就绪LSR[0]或发送保持寄存器空LSR[5]等状态位。这种方式编程简单但会占用CPU时间进行忙查询适用于对实时性要求不高或任务非常简单的系统。3. FIFO DMA模式FIFO DMA Mode Operation这是对大数据量、高吞吐率场景的终极优化。DMA模式完全将CPU从数据搬运工作中解放出来。模块通过SCR[0]和FCR[3]或SCR[2:1]的配置可以选择DMA模式0、1、2、3。在使能DMA的模式下如模式1、2、3接收DMA当接收FIFO中的数据量达到DMA触发水平时模块会向系统DMA控制器发出DMA请求DREQ。DMA控制器随即启动从UART的接收FIFO中读取恰好等于触发水平数量的字节直接搬运到内存指定位置。搬运完成后DMA请求信号被撤销。发送DMA当发送FIFO为空时模块立即发出DMA请求。DMA控制器将内存中等于触发水平数量的数据写入发送FIFO。写入完成后请求撤销。只有当FIFO再次被取空或低于阈值取决于模式才会发出下一次请求。实操心得选择哪种模式取决于你的系统负载和性能要求。对于低速、间歇性数据如调试信息输出轮询模式足够简单。对于中等速率、需要及时响应的数据如GPS模块、传感器中断模式是平衡性能和复杂度的好选择。对于持续高速数据流如图像传输、高速日志记录务必使用DMA模式否则CPU利用率会飙升导致系统卡顿。2.2 关键寄存器配置详解配置FIFO和中断/DMA行为主要涉及以下几个寄存器FIFO控制寄存器 (FCR)FCR[0] (FIFO Enable) 置1启用接收和发送FIFO置0则禁用相当于1字节深度的缓冲区。FCR[1] (RX FIFO Reset)/FCR[2] (TX FIFO Reset) 写入1可分别清零接收和发送FIFO。这是一个瞬时操作通常用于通信初始化或错误恢复后。FCR[3] (DMA Mode Select) 与SCR寄存器配合选择DMA模式。FCR[7:6] (RCVR Trigger Level)/FCR[5:4] (XMIT Trigger Level) 当不使用TLR寄存器时这里提供接收和发送FIFO的触发水平简易设置通常为几个固定档位如1/8, 1/4, 1/2, 满。触发水平寄存器 (TLR)这是一个更灵活的寄存器允许独立且精细地设置接收(TLR[7:4])和发送(TLR[3:0])FIFO的触发水平数值范围对应FIFO的深度如0-63。特别注意当使用硬件流控时流控的“暂停”触发水平存储在TCR[3:0]必须大于或等于接收FIFO的中断/DMA触发水平。这是为了防止一种竞态条件接收FIFO已经达到中断水平通知CPU来取数据但与此同时数据还在源源不断进来可能还没等CPU响应FIFO就已经溢出。流控的“暂停”水平设置得更高能在FIFO接近满时更早地通知发送方停止为CPU处理留出安全余量。中断使能寄存器 (IER) 与中断标识寄存器 (IIR)IER 用于使能或禁用特定类型的中断源如接收数据就绪、发送保持寄存器空、接收线路状态错误等。只有被使能的中断源发生时才会最终导致中断引脚有效。IIR 当发生中断时CPU读取此寄存器来识别具体是哪个中断源触发了当前中断。IIR[0]位指示是否有中断挂起0表示有。IIR[5:1]或相应位则指明了最高优先级的中断类型。关键点在UART模式Modem模式下中断有优先级如线路状态错误最高调制解调器状态变化最低而在SIR模式下中断没有优先级任何使能的中断发生都会触发IRQ。2.3 配置流程示例与避坑指南以下是一个典型的UART模块初始化流程涵盖了软件复位、FIFO配置和波特率设置。这个过程是编程语言无关的你需要在你的驱动代码中实现类似逻辑。// 假设我们有访问硬件寄存器的宏或函数 #define UART_LCR (*((volatile uint32_t *)0x...)) #define UART_FCR (*((volatile uint32_t *)0x...)) // ... 其他寄存器定义 void uart_init(uint32_t baud_rate) { // --- 第一阶段软件复位 --- // 1. 为了访问IER和MCR需要先设置LCR为0xBF然后设置EFR[4]1 UART_LCR 0xBF; // 进入特殊配置模式 // 注意此处需要根据具体硬件手册操作EFR可能通过同一个地址 // 2. 设置LCR0x80允许访问IER和MCR UART_LCR 0x80; // 3. 清零IER和MCR移除任何UART中断和调制解调器控制 UART_IER 0x00; UART_MCR 0x00; // 4. 确保线路控制寄存器中的Break位为0LCR[6] UART_LCR ~(1 6); // 5. 将模块置于复位状态 (MDR1[2:0] 0x3) UART_MDR1 0x03; // --- 第二阶段FIFO配置 --- // 1. 再次进入特殊模式以配置EFR、TLR、TCR UART_LCR 0xBF; // 设置EFR[4]1 使能增强功能访问 // 设置MCR[6]1 使能TCR/TLR访问 // 2. 配置流控触发水平寄存器(TCR) // 例如设置HALT水平为56字节RESUME水平为8字节 UART_TCR (8 4) | (56); // TCR[7:4]RESUME, TCR[3:0]HALT // 3. 配置FIFO触发水平寄存器(TLR) // 例如设置接收触发水平为16字节发送触发水平为8字节 UART_TLR (16 4) | (8); // TLR[7:4]RCVR, TLR[3:0]XMIT // 4. 配置FIFO控制寄存器(FCR) // 启用FIFO复位RX/TX FIFO设置DMA模式0设置触发水平如果使用FCR内置的 UART_FCR (1 0) | (1 1) | (1 2); // 启用并复位FIFO // --- 第三阶段通信参数配置 --- // 1. 设置波特率除数锁存器 (DLL, DLH) // 假设系统时钟为48MHz目标波特率11520016倍过采样 // 除数 48,000,000 / (115200 * 16) 26.0416 ≈ 26 UART_LCR | (1 7); // 设置DLAB位为1以访问DLL/DLH UART_DLL 26 0xFF; // 除数低字节 UART_DLH (26 8) 0xFF; // 除数高字节 UART_LCR ~(1 7); // 清除DLAB位 // 2. 设置线路控制寄存器(LCR)数据位、停止位、校验位 // 例如8位数据1位停止位无校验 UART_LCR (3 0); // 数据位长度8 (LCR[1:0]11) // 3. 退出复位状态使能模块 (MDR1[2:0] 0x0 或其他操作模式) UART_MDR1 0x00; // 例如设置为UART 16x模式 // 4. 可选使能所需的中断 UART_IER (1 0); // 例如使能接收数据就绪中断 }避坑指南顺序至关重要寄存器配置特别是涉及模式切换如访问DLL/DLH需设置DLAB位和特殊功能使能如配置EFR、TCR需进入特定LCR模式时必须严格按照数据手册规定的顺序进行。错误的顺序可能导致配置不生效或模块行为异常。FIFO复位时机在通信开始前或发生溢出Overrun/下溢Underrun错误后务必通过FCR[1]和FCR[2]复位FIFO以清除残留数据和错误状态。中断清除处理完中断后必须通过正确的操作来清除中断源。例如接收数据就绪中断需要通过读取接收保持寄存器RHR来清除线路状态错误中断需要读取LSR寄存器。错误的中断清除方式会导致中断持续触发“中断风暴”。DMA与中断的协调如果同时使用了DMA和中断例如DMA处理批量数据中断处理错误需要仔细规划中断使能位避免同一事件被重复处理或遗漏。3. 中断与DMA机制详解及实战应用中断和DMA是协调CPU与UART模块工作的两大“调度员”。理解它们的触发条件、优先级和清除机制是编写稳定高效驱动程序的保证。3.1 中断机制深度剖析UART模块的中断系统是一个多源、可屏蔽、可查询的体系。所有中断最终汇聚到UART_nIRQ这个输出引脚上。通过设置**中断使能寄存器IER**的相应位你可以选择关心哪些事件如收到数据、发送缓冲区空、线路出错等而忽略哪些。UART模式Modem模式中断 在此模式下中断被分为6个优先级1最高6最低。当多个中断同时发生时**中断标识寄存器IIR**会报告其中优先级最高的那个。CPU读取IIR来判断该处理哪个中断。以下是常见的优先级顺序及处理方法中断类型 (IIR[3:0]值)优先级中断源清除方法接收线路状态 (0x06)1 (最高)溢出(OE)、帧错误(FE)、奇偶错误(PE)、中止(BI)FE/PE/BI: 从RX FIFO中读取所有错误字符。OE: 读取LSR寄存器。接收数据就绪 (0x04)2RX FIFO达到触发水平FIFO使能读取RHR寄存器直到FIFO数据量低于触发水平。接收超时 (0x0C)2RX FIFO中有陈旧数据一段时间无新数据读取RHR寄存器。发送保持寄存器空 (0x02)3TX FIFO低于触发水平FIFO使能写入THR寄存器直到FIFO数据量达到或超过触发水平。调制解调器状态 (0x00)4CTS、DSR等调制解调器线路状态变化读取MSR寄存器。XOFF/特殊字符 (0x10)5接收到XOFF流控字符或特殊字符接收到XON字符若为XOFF中断或读取IIR寄存器若为特殊字符中断。SIR模式中断 在红外模式下中断逻辑有所不同。它支持8种可能的中断但这些中断没有优先级。任何使能的中断发生都会拉低UART_nIRQ。IIR中的位直接对应不同类型的中断例如IIR[7]表示收到帧结束EOFIIR[6]表示状态FIFO有错误等。清除中断的方法也各异例如“接收EOF”中断通过读IIR清除“状态FIFO”中断则需要读取状态FIFO直到为空。唤醒中断Wake-Up Interrupt 这是一个特殊设计的中断用于低功耗场景。当模块处于睡眠模式时如果检测到RX线路有活动、TX FIFO被写入数据或调制解调器引脚状态变化可以产生一个唤醒中断将系统从低功耗状态拉回。该中断不会修改IIR寄存器软件需要通过检查**SCR[1]位来检测唤醒事件。清除它的唯一方法是将SCR[4]**位写0。3.2 DMA机制与模式选择DMA模式旨在实现“零CPU干预”的数据搬运。UART模块支持多种DMA模式0, 1, 2, 3通过SCR[0]、FCR[3]和SCR[2:1]位的组合进行选择。DMA模式0 通常意味着禁用DMA功能或使用最简单的单字节请求模式。DMA模式1/2/3 这些是真正的FIFO DMA模式。它们的工作流程可以用以下场景描述接收DMA 接收FIFO就像一个水池。DMA触发水平是水池的“警戒线”。当接收到的数据量达到这条线时模块向DMA控制器发出请求“水池快满了快来抽水” DMA控制器启动从UART的接收FIFO中一次性抽取恰好等于触发水平数量的字节搬运到内存。抽完后请求信号撤销等待下一次满警戒线。发送DMA 发送FIFO是另一个水池但逻辑相反。当发送FIFO空时模块立即发出DMA请求“水池空了快来灌水” DMA控制器将内存中等于触发水平数量的数据写入FIFO。写满后请求撤销。只有当FIFO再次被发送逻辑抽空才会发出下一次请求。模式选择建议模式1 最常见接收和发送都基于FIFO水平触发。模式2/3 可能提供更精细的控制比如仅在FIFO半满或特定条件下触发具体需参考芯片数据手册。核心要点在DMA模式下FIFO的触发水平直接决定了DMA请求的频率和数据块的大小。设置过小的触发水平会导致频繁的DMA请求增加总线开销设置过大则可能增加数据传输的延迟。需要根据波特率和系统处理能力进行权衡。例如在115200波特率下一个字节传输约87微秒64字节的FIFO满需要约5.6毫秒。如果将接收触发水平设为56字节则大约每4.9毫秒触发一次DMA。这个时间间隔对于大多数实时系统是可以接受的。3.3 睡眠模式与节能管理为了在电池供电或低功耗设备中节省能源UART/IrDA模块提供了睡眠模式Sleep Mode。进入条件 当满足以下所有条件时模块可进入睡眠模式接收数据线RX或RXIR空闲无数据。发送FIFO和发送移位寄存器为空。接收FIFO为空。除了“发送保持寄存器空”中断外没有其他中断挂起。节能原理 进入睡眠模式后模块内部时钟和波特率时钟会停止仅保留唤醒电路所需的最低功耗。大多数寄存器的时钟停止功耗大幅降低。唤醒事件 以下事件会将模块唤醒检测到接收数据线上的任何变化起始位。有数据写入发送FIFO。调制解调器输入引脚状态发生变化仅UART模式。如果使能了唤醒中断设置SCR[4]1唤醒事件还会产生一个中断。重要警告绝对不要在睡眠模式下对波特率除数锁存器DLL和DLH进行写操作。因为此时波特率时钟已停止写操作可能导致不可预知的行为。正确的做法是在修改波特率前先通过清除IER[4]UART模式或MDR1[3]IrDA模式来禁用睡眠模式修改完成后再重新使能。4. 流控、错误处理与高级功能实战可靠的通信不仅需要速度更需要稳健性。流控和错误处理机制是保证数据在复杂环境中准确无误传输的“安全阀”。4.1 硬件流控RTS/CTS实战硬件流控通过RTSRequest To Send和CTSClear To Send两根信号线实现自动流量管理。自动RTS接收方控制 此功能由接收方UART控制。接收方根据自己接收FIFO的剩余空间自动控制RTS引脚的电平。RTS有效拉低 当接收FIFO中的数据量低于TCR[3:0]寄存器设定的HALT暂停水平时表示“我有空间请继续发送”。RTS无效拉高 当接收FIFO数据量达到或超过HALT水平时RTS被拉高通知发送方“我快满了请暂停发送”。恢复发送 当接收方处理了数据FIFO数据量降至TCR[7:4]设定的RESUME恢复水平以下时RTS重新被拉低通知发送方可以恢复发送。关键延迟 由于信号传播和对方响应需要时间发送方在收到RTS变高的信号时可能已经开始了下一个字节的发送。因此HALT水平必须设置得足够保守为这“最后一个字节”留出空间防止溢出。自动CTS发送方检查 此功能由发送方UART执行。发送方在发送每个字节之前会检查CTS输入引脚的状态。只有CTS有效拉低时发送方才会发送下一个字节。如果接收方想叫停必须在发送方当前字节的最后一个停止位的中间时刻之前将CTS拉高发送方才会在发送完当前字节后停止。如果拉高得太晚下一个字节可能已经“箭在弦上”导致溢出风险。配置步骤确保硬件上RTS和CTS引脚已正确交叉连接本地的RTS连接对端的CTS本地的CTS连接对端的RTS。在软件中通过设置**增强功能寄存器EFR**的EFR[7]和EFR[6]位来分别使能自动CTS和自动RTS。根据FIFO大小和系统处理能力合理配置TCR寄存器中的HALT和RESUME水平。一个经验法则是HALT水平设为FIFO深度的3/4RESUME水平设为1/4。4.2 软件流控XON/XOFF机制当硬件流控引脚不可用时软件流控提供了另一种选择。它通过在线路中插入特殊的控制字符XOFFDC3, 0x13和XONDC1, 0x11来协调流量。工作原理接收方当接收FIFO快满时会向发送方发送一个XOFF字符。发送方收到XOFF后暂停数据传输。当接收方FIFO空间恢复后发送一个XON字符。发送方收到XON后恢复传输。配置 通过EFR[3:0]位可以启用不同的软件流控组合如只使用XON1/XOFF1或使用XON1/XON2和XOFF1/XOFF2字符对。MCR[5]XON Any功能如果使能则在收到XOFF后收到任何字符都会恢复传输而不仅仅是XON。局限性 软件流控字符本身也是数据如果传输的数据中恰好包含与XON/XOFF相同的字节会被错误地解释为流控命令导致通信中断。因此它不能用于传输二进制数据。此外它比硬件流控有更高的延迟和CPU开销。重要原则硬件流控和软件流控不应同时启用。同时启用会导致流控信号冲突产生不可预测的行为。通常优先使用硬件流控。4.3 关键错误条件与恢复通信过程中难免出错模块提供了状态标识和恢复机制。接收溢出错误Overrun发生条件 接收移位寄存器已经组装好一个新字节但接收FIFO已满无处存放。后果 新字节丢失LSR[1]OE位被置1并可能产生接收线路状态中断最高优先级。在SIR模式下IIR[3]RX overrun会被置位。恢复步骤读取LSR寄存器以清除OE状态位。必须复位接收FIFO设置FCR[1]1。在SIR模式下还需要读取RESUME寄存器来清除内部锁定标志否则后续帧无法接收。发送下溢错误Underrun发生条件主要在SIR模式 在发送一个完整帧的过程中发送FIFO在帧结束前被取空。后果 模块会用错误的CRC强行结束当前帧接收方会检测到CRC错误并丢弃该帧。同时内部标志被置位阻止后续发送。恢复步骤复位发送FIFO设置FCR[2]1。读取RESUME寄存器来清除内部标志。中止条件Break与超时Time-Out中止 通过设置LCR[6]1可以强制TX线路保持低电平发送一个长于一个字符时间的“中止”信号用于通知对方通信重置或作为帧分隔符。注意中止信号可能发生在字符中间要发送一个完整的字符宽度的中止需要先等待发送移位寄存器为空LSR[6]1再设置LCR[6]。接收超时 如果接收线路空闲保持高电平时间超过4 × 字长 12个比特时间且RX FIFO中有数据则会触发接收超时中断。这提示CPU可能有一个不完整的帧或通信已停止。4.4 SIR模式下的状态FIFO与帧处理SIR模式因其帧结构引入了**状态FIFOStatus FIFO**这一独特而强大的功能。它是一个深度为8的独立FIFO不与数据FIFO共享。作用 每当一个完整的红外帧被接收后模块不会立即用中断轰炸CPU。相反它会将这个帧的元信息包括帧长度和错误状态位如CRC错误、中止错误、帧长错误打包成一个条目写入状态FIFO。工作流程数据字节被持续写入接收数据FIFO。一帧接收完毕状态信息长度错误码被写入状态FIFO。当状态FIFO中的条目数达到其可编程的触发水平时才产生一个状态FIFO中断IIR[4]。CPU响应中断读取状态FIFO通过SFLSR、SFREGL/H寄存器获取一批已接收帧的概要信息。根据帧长度信息CPU可以准确地从数据FIFO中定位和提取每一帧的原始数据。根据错误状态可以决定是处理该帧还是请求重传。优势 这极大地减轻了CPU的负担特别是在DMA传输数据时。CPU无需为每个字节或每帧中断只需在状态FIFO达到一定积累后批量处理元信息效率极高。它实现了数据在数据FIFO中和元数据在状态FIFO中的分离与并行处理。帧结束的两种方法 在SIR发送时需要明确告知模块一帧何时结束以便它添加CRC和结束标志。帧长度法MDR1[7]0 在发送前将本帧的总字节数写入TXFLH和TXFLL寄存器。模块发送完指定数量的字节后自动结束帧。设置EOT位法MDR1[7]1 在将一帧的最后一个字节写入TX FIFO之前先将ACREG[0]EOT位写1。当这个被标记的字节从FIFO中取出发送时模块就知道这是帧尾并自动添加结束序列。受控发送Store and Controlled Transmission, SCT 通过设置MDR1[5]1启用。在此模式下数据写入TX FIFO后不会立即开始发送。只有当软件明确写1到ACREG[2]延迟发送开始位时发送才会启动。这对于先组装好一个完整帧尤其是短帧再一次性发送的场景非常有用可以避免发送中途FIFO变空导致的“下溢”错误。