深入解析S12P SCI模块:寄存器操作、IrDA与LIN总线硬件支持
1. S12P系列SCI模块:不只是串口,更是嵌入式通信的“多面手”
在嵌入式开发领域,串行通信接口(SCI)几乎是每个工程师的“老朋友”。它简单、可靠,是连接微控制器与外部世界最基础的桥梁之一。但如果你认为SCI仅仅是一个简单的UART(通用异步收发器),那可能就错过了它许多强大的内置功能。以Freescale(现NXP)的S12P系列微控制器为例,其SCI模块(S12SCIV5)的设计深度远超一个标准UART。它不仅处理最基础的异步串行数据收发,更集成了对红外(IrDA)物理层的硬件编解码支持,以及对汽车LIN总线协议的硬件级辅助功能。这意味着,用同一套硬件,你可以轻松实现从有线调试、无线遥控到汽车网络节点的多种通信需求,而无需外挂复杂的编解码芯片或投入大量软件开销进行位级时序处理。
理解这个模块的关键,在于吃透其寄存器级的操作逻辑。很多开发者习惯于调用库函数,这固然高效,但在面对通信异常、需要精细调优或利用高级功能(如9位数据、LIN碰撞检测)时,往往会感到束手无策。寄存器是硬件的直接映射,掌握了它,就等于掌握了与硬件对话的“母语”。本文将带你深入S12P SCI模块的寄存器世界,拆解其数据流路径,并重点剖析其独特的红外与LIN支持是如何在硬件层面实现的。无论你是正在调试一个基于S12P的汽车车身控制模块,还是想为你的智能家居设备增加IrDA遥控功能,这些底层的细节都将是你解决问题的利器。
2. SCI核心架构与寄存器操作精解
2.1 模块总览与数据流路径
S12P的SCI模块是一个全双工、异步的串行通信接口。其核心架构可以清晰地分为发送和接收两条独立的数据路径,它们共享同一个波特率发生器。这种设计允许同时进行收发操作,互不干扰。
从数据流角度看,发送路径始于CPU对SCI数据寄存器(SCIDR)的写入。数据首先被存入SCIDR这个发送缓冲器,当发送移位寄存器空闲时,数据从SCIDR自动加载到发送移位寄存器中。随后,在波特率时钟的驱动下,移位寄存器将数据位、连同自动添加的起始位(逻辑0)和停止位(逻辑1),逐位从TXD引脚移出。接收路径则相反:RXD引脚上的串行数据流被接收移位寄存器在内部波特率时钟同步下采样并移入。当一个完整的帧(包括起始位、数据位、停止位)接收完毕后,数据部分会被自动传输到SCIDR(此时作为接收缓冲器),供CPU读取。
模块的灵活性通过一系列控制寄存器(SCICR1, SCICR2)和状态寄存器(SCISR1, SCISR2)来配置和监控。例如,你可以选择8位或9位数据格式、奇偶校验、设置唤醒方式等。状态寄存器中的标志位,如TDRE(发送数据寄存器空)和RDRF(接收数据寄存器满),是驱动中断或轮询程序的关键。
注意:虽然发送和接收缓冲器在物理上可能是独立的,但它们在内存映射中共享同一个地址(SCIDRL,以及可选的SCIDRH)。CPU写入时访问的是发送缓冲器,读取时访问的是接收缓冲器。这是许多微控制器UART的典型设计,编程时需特别注意。
2.2 数据寄存器(SCIDRH/L)的“双面”操作
数据寄存器是CPU与SCI模块交换数据的门户,其操作因数据格式(8位或9位)而有细微差别,这也是容易出错的地方。
SCIDRL(低字节寄存器)是必须访问的。在8位数据格式(M=0)下,它包含了全部的8位数据(T7:T0用于发送,R7:R0用于接收)。操作非常简单:写数据到SCIDRL即准备发送,从SCIDRL读取即获取接收到的数据。
当配置为9位数据格式(M=1)时,第9位数据(即bit 8)存放在SCIDRH(高字节寄存器)的特定位置。对于发送,第9位是T8位;对于接收,第9位是R8位。
这里有一个至关重要的操作顺序要求,尤其是在使用8位宽度的写指令(如C语言中对8位指针的赋值)时:必须先写SCIDRH(设置T8),再写SCIDRL(设置T7:T0)。这是因为硬件在检测到对SCIDRL的写入操作时,会认为一个完整的9位数据已经准备就绪,随即触发从缓冲器到发送移位寄存器的数据传输。如果先写低字节,后写高字节,那么在你写入高字节之前,一个不完整的(T8为旧值或未定义)9位数据可能已经被加载并开始发送,导致通信错误。
// 示例:发送一个9位数据,其中数据值为0x55,第9位(T8)为1 volatile uint8_t *SCIDRH = (uint8_t *)0x00C7; // 假设SCIDRH地址 volatile uint8_t *SCIDRL = (uint8_t *)0x00C8; // 假设SCIDRL地址 *SCIDRH = 0x40; // 设置T8位为1 (SCIDRH bit6)。注意:其他位应保持或写为0。 *SCIDRL = 0x55; // 写入低8位数据。此操作会触发数据传输。对于接收,顺序则不重要,因为数据是硬件同时锁存的。读取时,通常先读SCISR1获取状态(如RDRF),然后可以按任意顺序读取SCIDRH和SCIDRL来获得完整的9位数据。
实操心得:在固件中,建议将SCIDR的访问封装成函数。对于9位数据发送,函数内部应实现一个“原子性”操作,确保高、低字节的写入是连续的,且中间不会被中断打断。可以使用关中断再开中断的方式,或者确保两次写操作在单条指令或不可分割的指令序列中完成(具体取决于编译器优化和总线特性)。此外,手册中提到,如果T8值与前一次发送相同,则无需重写。在连续发送多个具有相同第9位(例如,用于区分地址帧和数据帧)的数据时,可以优化性能,只需在需要改变T8时才写SCIDRH。
2.3 波特率生成:精度与误差计算
SCI的通信速率由波特率发生器决定。它是一个13位的模数计数器(SBR[12:0]),通过对总线时钟(Bus Clock)进行分频来产生波特率时钟。
其计算公式为:SCI Baud Rate = Bus Clock / (16 * SBR[12:0])其中,SBR[12:0]是写入波特率寄存器(SCIBDH和SCIBDL)的值,范围1-8191(值为0时禁用发生器)。
为什么是16倍?这是异步通信采样精度的经典设计。接收器在每个位周期内会对RXD引脚进行16次采样(RT1到RT16),通过取中间样本(如RT8, RT9, RT10)的值来判定该位是0还是1。这极大地增强了抗噪声能力和对波特率微小偏差的容忍度。
选择SBR值就是计算最接近目标波特率的整数分频系数。例如,总线时钟为25MHz,目标波特率为9600bps:
计算所需SBR = Bus Clock / (16 * Desired Baud Rate) = 25,000,000 / (16 * 9600) ≈ 162.76 取整 SBR = 163 实际波特率 = 25,000,000 / (16 * 163) ≈ 9585.9 bps 误差 = (9585.9 - 9600) / 9600 * 100% ≈ -0.147%这个误差(-0.147%)在异步通信允许的范围内(通常要求<3%)。手册中的表格提供了更多计算示例。关键是要意识到,由于是整数分频,绝对精确的波特率几乎不可能达到。误差必须被控制在收发双方时钟累积容差范围内,否则会导致帧错误。在高速或长距离通信时,需要更仔细地计算和选择晶振频率。
注意事项:SCIBDH和SCIBDL是分开的8位寄存器,但写入时需要将它们视为一个16位寄存器来操作。手册特别指出,单独写入SCIBDH是无效的。安全的做法是,在更改波特率时,先写SCIBDH(高字节),紧接着写SCIBDL(低字节)。有些开发环境或库函数可能会提供一次性的32位或16位写操作来简化这个过程。
3. 红外(IrDA)编解码子模块详解
3.1 IrDA物理层与硬件集成原理
红外数据协会(IrDA)的物理层规范定义了一种半双工的红外通信方式。其核心思想是使用窄光脉冲代表逻辑‘0’,无脉冲代表逻辑‘1’。这种归零(RZI)编码方式,相比持续发光的编码,能显著降低红外LED的功耗。
S12P SCI模块的巧妙之处在于,它在标准SCI数据路径上集成了一个红外编解码子模块。当使能红外功能(IREN=1)后,数据流在进出芯片引脚前会经过一次“变换”。
- 发送路径:从发送移位寄存器出来的标准NRZ(不归零)码(0为低电平,1为高电平)进入红外发送编码器。编码器将每个‘0’位转换成一个窄脉冲,而‘1’位则保持无脉冲(低电平)。这个窄脉冲的宽度是可编程的,为位周期的1/32, 1/16, 3/16或1/4,以适应不同IrDA速度规范(如IrDA 1.0对应3/16周期脉冲)。
- 接收路径:从外部红外接收头(通常由光电二极管和放大比较器组成)来的信号,是已经过解调的红外脉冲序列(窄脉冲代表‘0’)。这个信号进入红外接收解码器。解码器的任务是将这些窄脉冲“拉伸”回标准的位宽,还原成NRZ码,再送给SCI的接收移位寄存器进行常规的异步帧解析。
这种硬件集成方案的优势是巨大的。开发者无需用软件定时器去精确生成或检测微秒级的窄脉冲,也无需处理复杂的边沿检测和脉冲宽度判定。只需配置几个寄存器,SCI模块就能自动完成IrDA物理层的所有繁重工作,CPU只需像操作普通串口一样读写数据即可。
3.2 发送编码器与接收解码器配置
红外子模块的配置主要涉及两个控制位和两个时钟源:
- 使能位 IREN:位于某个控制寄存器中(需查具体数据手册),置1使能整个红外编解码功能。
- 脉冲宽度选择 TNP[1:0]:这两个位选择发送窄脉冲的宽度,对应位周期的1/4, 3/16, 1/16或1/32。选择需要符合目标IrDA模式的标准。
- 极性控制 TXPOL/RXPOL:分别控制发送和接收脉冲的极性。有些外部的IrDA收发器模块(如TFDU4101)期望的是低电平有效的脉冲。通过设置TXPOL=1,可以让硬件发送低电平窄脉冲(代替默认的高电平脉冲)。同样,RXPOL用于匹配接收信号的极性。重要:当同时使用LIN碰撞检测功能时,TXPOL和RXPOL必须设置为相同的值,否则碰撞检测逻辑会误判。
红外子模块的时钟来自SCI内部的R16XCLK和R32XCLK,它们分别是波特率16倍和32倍的内部时钟。编码器利用这两个时钟来生成精确宽度的窄脉冲。例如,要生成3/16位周期的脉冲,编码器可能会使用R16XCLK计数3个周期。
配置示例(伪代码):
// 假设寄存器位定义 SCI_CR3 |= (1 << IREN); // 使能红外功能 SCI_CR3 |= (0b01 << TNP0); // 设置脉冲宽度为3/16位周期 (根据手册具体位域调整) SCI_CR2 |= (1 << TXPOL) | (1 << RXPOL); // 设置脉冲极性为低有效,以匹配常见IrDA收发器 // 然后像配置普通SCI一样,设置波特率、数据格式等实操心得:硬件红外支持极大简化了开发,但外围电路同样关键。发送端需要足够的电流驱动红外LED,通常需要三极管或专用驱动芯片。接收端必须使用集成的IrDA接收器(如HSDL/Vishay的系列产品),它们内部包含了光电二极管、放大器和带载波调制的滤波器,能输出干净的数字信号给MCU的RXD引脚。确保你的PCB布局中,红外收发器靠近MCU,且信号线远离噪声源。此外,红外通信是半双工的,你的应用层协议需要处理好收发切换,避免冲突。
4. LIN总线协议支持功能剖析
4.1 帧间隔检测与唤醒功能
LIN(Local Interconnect Network)是一种用于汽车车身控制的低成本串行网络协议。S12P SCI模块提供了几项针对LIN协议的硬件辅助功能,减轻了CPU的负担。
第一项是帧间隔(Break)检测。LIN帧以一个特殊的“帧间隔”字段开始,它由至少13位(对于标准SCI是10或11位,但LIN要求更长)的显性电平(逻辑0)组成,后跟一个同步间隔(逻辑1)。这个长于普通数据的“全0”序列,是LIN帧的标识。
标准SCI在收到10/11个连续0时,会将其识别为一个Break字符,并设置帧错误(FE)标志。但LIN需要更精确和可靠的检测。S12P SCI增强的Break检测功能(通过BKDFE位使能)提供了更干净的硬件支持。当BKDFE=1时:
- 检测到Break字符会设置独立的Break检测中断标志(BKDIF),而不会设置RDRF(接收数据寄存器满)标志。
- 这意味着Break不会作为一个普通数据字节进入接收缓冲区,避免了软件去区分Break和异常数据0x00的麻烦。
- 它也不会触发由RDRF产生的接收中断,而是可以配置由BKDIF产生一个专用于LIN帧头检测的中断。
这使得LIN从节点可以高效地在休眠中被Break唤醒,并立即准备接收紧随其后的同步场和标识符场,无需软件去解析一长串0并判断其长度。
4.2 位级碰撞检测机制
LIN是一种单主多从的网络,主节点控制通信,从节点只在被寻址时回复。但在异常情况下,可能出现多个节点同时发送的“碰撞”。S12P SCI的LIN发送碰撞检测功能可以在位级别及时发现这种错误。
其原理如图11-18所示:在发送数据的同时,模块会通过一个同步器实时监听总线(RXD引脚)上的实际电平。在发送每一位的特定采样点(由BERRM[1:0]位配置,例如在位的中间时刻),硬件会比较发送移位寄存器即将输出的值和从总线采样回来的值。
如果两者不匹配,说明总线上有其他节点正在驱动一个相反的电平,发生了碰撞。一旦检测到碰撞:
- 硬件会立即中止当前字节的发送。
- 将下一位置为显性电平(逻辑0,除非TXPOL反转)以尝试“赢得”总线(这是CAN/LIN总线的典型行为,显性电平覆盖隐性电平)。
- 丢弃发送缓冲区中尚未送出的字节。
- 置位传输完成标志(TC)和发送数据寄存器空标志(TDRE),让软件知道发送已结束(尽管是异常结束)。
- 置位位错误中断标志(BERRIF),并停止一切后续发送,直到软件清除BERRIF标志。
这个功能对于开发可靠的LIN从节点驱动至关重要。它防止了在发生碰撞时,节点还在持续发送数据,从而造成总线持续阻塞。软件在BERRIF中断服务程序中,可以执行错误恢复流程,例如后退重试或报告错误。
配置示例(伪代码):
// 使能LIN相关功能 SCI_BDH = ...; // 设置波特率 (LIN常用19200 bps) SCI_CR1 |= (1 << BKDFE); // 使能增强Break检测 SCI_CR2 |= (0b01 << BERRM0); // 配置碰撞检测采样点 (例如,10b或01b,具体见手册) SCI_CR2 |= (1 << BERRIE); // 使能位错误中断 // 确保TXPOL和RXPOL设置一致 if(using_inverted_polarity) { SCI_CR2 |= (1 << TXPOL) | (1 << RXPOL); }注意事项:碰撞检测功能在标准UART通信中通常是不需要的,甚至可能引发误判(例如在开漏总线加上拉电阻的配置中,节点发送‘1’(释放总线)时,采样回来的也是‘1’,这被认为是匹配的)。因此,仅在用于LIN通信时才应使能BERRM。同时,如手册强调,启用此功能时,TXPOL和RXPOL必须设为相同值,否则比较逻辑会因极性颠倒而一直报错。
5. 数据格式、发送与接收的深入实践
5.1 帧结构、9位数据与奇偶校验
SCI的帧结构是异步通信的基石:1个起始位(低电平) + 8/9个数据位(LSB先发) + 1个停止位(高电平)。可选的奇偶校验位会占用第9位(如果使能了奇偶校验且为8位数据格式)或替代第9位数据(如果为9位数据格式)。
9位数据模式(M=1)有其特殊用途。除了可以传输真正的9位数据外,它常被用于多机通信中的地址/数据标识。例如,可以约定:当第9位(T8/R8)为1时,该帧是地址帧;为0时,是数据帧。从机可以通过硬件(结合唤醒功能)或软件检查第9位,快速判断是否该处理此帧。S12P SCI的硬件唤醒功能(WAKE位)可以直接利用这个特性。
奇偶校验(通过PE位使能,PT位选择奇/偶)是一种简单的检错机制。发送端会根据数据位计算出一个奇偶位,放入帧中;接收端重新计算并比较,若不匹配则设置PE(奇偶错误)标志。在噪声环境中,开启奇偶校验能有效捕获单比特错误。但要注意,它不能纠正错误,且对双比特错误无效。在可靠性要求高的场合,需在应用层增加更复杂的校验(如CRC)。
5.2 发送器操作流程与状态机
发送一个字节并非简单地写入数据寄存器。为了确保可靠、高效的传输,需要遵循一个明确的状态流程,核心是围绕TDRE(发送数据寄存器空)和TC(发送完成)这两个状态标志。
- 初始化配置:配置波特率、数据格式(M)、奇偶校验(PE, PT)等。最后使能发送器(TE=1)。关键点:将TE从0写为1会触发硬件自动发送一个空闲字符(全‘1’)作为前导码,用于同步接收方。
- 启动发送:检查TDRE标志是否为1(表示发送数据寄存器空,可写入新数据)。你可以轮询SCISR1,或者使能发送中断(TIE=1),在中断服务程序里检查。确认后,将数据写入SCIDRH/L。
- 数据转移:写入SCIDRL后,硬件会(在适当的时候,通常是前一帧停止位发送到一半时)将数据从SCIDR缓冲器转移到发送移位寄存器,并自动置位TDRE,表示缓冲器又可接受新数据。此时,移位寄存器开始逐位发送当前帧。
- 发送完成:当移位寄存器中的位全部发送完毕(包括停止位),TC(发送完成)标志会被置位。如果使能了发送完成中断(TCIE=1),会产生中断。TC标志表示“线上已经完全空闲”。
- 连续发送与空闲帧插入:要实现背靠背连续发送,只需在TDRE置位后立即写入下一个数据。如果想在两个消息之间插入一个空闲字符(作为间隔),手册给出了标准流程:在发送完最后一个字节后,等待TDRE置位,然后清除并立即再次置位TE位。这会“排队”一个空闲字符。紧接着写入下一个消息的第一个字节。
避坑指南:关于TE位的操作有两个经典陷阱。第一,不要在发送过程中随意清除TE。如果必须关闭发送器,应等待当前帧发送完成(TC=1)。否则会截断正在发送的帧,导致对方收到帧错误。第二,在排队空闲字符时,必须在当前帧的停止位出现在TXD引脚之前,将TE位重新置1。如果操作太晚,已经写入SCIDR的下一个数据字节可能会丢失。最安全的做法是在TDRE置位后、写入下一字节前,紧挨着执行TE位翻转操作。
5.3 接收器采样、同步与容错机制
接收是异步通信中更复杂的一环,因为发送和接收时钟独立,可能存在微小偏差。S12P SCI的接收器采用了一套精密的采样和同步机制来保证可靠性。
接收器内部有一个运行在16倍波特率下的RT时钟。它的核心任务是:找到起始位,并尽可能地将采样点对准每个数据位的正中间。
- 起始位检测与验证:接收器持续监测RXD线,寻找一个由连续3个‘1’(空闲状态)后跟一个‘0’的下降沿,作为起始位的候选。一旦发现,RT时钟开始计数。在RT3, RT5, RT7时刻对线路进行采样。如果这三个采样点中多数为0,则起始位验证成功;否则,认为是噪声,重置RT时钟,重新搜索。这个过程能有效滤除短暂的毛刺。
- 数据位与停止位采样:起始位验证成功后,接收器在每位周期的RT8, RT9, RT10时刻进行采样,取多数值作为该位的最终值。停止位也在这三个点采样,期望采样到‘1’。如果采到‘0’,则设置帧错误(FE)标志。
- 时钟重新同步:为了补偿收发双方波特率的微小差异,接收器不仅在每个起始位重新同步RT时钟,还在数据帧中检测到从‘1’到‘0’的下降沿时,也会进行重新同步。这大大提升了接收器对波特率偏差的容忍能力。
- 噪声标志(NF):如果在RT3, RT5, RT7或RT8, RT9, RT10的采样中,三个样本值不一致(非全0或全1),NF标志会被置位。这表明该位可能受到噪声干扰,但数据仍按多数表决原则接收。NF是一个警告信号,提示通信质量可能不佳。
手册中11.4.6.5节详细计算了接收器的波特率容差。对于8位数据格式,接收器能容忍发送方波特率慢约4.63%或快约3.75%而不产生帧错误。这给了晶振精度和软件波特率计算一定的裕量。
实操心得:在噪声较大的环境(如汽车、工业环境)中,除了依赖硬件的NF和FE标志,软件层面应增加超时机制和帧校验(如校验和、CRC)。当RDRF置位后,应一次性读取SCISR1(获取NF, FE, PE状态)和SCIDR。因为读取SCIDR可能会清除某些错误标志(取决于具体型号,请查阅参考手册),先读状态寄存器能确保捕获到该帧所有的错误信息。此外,如果使能了奇偶校验,对于出错的帧,即使数据被读取,也应丢弃。
6. 高级功能与调试排错实录
6.1 接收器唤醒与多机通信
在多机通信(一主多从)系统中,让所有从机一直处理所有数据帧是低效的。S12P SCI的接收器唤醒功能允许从机“休眠”其接收器,仅当收到特定地址帧时才被唤醒处理后续数据。
这通过RWU(接收器唤醒)和WAKE(唤醒方式)两个位来控制。
- 设置RWU=1:接收器进入待机状态。它仍会接收数据并加载到SCIDR,但不会置位RDRF标志,也不会产生接收中断。这避免了不必要的CPU开销。
- 唤醒方式(WAKE位):
- 空闲线唤醒(WAKE=0):当RXD引脚检测到连续10/11位(取决于M)的高电平(空闲状态)时,硬件自动清除RWU,唤醒接收器。这种方式要求消息之间用较长的空闲时间隔开,第一个帧为地址帧。
- 地址标志唤醒(WAKE=1):当接收到一个第9位(bit 8)为1的数据帧时,硬件自动清除RWU。这种方式下,地址帧的第9位必须为1,数据帧的第9位为0。这是更高效、更常用的多机通信方式。
操作流程示例(地址标志唤醒):
- 所有从机初始化SCI,设置M=1(9位格式),WAKE=1,并置位RWU=1进入待机。
- 主机发送一个地址帧,其中数据字节为从机地址,第9位(T8)设置为1。
- 所有从机都会收到此帧。由于是9位格式且第9位为1,所有从机的硬件都会自动清除RWU(唤醒),并将此地址帧存入SCIDR(RDRF置位)。
- 每个从机的软件中断/轮询读取SCIDR,比对地址。地址匹配的从机保持RWU=0,准备接收后续数据帧(第9位为0)。地址不匹配的从机,软件立即重新置位RWU=1,返回待机状态,忽略后续数据帧。
6.2 常见问题排查与调试技巧
在实际开发中,SCI通信问题非常普遍。以下是一个基于S12P SCI特性的排查清单:
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 完全无通信 | 1. 引脚配置错误(未设置为SCI功能)。 2. 波特率设置错误(双方相差巨大)。 3. 发送器未使能(TE=0)。 4. 硬件连接问题(线接反、断开)。 | 1. 检查端口控制寄存器,确保TXD/RXD引脚复用功能已开启。 2. 用示波器测量TXD引脚,确认是否有任何波形输出。计算双方波特率设置值,确保匹配。 3. 检查SCICR2寄存器,确认TE位已置1。 4. 检查硬件连接,确认共地。 |
| 能发送,不能接收 | 1. 接收器未使能(RE=0)。 2. 接收中断未使能或中断服务程序(ISR)错误。 3. 对方发送线路或本机接收线路故障。 | 1. 检查SCICR2,确认RE=1。 2. 检查RIE位,并确认中断向量和ISR正确。尝试轮询RDRF标志。 3. 用示波器同时观察本机TXD(确认在发)和RXD(看是否有信号进来)。 |
| 数据错误(乱码) | 1. 波特率微小偏差累积导致帧错误。 2. 数据格式(数据位、停止位、奇偶校验)不匹配。 3. 电气噪声干扰。 4. 9位数据格式下,读写SCIDRH/L顺序错误。 | 1. 检查双方晶振精度,重新计算并校准波特率寄存器的值。查看FE标志是否被置位。 2. 确认双方M、PE、PT位设置一致。 3. 检查NF标志。改善硬件屏蔽、增加滤波电容、使用差分通信(如RS485)代替TTL。 4. 检查发送9位数据时的代码,确保先写SCIDRH,再写SCIDRL。 |
| 红外通信不工作 | 1. 红外功能未使能(IREN=0)。 2. 脉冲宽度(TNP)设置与IrDA模式不匹配。 3. 极性(TXPOL/RXPOL)设置与收发器不匹配。 4. 红外收发器硬件故障或供电不足。 | 1. 确认相关控制寄存器的IREN位已置1。 2. 对于IrDA 1.0 (最高115.2kbps),脉冲宽度应为3/16。 3. 查阅收发器数据手册,确认其输入输出极性,并相应设置TXPOL/RXPOL。 4. 用示波器观察Ir_TXD引脚,应有窄脉冲输出。观察Ir_RXD引脚输入信号是否干净。 |
| LIN通信无法识别帧头 | 1. Break检测未使能或配置错误。 2. 主节点发送的Break长度不足。 3. 从节点未进入休眠(RWU未置位)或唤醒方式错误。 | 1. 确认BKDFE=1,并可能使能BKDIF中断。 2. 确保主节点发送的Break字段至少13位显性电平。用示波器验证波形。 3. 检查从机RWU位,并根据主机的帧结构(空闲唤醒或地址标志唤醒)正确设置WAKE位。 |
调试利器:状态寄存器与示波器。遇到问题时,第一件事是读取SCISR1和SCISR2。FE、NF、PE、OR(溢出)等标志直接指明了硬件层面的错误类型。结合示波器观察TXD/RXD实际波形,可以直观地看到起始位、数据位、停止位是否规整,波特率是否准确,以及红外脉冲是否存在。例如,如果发现停止位为低电平,那一定是FE错误,问题可能出在波特率不匹配或对方发送异常。
关于FIFO与溢出:一些增强型SCI模块带有深度缓冲区(FIFO)。S12P的基本SCI没有FIFO,只有一个字节的缓冲器。这意味着如果CPU没有及时读取已接收的数据(RDRF=1),而下一个帧已经接收完毕,就会发生溢出错误(OR=1),新数据会覆盖旧数据导致丢失。在高速通信或中断响应慢的系统里,必须确保接收中断服务程序足够快,或者使用查询方式时轮询频率足够高。
