MPC823 SCC2 IrDA驱动开发:从协议原理到寄存器配置实战
1. 项目概述与核心价值
在嵌入式系统开发中,实现设备间的短距离、点对点无线数据传输是一个经典需求。红外通信(IrDA)作为一种成熟、低成本、无需许可的解决方案,曾广泛应用于早期的手机、笔记本电脑、打印机以及各类工业手持设备中。其核心魅力在于协议栈相对简单,硬件集成度高,能够实现从几Kb/s到4Mb/s的数据传输。然而,将IrDA协议栈在微控制器上跑通,尤其是涉及到不同速率模式的切换和底层硬件的精确控制,对于许多开发者来说仍是一个不小的挑战。
MPC823作为一款经典的通信处理器,其内置的串行通信控制器(SCC)模块为这类任务提供了强大的硬件支持。SCC2控制器专门支持IrDA协议,能够处理从物理层脉冲调制到数据链路层成帧的绝大部分工作,极大地解放了主CPU。但手册上的寄存器列表和初始化步骤往往显得零散和晦涩,缺乏一个从“为什么”到“怎么做”的连贯视角。我在实际项目中多次配置MPC823的SCC2进行IrDA通信,从低速的115.2Kb/s遥控器协议到高速的4Mb/s文件传输都踩过坑。本文将基于这些实战经验,为你彻底拆解SCC2的IrDA模式,不仅告诉你每个寄存器应该填什么,更会解释其背后的设计逻辑和配置时的关键考量,目标是让你能独立完成一个稳定可靠的IrDA通信驱动。
2. IrDA协议栈与SCC2的硬件适配原理
要正确配置SCC2,首先必须理解IrDA协议栈如何映射到硬件控制器上。IrDA协议是一个分层结构,而SCC2的巧妙之处在于,它并非为IrDA量身定做一套全新逻辑,而是复用了其已有的HDLC和透明传输控制器,通过特定的编码/解码模块(Encoder/Decoder)来适配红外物理层的特殊要求。
2.1 三种速率模式的本质区别
手册中提到了低、中、高三种速率模式,其根本区别在于数据链路层帧格式和物理层调制方式的不同,这直接决定了SCC2内部需要以何种“角色”工作。
低速模式(Up to 115.2 Kb/s): 其数据链路层基于异步HDLC(Async HDLC)。你可以把它理解为一个“串口加强版”。每个字节(8位数据)被包裹在一个异步帧中(包含起始位、停止位),然后整个数据块再用HDLC的标志位(0xC0为开始,0xC1为结束)封装。物理层采用3/16调制,即一个比特位时间内,红外LED只点亮3/16的时间来表示逻辑‘0’,熄灭表示逻辑‘1’。这种方式的占空比低,功耗小,但速率受限。在SCC2中,你需要将通道配置为“异步HDLC模式”,然后通过IRMODE寄存器启用红外编解码器。
中速模式(0.576 Mb/s 或 1.152 Mb/s): 数据链路层切换到同步HDLC。这才是标准的HDLC帧格式,使用0x7E作为帧头帧尾标志,支持地址场、控制场和CRC校验。物理层采用1/4调制,脉冲宽度为比特周期的1/4。此时,SCC2通道工作在标准的“同步HDLC模式”,红外编解码器负责将NRZ(不归零)编码的HDLC比特流转换为1/4调制的红外脉冲。
高速模式(4.0 Mb/s): 这是变化最大的。数据链路层基于透明传输模式。SCC2在此模式下不再处理任何特定的帧结构(如HDLC标志),而是将数据比特流原样传递给红外编解码器。物理层采用4PPM(四脉冲位置调制)。这是将每2个比特(一个符号)编码为一个4“片”(Chip)的序列,其中只有一个“片”是亮脉冲。例如,比特对“00”编码为“1000”。这种方式极大地提高了频谱效率和抗干扰能力。此时,你需要将SCC2配置为“透明传输模式”。
理解这个映射关系至关重要:低速→异步HDLC,中速→同步HDLC,高速→透明传输。这意味着,除了配置红外特有的寄存器(IRMODE, IRSIP),你大部分工作是在配置对应底层协议模式的SCC2参数RAM、缓冲描述符和模式寄存器。
2.2 红外串行交互脉冲(SIP)的作用与实现
这是一个容易忽略但至关重要的细节,尤其是在高速模式下。SIP是一个周期性的、特定波形的红外脉冲,其作用是抑制潜在的、工作在低速模式下的其他红外设备,防止它们误认为信道空闲而发起通信,从而干扰正在进行的高速连接。
手册中给出了SIP的波形:一个1.6μs的低电平后跟一个8.7μs的高电平(或根据极性设置反转)。这个波形不是随意的,它模拟了一个低速模式的起始位(低电平)和部分数据位,足以让低速接收器进入“忙”状态。
SIP的生成由IRSIP寄存器控制。你需要配置两个关键字段:
- SHL(高电平长度)和SLL(低电平长度): 以比特率时钟为单位,定义SIP脉冲的高低电平宽度。例如,对于4Mb/s,一个比特周期是250ns。要产生1.6μs低电平,需要
1.6μs / 250ns = 6.4,取整为6个时钟周期。8.7μs高电平则需要约35个时钟周期。实际值需要根据时钟精度调整,手册示例中给出的是0x031c(SHL=3, SLL=1c?这里需注意手册示例值的具体计算,它可能与内部时钟分频有关)。 - 触发方式: 通过GS(软件触发)或TS(Timer 2触发)位选择。通常使用Timer 2定时触发,以确保持续、周期性的发送。你需要正确配置Timer 2的周期(例如500ms),并设置TS位。
> 注意:如果忽略了SIP配置,在存在低速IrDA设备的复杂环境中,你的高速通信可能会被频繁打断,出现难以排查的间歇性连接失败。
3. SCC2 IrDA模式核心寄存器详解与配置策略
脱离了具体寄存器配置的协议讲解都是纸上谈兵。下面我们深入到最核心的几个寄存器,看看如何将理论转化为硬件能理解的数值。
3.1 红外模式寄存器(IRMODE)
这是IrDA功能的“总开关”,地址为(IMMR & 0xFFF0000) + 0xA38。它是一个16位寄存器,每个比特位都至关重要。
| 位域 | 名称 | 功能描述与配置策略 |
|---|---|---|
| [15:12] | PA | 前导码数量(仅高速模式有效)。在高速4PPM模式下,数据帧前需要发送一串特殊的同步符号(PA,Preamble)用于接收端比特同步。通常设置为0000(16个前导码),这是最可靠的配置。设置为0001(1个前导码)可以减小开销,但可能影响同步稳定性。 |
| [11:8] | Reserved | 保留位,必须写0。 |
| 7 | RXP | 接收极性。0 = 高电平有效(脉冲为高表示逻辑0);1 = 低电平有效(脉冲为低表示逻辑0)。这需要与你使用的红外收发器硬件匹配!常见的红外接收管在收到红外光时输出低电平,因此通常需要设置RXP=1(低有效)。 |
| 6 | TXP | 发送极性。0 = 高电平有效;1 = 低电平有效。同样需匹配硬件驱动电路。通常与RXP设置相同。 |
| [5:4] | DCR | DPLL时钟比率(仅高速模式有效)。用于设置内部数字锁相环(DPLL)的时钟速率。对于4Mb/s高速模式,必须设置为00(12倍比特率时钟)。这是产生稳定4PPM调制所必需的。 |
| 3 | FD | 全双工。0 = 发送期间禁止接收(半双工);1 = 允许同时收发(全双工)。IrDA物理层是半双工的(同一时刻只能发或收),因此此位在大多数实际IrDA应用中应设为0。仅在特殊的环回测试(LOOP=1)时,才需要设为1。 |
| 2 | LOOP | 环回模式。0 = 正常操作;1 = 内部环回。调试利器!设置此位后,SCC2的发送端输出直接连接到接收端输入,无需外部物理连接。可用于快速验证驱动代码和寄存器配置是否正确,特别是发送��接收极性设置。 |
| [1:0] | MOD | 红外模式。这是模式选择的核心。00 = 低速;01 = 中速;10 = 高速;11 = 保留。 |
| 8 | EN | 使能红外。0 = 禁用红外编解码器;1 = 使能。关键时序:此位必须在SCC2的发送器(ENT)和接收器(ENR)关闭(GSMR_L中ENT和ENR为0)的情况下才能修改。 |
配置心得: 在初始化序列中,IRMODE寄存器通常是在配置完GSMR_L(但未开启ENT/ENR)和PSMR之后,最后开启ENT/ENR之前写入。对于低速模式,写入0x0001(EN=1, MOD=00);对于中速模式,写入0x0003(EN=1, MOD=01);对于高速模式,写入0x0005(EN=1, MOD=10, DCR=00)。如果你的硬件是低有效,还需要设置RXP和TXP位。
3.2 红外串行交互脉冲控制寄存器(IRSIP)
此寄存器控制SIP的生成,地址为(IMMR & 0xFFF0000) + 0xA3A。
| 位域 | 名称 | 功能描述与配置策略 |
|---|---|---|
| [15:10] | SLL | SIP低电平长度。定义脉冲中低电平部分的持续时间,单位为比特率时钟周期。需要根据目标速率计算。例如,对于4Mb/s,要产生约1.6μs低电平,计算周期数 = 1.6μs / (1/4MHz) = 6.4 -> 取整为6,即二进制000110。 |
| [9:4] | SHL | SIP高电平长度。定义脉冲中高电平部分的持续时间,单位同上。例如,8.7μs对应约35个周期,即二进制100011。 |
| 3 | TS | 定时器触发。1 = 使能Timer 2到期时自动生成SIP。这是推荐方式,可实现无人值守的周期性发送。 |
| 2 | GS | 软件触发。写1立即产生一个SIP(仅在信道空闲时)。该位只写,读始终为0。可用于连接建立时的初始握手。 |
| [1], [0] | Reserved | 保留位,必须写0。 |
> 注意:手册中的示例值(如高速模式的0x031c)是十六进制。你需要将其拆分为[SLL][SHL][TS][GS][Reserved]来理解。例如,0x031c =0000 0011 0001 1100。假设高6位是SLL,接着6位是SHL,那么可能需要根据位域定义重新审视。根据手册描述,SLL和SHL各占6位,那么0x031c可能表示SLL=0x03,SHL=0x1c?这里存在歧义,务必以你所用芯片版本的数据手册为准,并建议通过逻辑分析仪抓取SIP波形来验证配置。
3.3 通用SCC模式寄存器(GSMR_L/H)与协议特定模式寄存器(PSMR)
这两个寄存器是SCC2的“大脑”,决定了其底层工作模式。对于IrDA:
- 低速模式: GSMR_L的MODE字段需设置为异步HDLC。PSMR寄存器用于配置异步HDLC的具体参数,如帧间标志、CRC类型等。
- 中速模式: GSMR_L的MODE字段需设置为同步HDLC。PSMR用于配置同步HDLC参数,如标志数量、CRC等。
- 高速模式: GSMR_L的MODE字段需设置为透明模式。此时,GSMR_H中的TTX和TRX位必须置1以启用全透明收发。PSMR在透明模式下不使用。
一个极易出错的细节: 在GSMR_L中,使能发送器(ENT)和接收器(ENR)的位,必须最后设置。标准的初始化流程是:先配置所有其他寄存器(包括IRMODE),最后再写一次GSMR_L,仅将ENT和ENR位置1,其他位保持不变。这可以避免在配置过程中通道进入不可预测的状态。
4. 三种速率模式的完整初始化流程与代码剖析
手册提供了初始化序列,但步骤间缺乏解释。我将结合自己的实践,为你梳理出一个清晰的、可操作的流程,并附上关键步骤的C语言伪代码。
4.1 低速IrDA模式初始化流程
低速模式本质是异步HDLC加红外编码。初始化序列围绕SCC2的异步HDLC功能展开。
系统与端口基础配置:
- 配置系统数据总线的仲裁ID(SDCR)。
- 配置端口A(或C)的引脚功能,将TXD2和RXD2引脚复用到SCC2。如果使用NMSI(非复用串行接口),这通常意味着设置PAPAR相应位为1(功能引脚),PADIR为0(输入方向)。
- 配置一个波特率发生器(BRG)为SCC2提供时钟。计算分频比以获得精确的115.2Kb/s或其他目标速率。
SCC2通道路由与模式预置:
- 在串行接口配置寄存器(SICR)中,将上一步配置的BRG时钟路由给SCC2。
- 在GSMR_L中,将MODE字段设置为“SCCx Async HDLC”,但保持ENT和ENR为0。
参数RAM与缓冲描述符初始化:
- 在双端口RAM中设置接收和发送缓冲描述符表的基地址(RBASE, TBASE)。
- 通过CPCR(CPM命令寄存器)发送
INIT RX AND TX PARAMS命令,初始化SCC2的参数RAM。 - 配置RFCR/TFCR(功能码寄存器)、MRBLR(最大接收缓冲长度)。
- 关键步骤: 在参数RAM中,设置BOF(帧开始标志)为
0xC0,EOF(帧结束标志)为0xC1,ESC(转义字符)为0x7D。这是IrDA低速模式与标准异步HDLC的唯一区别。 - 初始化具体的接收(RX)和发送(TX)缓冲描述符,设置数据缓冲区指针、长度和状态(如R=1表示发送就绪,E=1表示接收空)。
中断与事件寄存器配置:
- 清除SCC事件寄存器(SCCE)。
- 配置SCC掩码寄存器(SCCM),使能所需的中断(如发送完成、接收完成)。
启用红外与最终启动:
- 写入PSMR寄存器,配置HDLC参数(如CRC)。
- 写入IRMODE寄存器,例如
IRMODE = 0x0001;(使能红外,低速模式)。 - 最后一步: 再次写入GSMR_L,将ENT和ENR位置1,正式启动收发器。
// 伪代码示例:低速IrDA关键配置步骤 void SCC2_IrDA_LowSpeed_Init(void) { // 1. 引脚复用配置 PAPAR |= (1 << 13) | (1 << 12); // TXD2, RXD2 作为功能引脚 PADIR &= ~((1 << 13) | (1 << 12)); // 方向为输入(由SCC控制) // 2. 波特率生成器配置 (例如,系统时钟50MHz,目标115200) // BRG分频值 = (CLK / (16 * 波特率)) - 1 uint16_t brg_val = (50000000 / (16 * 115200)) - 1; BRGC2 = brg_val; // 假设BRGC2对应SCC2 // 3. 时钟路由 SICR &= ~((0x7 << 某位) | (0x7 << 某位)); // 清除R2CS, T2CS SICR |= (0b001 << R2CS_Shift) | (0b001 << T2CS_Shift); // 连接到BRG2 // 4. 设置参数RAM基址 SCC2_PRAM->rbase = (uint32_t)&RxBD[0]; SCC2_PRAM->tbase = (uint32_t)&TxBD[0]; // 5. 发送初始化参数命令 CPCR = 0x00xx; // 写入命令码,启动SCC2参数初始化 // 6. 配置异步HDLC参数RAM SCC2_PRAM->rfcr = 0x18; // 正常操作,8位数据 SCC2_PRAM->tfcr = 0x18; SCC2_PRAM->mrblr = 256; // 最大接收缓冲长度 SCC2_PRAM->bof = 0xC0; // IrDA低速开始标志 SCC2_PRAM->eof = 0xC1; // IrDA低速结束标志 SCC2_PRAM->esc = 0x7D; // 7. 初始化缓冲描述符 RxBD[0].addr = (uint8_t*)&RxBuffer[0]; RxBD[0].status = BD_EMPTY | BD_WRAP; // E=1, W=1 TxBD[0].addr = (uint8_t*)&TxBuffer[0]; TxBD[0].status = BD_READY | BD_WRAP; // R=1, W=1 TxBD[0].length = 0; // 8. 清除事件,使能中断 SCC2_EVENT_REG = 0xFFFF; // 写1清除所有事件 SCC2_MASK_REG = 0x001A; // 使能TXE, RXF, TXB中断 // 9. 配置GSMR_L为异步HDLC模式,但不使能收发 GSMR2_L = (GSMR2_L & ~0x0000000F) | 0x0000000A; // 假设0xA是Async HDLC模式码 // 10. 配置PSMR PSMR_SCC2 = 0x1000; // 示例:2个开始标志,1个结束标志,CCITT CRC // 11. 启用红外模式(低速) IRMODE_REG = 0x0001; // EN=1, MOD=00 (低速) // 12. 最后,使能SCC2收发器 GSMR2_L |= (1 << ENT_BIT) | (1 << ENR_BIT); }4.2 中速IrDA模式初始化流程
中速模式基于同步HDLC,流程与标准HDLC配置高度相似,但需要额外注意时钟配置和SIP。
- 基础配置与时钟: 与低速类似,但时钟频率更高(0.576或1.152MHz)。通常使用外部时钟引脚(如CLK3)提供精确时钟。需要配置端口A将CLK3引脚功能启用,并在SICR中将SCC2的收发时钟源(R2CS, T2CS)指向CLK3。
- 参数RAM配置: 使用同步HDLC的参数。需要设置CRC预设值(CRC_P)和常量(CRC_C)为CRC32的值(0xFFFFFFFF和0xDEBB20E3),最大帧长(MFLR),接收帧阈值(RFTHR)等。
- GSMR_H/L配置: GSMR_L的MODE字段设置为同步HDLC。需要特别注意DIAG(诊断模式)字段,通常设置为00(正常)。对于红外,可能需要设置RINV和TINV位来反转信号。
- IRSIP寄存器配置: 这是中速模式特有的关键步骤。需要根据比特率计算并写入SHL和SLL。手册示例:对于1.152Mb/s,写入
0x0108;对于0.576Mb/s,写入0x0084。如果使用Timer 2触发SIP,则需要设置TS位,并配置TMR2寄存器。 - 启用红外与启动: 写入IRMODE寄存器(例如
0x0003使能中速模式),最后使能ENT和ENR。
> 注意:中速和高速模式对时钟的精度和稳定性要求远高于低速模式。务必确保提供给SCC2的时钟信号(无论是外部输入还是内部BRG产生)抖动足够小,否则会导致解码错误和连接不稳定。
4.3 高速IrDA模式初始化流程
高速模式基于透明传输,配置思路有所不同。
- 模式选择: 在GSMR_H中,必须将TTX(透明发送)和TRX(透明接收)位置1。同时,根据是否使用外部同步信号,配置SYNL、CDP、CTSP等字段。如果使用内部同步模式,还需配置数据同步寄存器(DSR)。
- 参数RAM配置: 透明模式的参数RAM更简单,主要关注CRC_P和CRC_C(对于CRC32,同样是0xFFFFFFFF和0xDEBB20E3)。MRBLR可以根据帧长设置。
- 缓冲描述符: 透明模式的缓冲描述符字段意义与HDLC模式略有不同。注意L(帧最后)位和TC(发送CRC)位的用法。
- IRSIP与IRMODE: 高速模式必须配置SIP。写入计算好的IRSIP值(如手册示例0x031c)。IRMODE寄存器需设置为高速模式(
MOD=10),并设置DCR=00,PA(前导码数量)通常为0000(16个)。 - 最终启动: 最后写入GSMR_L使能ENT和ENR。
// 伪代码示例:高速IrDA关键配置(透明模式) void SCC2_IrDA_HighSpeed_Init(void) { // ... 省略引脚、时钟、基址等通用配置 ... // 1. 配置GSMR_H为透明模式 GSMR2_H = 0x00009980; // 示例值:TTX=1, TRX=1, 其他位根据需求设置 // 2. 初始化透明模式参数RAM SCC2_PRAM->crc_p = 0xFFFFFFFF; // CRC32预设 SCC2_PRAM->crc_c = 0xDEBB20E3; // CRC32常量 // 3. 初始化缓冲描述符(透明模式格式) RxBD[0].status = BD_EMPTY | BD_WRAP | BD_INTERRUPT; TxBD[0].status = BD_READY | BD_WRAP | BD_INTERRUPT | BD_LAST | BD_TX_CRC; // 4. 清除事件,使能中断 SCC2_EVENT_REG = 0xFFFF; SCC2_MASK_REG = 0x0013; // 使能TXE, TX, RX中断 // 5. 配置GSMR_L(透明模式,不使能收发) GSMR2_L = 0x00000000; // 示例,TCI等位根据时钟配置 // 6. 配置红外SIP和模式 IRSIP_REG = 0x031c; // 设置SIP波形,Timer2触发需修改 IRMODE_REG = 0x0005; // EN=1, MOD=10 (高速), DCR=00 // 7. 配置Timer2用于周期性SIP触发(如果需要) // TMR2 = ... 计算500ms定时值 ... // 8. 最后使能收发器 GSMR2_L |= (1 << ENT_BIT) | (1 << ENR_BIT); }5. 实战调试技巧与常见问题排查
配置寄存器只是第一步,让IrDA链路稳定工作往往需要细致的调试。以下是我在实际项目中总结的几点核心经验和常见问题解决方法。
5.1 调试工具与手段
- 逻辑分析仪是必需品: 这是调试硬件通信协议的“眼睛”。你需要一个能抓取TXD2和RXD2引脚数字波形的逻辑分析仪。通过它,你可以:
- 验证发送端是否产生了正确的、经过红外编码的脉冲序列(例如,低速下的3/16脉冲)。
- 检查发送和接收的字节数据是否与预期一致。
- 测量比特率是否准确。
- 观察SIP脉冲是否按预期周期发送。
- 充分利用环回模式(LOOP): 在开发初期,强烈建议将IRMODE寄存器的LOOP位置1。这样,你发送的数据会立刻被自己接收。这可以快速隔离问题:如果环回模式下自发自收都失败,那问题肯定在本地配置(寄存器、缓冲描述符、中断服务程序);如果环回成功但对外通信失败,则问题可能出在红外收发器硬件、极性设置或对方设备上。
- 示波器观察红外波形: 逻辑分析仪看到的是编码后的数字信号。要观察真正的红外光脉冲,需要用示波器探头连接到红外发射LED的驱动电路后端(注意共地)。你可以看到符合IrDA物理层规范的、占空比很小的光脉冲。
5.2 常见问题速查表
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 完全无数据收发 | 1. SCC2未使能。 2. 引脚复用错误。 3. 时钟未正确路由。 4. 缓冲描述符未就绪(R/E位未置)。 | 1. 检查GSMR_L的ENT和ENR位是否为1。 2. 用逻辑分析仪确认TXD2/RXD2引脚是否有信号活动。检查PAPAR/PADIR配置。 3. 确认SICR中R2CS/T2CS字段是否正确指向时钟源(BRG或CLKx)。 4. 检查TX BD的R位是否=1,RX BD的E位是否=1。 |
| 能发送,不能接收(或反之) | 1. 收发器硬件故障或方向错误。 2. IRMODE中RXP/TXP极性设置错误。 3. 仅一半通道使能(如只开了ENT没开ENR)。 4. 接收缓冲描述符链表断裂或已满。 | 1. 交换收发器测试,或使用环回模式测试。 2. 根据红外接收管数据手册确认有效电平。尝试反转RXP/TXP。 3. 核对GSMR_L配置。 4. 确保RX BD的W(Wrap)位正确形成环,且当一个BD满后及时为其重新置E=1。 |
| 低速模式通信正常,中/高速失败 | 1. 时钟精度或稳定性不足。 2. SIP未配置或配置错误(中/高速)。 3. 参数RAM模式配置错误(如中速用了异步HDLC参数)。 4. 物理距离或角度超出范围。 | 1. 使用更高精度的外部时钟源。检查BRG计算和输入时钟频率。 2. 用逻辑分析仪抓取TXD2,确认是否有SIP脉冲发出。核对IRSIP寄存器计算值。 3. 确认GSMR_L的MODE字段、PSMR寄存器与目标模式匹配。 4. 中高速IrDA对对准和距离更敏感,确保在几厘米到1米内,且无强光干扰。 |
| 通信间歇性失败,误码率高 | 1. 电源噪声或地线干扰。 2. 红外收发器驱动能力不足或接收饱和。 3. 中断服务程序处理过慢,导致缓冲溢出。 4. SIP干扰或未正确抑制低速设备。 | 1. 为MPC823和红外收发器电路增加去耦电容,确保地平面完整。 2. 检查发射LED的限流电阻,确保光强足够但不至于使接收器饱和。可在接收端加装遮光罩。 3. 优化ISR,尽快取走数据或填充新数据。考虑使用DMA或增加缓冲描述符数量。 4. 确保高速模式下SIP以不大于500ms的间隔持续发送。 |
| 环回模式正常,对接设备失败 | 1. 双方IrDA模式(低速/中速/高速)不匹配。 2. 双方波特率或帧格式不匹配。 3. 红外收发器光学特性不兼容(如波长、视角)。 4. 协议上层(如IrLAP)协商失败。 | 1. 确认双方设备支持的IrDA速率,并尝试固定到最低共同速率(通常是115.2Kb/s)。 2. 用逻辑分析仪对比双方发送的波形,检查起始位、停止位、数据位是否一致。 3. 查阅双方收发器数据手册,确保光学参数匹配。尝试缩短距离并对准。 4. 确保在硬件驱动之上,实现了正确的链路建立和协议协商过程。 |
5.3 初始化序��的黄金法则
- 先静后动: 在所有动态操作(开启收发)之前,完成所有静态配置(寄存器写入)。
- 参数RAM先行: 在使能SCC2通道(
INIT RX AND TX PARAMS命令)之前,务必先设置好RBASE、TBASE等关键参数。 - 缓冲描述符就绪: 在开启接收(ENR)前,至少准备一个空的接收BD(E=1)。在开启发送(ENT)前,如果立即要发送,准备一个就绪的发送BD(R=1)。
- 最后开启收发: ENT和ENR位一定是整个初始化序列中最后被置位的操作。
- 中断及时处理: 在中断服务程序(ISR)中,必须通过写1清除SCCE寄存器中对应的中断事件位,否则会持续产生中断。
配置MPC823的SCC2进行IrDA通信,是一个典型的“细节决定成败”的嵌入式任务。它要求开发者不仅理解IrDA协议本身,更要吃透SCC控制器如何通过不同的底层模式(HDLC、透明)来承载这个协议。从理清三种速率模式的本质差异开始,到精确计算每一个寄存器字段,最后通过环回测试和逻辑分析仪验证,每一步都需要耐心和严谨。当你看到两个设备通过自己编写的驱动,借助那束不可见的红外光稳定地交换数据时,这种对底层硬件掌控带来的成就感,是使用现成模块无法比拟的。希望这篇详尽的拆解,能帮你扫清障碍,顺利点亮你的红外通信链路。
