AM263P UART红外通信:从SIR到CIR,嵌入式开发的硬件协议栈详解 1. 红外通信技术概览与AM263P UART模块定位红外通信这个听起来有点“复古”的技术其实在今天的嵌入式世界里依然扮演着不可或缺的角色。从你家里电视遥控器的“咔哒”一声到两台老式PDA背对背“对接”传输名片再到工业现场某些特定传感器与控制器之间的非接触式数据交换背后都是红外光在默默工作。它的核心魅力在于简单、可靠、低成本并且天生具备方向性和短距离特性这既是限制也是优势——意味着更低的干扰和更好的私密性。红外数据协会IrDA制定了一套完整的标准协议栈定义了从物理层到应用层的规范。我们今天要深入探讨的就是物理层和链路层的核心实现特别是集成在德州仪器TIAM263P这类高性能微控制器中的UART红外模块。这个模块的巧妙之处在于它复用并扩展了经典的UART通用异步收发器硬件通过特定的编码、调制和解调逻辑使其能够处理红外信号。对于嵌入式开发者而言这意味着你无需外挂复杂的专用红外芯片仅凭MCU的一个UART外设和一颗廉价的红外收发器通常就是一个LED和一个光电二极管就能构建起完整的红外通信链路。AM263P的UART模块支持三种主流的IrDA速率模式SIR低速红外最高115.2 kbps、MIR中速红外0.576/1.152 Mbps和FIR高速红外4 Mbps以及一个专门用于消费电子遥控的CIR消费红外模式。理解这些模式的区别、帧格式、以及硬件如何自动完成编解码、透明传输、错误处理等脏活累活是稳定、高效实现红外通信功能的关键。很多人调不通红外问题往往不是出在代码逻辑而是对底层硬件机制和协议细节理解不透。接下来我们就一层层剥开它的技术外壳。2. IrDA SIR模式低速可靠的基石SIR模式是IrDA的基石也是兼容性最广、最常用的模式。它本质上是一种异步串行通信但将电信号转换成了特定格式的红外光脉冲。2.1 SIR帧格式与异步透明传输机制一个标准的SIR数据帧并不是把UART的TX信号直接驱动LED发光那么简单。硬件会自动为你的数据“打包”。参考技术手册中的帧格式图一个完整的SIR帧包含以下部分xBOF (额外帧开始符) 可选的多个0xC0字符用于同步和唤醒接收端。BOF (帧开始符 0xC0) 标志一帧数据的开始。A (地址字段)C (控制字段) 用于在多点通信中寻址和标识帧类型在点对点通信中常被忽略或用作固定值。I (信息字段) 就是你要发送的有效数据载荷。CRC (循环冗余校验) 16位CRC校验码基于A、C、I字段计算得出用于接收端检错。EOF (帧结束符 0xC1) 标志一帧数据的结束。这里有一个极易出坑的关键机制异步透明传输。想象一下如果你的数据载荷里恰好有一个字节是0xC0和BOF相同或0xC1和EOF相同接收硬件会误以为帧开始或结束了导致通信混乱。为了解决这个问题硬件实现了“字节填充”。在发送端硬件会扫描A、C、I和CRC字段即BOF和EOF之间的所有内容一旦发现0xC0, 0xC1或0x7D它会在该字节前插入一个转义字节0x7D并将原字节的第5位bit 5从0开始计数取反即与0x20进行异或操作。例如数据0xC0会变成0x7D 0xE0发送出去。这里有个非常重要的细节用于CRC计算的字节是原始字节0xC0而不是经过取反后的字节0xE0。接收端的过程则相反它发现0x7D就知道下一个字节是转义过的会丢弃0x7D并将后续字节的第5位取反还原再送入CRC计算器和FIFO。注意很多驱动代码在计算CRC时容易犯错直接对发送缓冲区的数据计算而忽略了硬件会对0xC0/0xC1/0x7D进行修改。正确的做法是要么在软件层预先计算好CRC并填入帧的CRC字段硬件会自动处理透明传输要么深刻理解硬件在CRC计算点使用的是原始数据。2.2 SIR的编解码与脉冲成形SIR模式如何用光脉冲表示“0”和“1”它采用了一种称为“归零”的编码。一个“0”比特低电平被编码为一个短暂的红外光脉冲而一个“1”比特高电平则对应无光或极弱光的时段。手册中提到了两种脉冲宽度方法3/16位周期脉冲 这是最常用的方式。在一个比特位的16个系统时钟16XCLK周期内光脉冲出现在第7到第10个时钟周期宽度为3个时钟周期。这提供了良好的抗干扰能力。1.6微秒固定脉冲 无论波特率如何脉冲宽度固定为1.6μs。这在低波特率下能提供更宽、更易检测的脉冲但需要硬件支持。编码器的工作流程如下当TX FIFO输出为‘1’空闲/停止位时TX线路保持低电平红外LED熄灭。当输出变为‘0’起始位或数据0时编码器开始计数在第7个16XCLK的下降沿点亮LEDTX线变高在第10个16XCLK的下降沿熄灭LED从而生成一个精确的3时钟宽脉冲。解码器则相反它持续监测RX引脚来自红外接收头的信号。一旦检测到上升沿红外脉冲到来它就在下一个16XCLK上升沿将内部RX FIFO输入拉低并保持16个周期以此还原出‘0’比特。如果没有检测到脉冲则内部信号保持高电平表示‘1’比特。2.3 SIR自由格式模式与地址检查有时你需要完全掌控数据包的结构例如实现自定义协议。这时可以使用SIR自由格式模式。在此模式下硬件完全“放手”不添加BOF、EOF也不计算CRC只是简单地将FIFO中的数据以SIR脉冲格式发送出去。所有帧结构的构建、CRC校验如果需要都必须由软件完成。这给了开发者最大的灵活性但也带来了最大的责任。另一个有用的功能是红外地址检查。在多设备红外环境中想象一下一个房间里有多个支持红外的设备为了避免设备收到不是发给自己的数据帧可以启用此功能。通过配置UART_EFR寄存器和UART_XON1_ADDR1、UART_XON2_ADDR2寄存器可以设置1-2个本机地址。只有地址字段匹配的帧其数据才会被存入RX FIFO并可能产生中断不匹配的帧会被硬件静默丢弃极大地减轻了CPU的中断处理负担。3. 中速与高速MIR与FIR模式解析当SIR的115.2kbps速度无法满足需求时就需要转向MIR和FIR模式。3.1 MIR模式比特填充与同步帧MIR模式将速率提升至0.576或1.152 Mbps。它不再是异步通信而是采用了同步HDLC-like的帧结构。一个MIR帧以至少两个连续的起始标志0x7E开始然后是帧数据和CRC-16最后以停止标志0x7E结束。MIR模式的核心机制是比特填充。为了保证标志0x7E二进制01111110的唯一性避免在数据字段中意外出现发送端状态机会在数据流中每连续出现5个‘1’后自动插入一个‘0’。接收端的状态机则负责删除这些填充的‘0’。这样数据字段中永远不会出现连续的6个‘1’因此0x7E就可以明确无误地标识帧的边界。中止序列被定义为至少7个连续的‘1’这在比特填充规则下也是不可能在数据中出现的从而保证了可靠性。MIR的编解码器还有一个精妙的42-41-42循环调整机制。为了用48MHz的时钟精确产生MIR所需的波特误差需在0.1%以内编码器不是简单地以固定分频产生时钟边沿而是以42、41、42个时钟周期为一个循环来调整脉冲边沿的位置。这样产生的平均周期是符合要求的虽然引入了微小的周期性抖动但完全在IrDA规范允许的容限之内。3.2 FIR模式4-PPM编码与更高效率FIR模式将速度推至4 Mbps。它采用了完全不同的4-PPM编码。PPM意为“脉冲位置调制”。在FIR中每2个数据比特一个符号被编码为一个4位的符号其中只有1位是‘1’其余3位是‘0’。‘1’的位置代表了数据值00-100001-010010-001011-0001这种编码方式提高了带宽利用率并对红外LED的开关特性更友好。FIR的帧结构包含一个16次重复的固定前导码、一个起始标志、数据、CRC-32和一个停止标志。前导码、起始和停止标志都使用非法的4-PPM符号如1010因此绝对不会与数据混淆。FIR的发送和接收状态机负责完成4-PPM的编码、解码、CRC-32计算以及帧边界识别。由于速率很高其对时钟精度和硬件时序的要求也更为严格。3.3 SIP协调不同速率设备的共存在MIR和FIR模式下有一个重要的概念SIP。SIP是一个持续约1.6ms的宽脉冲后面跟随约8.7ms的静默期。它的作用是通知那些只支持低速SIR模式的设备“信道正在被占用请勿打扰”。因为SIR设备无法解码MIR/FIR的高速信号如果没有SIP它们可能会误以为信道空闲而尝试发送造成冲突。硬件可以配置为在每帧结束后自动发送一个SIP也可以由软件定时控制发送以平衡信道占用开销。4. CIR模式消费电子红外遥控的实现CIR模式与SIR/MIR/FIR有本质不同。后三者是为双向数据通信设计的而CIR是专门为单向遥控器应用优化的。它的目标是灵活地模拟市面上各种各样的红外遥控协议如RC-5、SIRC、NEC等。4.1 CIR的核心可编程的脉冲宽度调制CIR模式的核心思想是用单个UART字节来表示一个“符号”的持续时间。这个符号可以是红外载波调制的一段脉冲代表逻辑“1”或“0”也可以是一段空白间隔。硬件不关心协议的具体含义它只负责一件事根据你写入TX FIFO的字节值生成对应时间长度的调制脉冲或空白。载波调制 CIR输出的不是直流信号而是一个被高频载波通常是38kHz调制的方波。这个载波由硬件内部产生。脉冲占空比 调制脉冲的占空比一个周期内高电平的比例可以通过UART_MDR2[5-4]位域配置为1/4、1/3、5/12或1/2以适应不同接收头的灵敏度。时间基准t 所有时间长度都是基于一个可编程的基本时间单位t的倍数。t由UART的波特率发生器决定。例如设置波特率使得t 1.778ms就可以用来模拟RC-5协议。4.2 如何用CIR模拟常见协议CIR模式提供了构建协议的“乐高积木”具体搭建需要软件完成。脉冲宽度编码如NEC协议逻辑‘1’ 560μs的载波脉冲 1690μs的空白。逻辑‘0’ 560μs的载波脉冲 560μs的空白。实现方法 设定时间基准t560μs。要发送一个‘1’就向TX FIFO写入一个代表“1倍t脉冲”的字节具体值由驱动约定紧接着写入一个代表“3倍t空白”的字节。发送‘0’则写入“1倍t脉冲”和“1倍t空白”。协议中的引导码、重复码等都可以通过组合不同时长的脉冲和空白字节来实现。双相编码/曼彻斯特编码如RC-5协议RC-5的每个比特位被固定在1.778ms的时槽内用该时槽中点处的跳变来表示‘0’或‘1’。实现方法 这需要将比特位拆解成更小的脉冲/空白单元。例如一个逻辑‘1’可以用“前半段空白后半段脉冲”来表示即先写入一个“0.889ms空白”字节再写入一个“0.889ms脉冲”字节。逻辑‘0’则相反。通过精心组合这些基本单元就能拼出完整的RC-5帧包括两个起始位、 toggle位、地址位和命令位。索尼SIRC协议它使用脉冲的长度来区分‘1’和‘0’。‘1’是1.2ms脉冲 ‘0’是0.6ms脉冲但空白间隔固定为0.6ms。实现方法 设定t0.6ms。发送‘1’时写入“2倍t脉冲”字节发送‘0’时写入“1倍t脉冲”字节。在每个脉冲字节后都跟一个“1倍t空白”字节。实操心得 在实现CIR驱动时最关键的是建立一个“时间字节映射表”。例如定义0x01代表1*t的脉冲0x81代表1*t的空白0x02代表2*t的脉冲以此类推。发送一个遥控按键命令就是按照协议格式将这个命令转换成一系列映射后的字节序列依次写入UART的TX FIFO。接收解码则是逆过程测量脉冲和空白的时间长度再映射回字节最终解析出协议帧。4.3 CIR的硬件接口与软件考量CIR模式通常使用UART的三个引脚TXD输出调制后的红外信号RXD接收来自红外接收头的信号用于学习型遥控器RTSn在CIR模式下重定义为SD用于控制外部收发器的模式如发送/接收切换。由于CIR硬件只是简单地按字节流发送脉冲/空白字节之间没有间隔。因此如果协议要求帧内各符号间有固定间隔或者帧与帧之间需要较长的延时必须由软件在写入FIFO的字节序列中插入代表特定时长“空白”的字节来实现。这是CIR模式编程中最需要仔细处理的地方。5. AM263P UART红外模块的配置与驱动开发要点理解了原理最终要落到代码上。基于AM263P的UART模块进行红外开发以下配置步骤和避坑指南至关重要。5.1 模式选择与基础配置流程时钟配置 确保UART的功能时钟UARTi_FCLK和接口时钟UARTi_ICLK正确使能并配置到所需频率。SIR模式的波特率由标准的UART波特率发生器产生。CIR模式的时间基准t也由波特率发生器决定其计算公式为t (波特率分频系数) / UART_FCLK需要根据目标协议反推计算出应设置的波特率。模式选择寄存器 通过UART_MDR1[2:0]选择工作模式000为UART/RS-485001为SIR010为MIR011为FIR1xx为CIR。IrDA特定配置脉冲类型 在SIR模式下通过UART_ACREG[7]选择3/16脉冲或1.6μs脉冲。SIP控制 通过UART_MDR1[6]和UART_ACREG[3]控制SIP的发送策略。地址检查 如果需要配置UART_EFR[1:0]和地址寄存器。CIR特定配置占空比 通过UART_MDR2[5:4]选择调制脉冲的占空比。引脚功能 确认RTSn引脚被正确配置为SD输出功能。FIFO与中断 配置FIFO触发阈值使能所需的发送/接收中断或DMA请求。5.2 常见问题排查与调试技巧完全收不到任何数据检查硬件链路 这是第一步也是最常见的一步。确认红外LED/接收头方向正确、已焊接牢固、限流电阻值合适。用手机摄像头大部分手机CMOS能看到红外光观察发送端LED在通信时是否闪烁。用示波器测量接收头输出引脚看是否有信号变化。确认模式与引脚 确保软件配置的IrDA/CIR模式与硬件设计匹配。例如在CIR模式下红外信号是从TXD脚输出而不是RXD。检查时钟与波特率 用示波器测量TXD引脚在UART模式下或红外发射管驱动端的信号看其波特率或脉冲间隔是否符合预期。计算波特率时的时钟源和分频系数是否正确。数据错误或帧错误SIR透明传输问题 如果数据中包含0xC0,0xC1,0x7D检查CRC计算是否正确。确保是使用原始数据计算CRC或者确认硬件自动处理机制已正确工作。MIR/FIR比特填充/解码错误 确保发送和接收两端配置的速率MIR 0.576或1.152 FIR 4M完全一致。检查时钟精度是否满足要求特别是MIR的0.1%容限。CIR时序不对 这是CIR调试中最头疼的。用逻辑分析仪或高采样率示波器捕获发送出的红外波形测量脉冲和空白的实际时长与目标协议如NEC的560μs/1690μs进行对比。重点检查计算时间基准t的公式和UART波特率设置。同时检查是否在需要间隔的地方插入了正确的“空白”字节。通信距离短或不稳定发射功率 检查LED的驱动电流是否足够。可以适当减小限流电阻但注意不要超过LED和MCU引脚的最大电流限额。接收头干扰 红外接收头容易受到环境光特别是日光灯、太阳光和电源噪声干扰。确保接收头有遮光罩并在其电源引脚就近放置滤波电容如10μF电解并联0.1μF瓷片。协议容错 某些消费协议如NEC有重复码机制软件驱动应实现简单的重复按键过滤和协议解码容错如允许一定的时间误差。使用调试工具逻辑分析仪 配备红外解码功能的逻辑分析仪是调试红外通信的神器可以直接解析出SIR、MIR、FIR的帧内容或者测量CIR的脉冲宽度并解码成常见协议。通用遥控器与接收头 手头备一个已知协议如NEC的通用遥控器和一个红外接收头可以快速验证你的接收解码代码是否正确。用遥控器对着你的接收头按键用MCU去解码是最直观的测试方法。红外通信是一个对时序和细节要求极高的领域。从SIR的异步透明传输到MIR的比特填充再到CIR的灵活脉冲构建每一层都需要开发者对硬件手册有精准的理解。AM263P的UART模块将这些复杂的功能集成在硬件中大大减轻了软件负担但唯有深入理解其工作机制才能写出稳定、高效的驱动让无形的红外光可靠地承载你的数据。