MPC860 SCC BISYNC模式详解:硬件协议卸载与驱动开发实践
1. MPC860 SCC BISYNC模式:从硬件视角理解经典同步协议
在嵌入式通信的世界里,尤其是在那些对可靠性和确定性要求极高的工业控制、传统金融终端或老旧设备互联场景中,你总会遇到一些“古董级”但生命力顽强的协议。BISYNC(Binary Synchronous Communication,二进制同步通信)就是其中之一。它不像TCP/IP那样灵活,也不像CAN总线那样简洁,但它定义了早期同步串行通信的许多基石,比如面向字符的帧结构、透明传输的DLE填充、以及基于CRC/LRC的块校验。
对于使用MPC860这类经典PowerQUICC处理器的工程师来说,其内置的串行通信控制器(SCC)是处理这类协议的神器。它不是一个简单的UART,而是一个高度可编程的通信协处理器。理解SCC在BISYNC模式下的工作原理,不仅仅是配置几个寄存器那么简单,更是理解如何将复杂的协议状态机、数据流控制和错误处理,高效地卸载到专用硬件上,从而让CPU从繁重的比特级操作中解放出来。今天,我们就抛开手册式的罗列,从实际驱动开发的视角,深入MPC860 SCC的BISYNC模式,聊聊那些命令、寄存器背后的设计哲学,以及如何把它们用“活”。
2. BISYNC协议核心与SCC的硬件卸载思路
在动手写代码之前,我们必须先搞清楚BISYNC协议要求硬件做什么,以及SCC是如何响应这些需求的。这决定了我们配置寄存器的逻辑。
2.1 BISYNC协议要点回顾
BISYNC是一个面向字符的同步协议,这意味着它使用特定的控制字符(如SOH, STX, ETX, ETB, ENQ, DLE等)来界定帧的开始、结束和进行链路控制。其通信基本单元是“块”(Block),一个典型的非透明模式数据块结构如下:
SYN SYN SOH 报头 STX 数据 ETX BCS1 BCS2其中,SYN是同步字符,用于建立和维持位同步。BCS是块校验序列,可以是CRC-16或LRC(纵向冗余校验)。
协议的核心挑战在于“透明传输”。当数据字段中出现了与控制字符(如ETX)相同的二进制码时,接收方会误以为帧结束。BISYNC的解决方案是“字符填充”:在发送端,在每一个与控制字符同码的数据字节前插入一个特殊的DLE(Data Link Escape)字符;在接收端,删除这个DLE。这个过程就是“透明模式”。
2.2 SCC的硬件卸载策略
MPC860的SCC模块为BISYNC协议提供了近乎全硬件的支持,将工程师从繁琐的字节解析中解放出来。它的设计思路非常清晰:
- 自动化的字符处理:硬件自动识别并处理SYN、DLE字符的插入与剥离。在发送下溢(Underrun)时,自动发送SYN或DLE-SYNC对以维持同步,无需CPU干预。
- 基于控制字符表的智能帧结束判定:这是SCC BISYNC模式最精妙的设计之一。你可以预先在内存中定义一个控制字符表(Control Character Table),告诉SCC哪些字符(如ETX, ETB, ENQ)代表块结束。当SCC接收到这些字符时,会根据配置自动关闭当前接收缓冲区(RxBD),并可选择是否期待后续的BCS,以及是否进入搜索(Hunt)模式。这实现了协议感知的DMA。
- 硬件校验计算:SCC内置了CRC-16和LRC计算电路,在收发数据的同时并行完成校验,效率远高于软件计算。
- 基于缓冲描述符(BD)的消息管理:SCC通过CPM(通信处理器模块)与内存中的BD链表交互。CPU只需准备好数据缓冲区,设置好BD,SCC就能自动完成整块数据的搬移、封装、发送,或接收、解析、存储,并通过BD状态位和中断来通知CPU。
理解了这个“硬件状态机+BD管理”的架构,我们再去看那些命令和寄存器,就不会觉得它们是一堆孤立的比特位,而是一个有机整体中控制流程的“开关”和“状态指示器”。
3. 核心命令解析:掌控收发状态机
SCC的命令通过CP命令寄存器(CPCR)下达。它们本质上是让CPU对SCC内部协议状态机进行强干预的手段。用对了是精准控制,用错了就是通信混乱。
3.1 发送命令:精细化的流量控制
发送命令主要管理发送器的启停,这在半双工、需要轮询或应对错误的BISYNC链路中至关重要。
STOP TRANSMIT (停止发送)这是一个“急刹车”命令。发出后,发送器会在最多64个发送时钟周期内停止,不会等待当前缓冲区发送完毕,也不会清空发送FIFO。发送指针TBPTR不会前进,不会访问新的BD。
关键行为:命令执行后,发送器会持续发送SYN-SYN或DLE-SYN对(取决于模式),直到收到
RESTART TRANSMIT命令。这保证了链路同步信号不中断。使用场景:当你需要立即发送一个EOT(传输结束)序列并停止发送时。例如,主站需要打断当前传输,将令牌传递给另一个从站。
GRACEFUL STOP TRANSMIT (优雅停止发送)这是一个“礼貌的告别”。发送器会完成当前帧的发送(如果正在发送),或者如果空闲则立即停止。完成后,会设置SCCE[GRA]事件位。
核心价值:它允许你在帧边界安全地停止,而不是在帧中间粗暴切断。停止后,你可以安全地修改BISYNC发送参数和TxBD,而不会破坏正在进行的通信。TBPTR会指向下一个待发送的BD。使用场景:需要更新发送配置或消息队列时。比如,发送完一个高优先级消息块后,暂停发送,修改后续要发送的数据块,然后重启。
RESTART TRANSMIT (重启发送)让发送器恢复工作。在STOP TRANSMIT、GRACEFUL STOP TRANSMIT、发生发送错误或通道在SCCM中被禁用后,都需要此命令来重启发送流程。
注意:发送器会从当前TBPTR指向的BD恢复发送。这意味着如果你在停止期间修改了BD链表,需要确保TBPTR指向正确的位置。
INIT TX PARAMETERS (初始化发送参数)将发送参数RAM中的所有参数重置为默认状态。必须在发送器禁用时使用。
避坑指南:这是一个破坏性操作,会清空所有发送相关的临时状态。通常只在通道初始化或需要彻底重置发送状态时使用。更常见的命令是
INIT TX AND RX PARAMETERS,它同时重置收发双方。
3.2 接收命令:管理接收流程与同步
接收命令用于控制接收器的同步和缓冲区管理。
ENTER HUNT MODE (进入搜索模式)强制接收器停止当前接收,并进入搜索模式。在此模式下,接收器会持续扫描数据流,寻找DSR寄存器中编程的SYN1-SYN2同步字符序列。
发生了什么:发出此命令后,当前接收缓冲区(RxBD)会被立即关闭,BCS计算器会被重置。接收将从下一个BD继续。使用时机:当接收失去同步时(例如,检测到无法恢复的错误),手动让接收器重新同步。或者,在完成一个块接收并准备接收下一个块时,主动进入搜索模式等待下一个SYN序列。
CLOSE RXBD (关闭接收BD)强制SCC关闭当前正在使用的RxBD(如果正在接收数据),并开始使用下一个BD接收后续数据。如果当前没有在接收数据,则此命令无效果。
灵活运用:这给了软件在特定条件下提前终止一个接收缓冲区的权力。例如,软件检测到协议违规(虽然不是硬件错误),可以主动关闭当前缓冲区,丢弃无效数据,从下一个缓冲区开始接收。
RESET BCS CALCULATION (重置BCS计算)立即重置接收端的BCS累加器。
为什么需要它:在BISYNC中,块校验(BCS)是针对一个完整的数据块计算的。像SOH(报文头开始)这样的控制字符通常不计入数据���的BCS。当接收器识别出SOH时,软件可以通过此命令重置BCS,确保后续的数据字节被正确地纳入新的校验计算中。
INIT RX PARAMETERS (初始化接收参数)与发送版本类似,重置接收参数RAM。同样,必须在接收器禁用时使用。
4. 关键寄存器配置详解:构建协议处理引擎
寄存器是SCC协议处理能力的配置界面。配置不当,硬件支持的优势就无从谈起。
4.1 协议特定模式寄存器 (PSMR)
PSMR是BISYNC模式的大脑,定义了协议处理的根本规则。
| 位域 | 名称 | 描述与配置要点 |
|---|---|---|
| 0-3 | NOS | 发送的SYN同步对数量。定义在两个消息之间或消息之前发送的最小SYN1-SYN2对数量。0000=1对,1111=16对。可以动态修改。经验:在噪声较大的线路上,增加NOS可以给接收端更充分的同步建立时间。 |
| 4-5 | CRC | 校验方式选择。01=CRC-16 (多项式X^16 + X^15 + X^2 + 1),11=LRC(和校验)。关键点:选择CRC-16时,数据字符按8位(无奇偶校验)配置;选择LRC时,收发器会自动处理7位数据字符的奇偶校验(如果未使用透明模式)。PRCRC和PTCRC必须根据选择初始化为全0或全1。 |
| 6 | RBCS | 接收BCS使能。1=使能。这个位可以在接收一个字节的时间内动态置位或清零,以决定当前字节是否参与BCS计算。高级技巧:用于在透明模式下,将DLE控制字符本身排除在BCS计算之外。 |
| 7 | RTR | 接收器透明模式。1=透明模式。在此模式下,SYN、DLE和控制字符只有在领先的DLE字符之后才会被识别。这是实现BISYNC透明传输的关键。注意:即使在LRC模式下,接收器在透明模式时内部仍计算CRC-16,因此PRCRC需初始化为CRC-16的预设值。 |
| 8 | RVD | 数据位反转。1=反转字符比特顺序,先发送/接收最高位(MSB)。用于适配不同设备的数据格式。 |
| 9 | DRT | 发送时禁用接收器。典型BISYNC操作(半双工)不应设置此位。它用于多站共线配置,防止设备收到自己发送的数据。 |
| 12-13 | RPM | 接收器奇偶校验模式。仅在CRC=11(LRC)时有效。00=奇校验,10=偶校验,01=强制低,11=强制高。 |
| 14-15 | TPM | 发送器奇偶校验模式。仅在CRC=11(LRC)时有效。配置同RPM。 |
4.2 控制字符表 (Control Character Table) 与 RCCM
这是实现“协议感知DMA”的核心配置。它位于SCC参数RAM中,是一个由8个16位条目组成的表。
每个条目包含:
- CHARACTER (位8-15): 控制字符的值(如ETX=0x03)。如果使用7位字符加奇偶校验,需要包含校验位。
- B (位1): BCS期待位。1=接收到此字符后,期待后续的1个LRC或2个CRC字节作为BCS。对于ETX、ETB、ITB应置1。
- H (位2): 搜索模式位。1=关闭此缓冲区后,接收器进入搜索模式。对于ETX、ETB通常置1,表示一个块结束,需要重新同步寻找下一个块。
- E (位0): 表结束位。0=此条目有效;1=此条目无效,且其后无有效条目。
RCCM (接收控制字符掩码):用于对CHARACTER进行位掩码比较。RCCM某位为0,则比较时忽略CHARACTER对应位。这允许你定义一个“类”的控制字符。例如,如果你想识别所有最高位为1的控制字符,可以将CHARACTER设为0x80,RCCM设为0x7F。
配置示例:假设我们需要识别ETX(0x03)和ENQ(0x05)。
- 条目1 (CHARACTER1): 0x0306 (CHAR=0x03, B=1, H=1, E=0)
- 条目2 (CHARACTER2): 0x0500 (CHAR=0x05, B=0, H=0, E=0)
- 条目3 (CHARACTER3): 0xXXXX (E=1, 表结束)
- RCCM: 0xFFFF (全位比较,不掩码)
4.3 同步与DLE寄存器 (BSYNC, BDLE)
- BSYNC寄存器:定义SYNC字符的值(位8-15)及其有效性(位0,V)。当V=1且接收器不在搜索模式时,收到的SYNC字符会被丢弃。注意:如果使用7位字符加奇偶校验,SYNC值需包含校验位。
- BDLE寄存器:定义DLE字符的值及其有效性。在透明模式下,当V=1时,接收器会丢弃接收到的DLE字符(及其后续的SYNC),并将其排除在BCS外。这是实现透明传输的硬件基础。
4.4 缓冲描述符 (BD) 的关键位解析
BD是CPU与SCC之间数据交换的契约。理解每个状态位的含义对调试至关重要。
接收BD (RxBD) 关键状态位:
- OV (位14):过载错误。接收FIFO溢出,数据丢失。
- CD (位15):载波检测丢失。在帧接收期间CD信号失效。
- PR (位12):奇偶校验错误。接收到的字符奇偶校验错(仅LRC模式有效)。
- CR (位13):CRC错误。帧CRC校验失败。
- L (位4)/F (位5):帧的最后一个/第一个缓冲区。用于多缓冲区组成一个帧的情况。
发送BD (TxBD) 关键控制位:
- L (位4):消息结束。1=此缓冲区最后一个字符是当前块的最后一个字符。发送完此缓冲区和BCS(如果使能)后,发送器进入并保持在正常模式。
- TB (位5):发送BCS。仅在L=1时有效。1=在缓冲区最后一个字符后发送BCS序列。
- TD (位8):发送DLE。1=在发送此缓冲区数据前,自动发送一个DLE字符。省力技巧:在透明模式下,这省去了为每个需要转义的数据块单独准备一个只包含DLE的缓冲区的麻烦。
- TR (位9):透明模式。1=发送此缓冲区后,发送器进入或保持在透明模式。
- B (位10):BCS使能。1=此缓冲区的字符参与BCS累加计算。
5. 编程实践:一个完整的SCC2 BISYNC初始化流程
手册中的示例代码是很好的起点,但我们需要理解每一步背后的“为什么”。以下是对手册26.17节示例的逐行解读与扩展。
5.1 硬件引脚与时钟配置(步骤1-5)
这部分的目的是将处理器的物理引脚与SCC2的内部功能连接起来。
// 1. 配置端口A:使能TXD2(发送)和RXD2(接收) // PAPAR[12,13]=1: 将PA12, PA13引脚功能分配给SCC2(而非通用IO) // PAODR[12,13]=1: 配置为漏极开路(根据实际硬件电平需求,有时不需要) // PADIR[12,13]=0: 配置为输入方向(对于SCC引脚,通常由模块控制方向) // 注意:具体位需参考MPC860用户手册的内存映射寄存器定义实操心得:引脚复用是PowerQUICC的常见配置。务必查阅手册中Port A的引脚分配表,确认SCC2对应的引脚编号正确。配置PADIR为输入是一个安全做法,让SCC模块在内部管理方向。
// 2. 配置端口C:使能RTS2(请求发送)、CTS2(清除发送)、CD2(载波检测) // PCPAR[14]=1: 将PC14功能分配给CD2 // PCSO[8,9]=1: 将PC8,PC9功能分配给RTS2和CTS2(作为输出) // PCPAR[8,9]=0, PCDIR[8,9,14]=0: 配置相关引脚方向 // 注意:RTS/CTS用于硬件流控,CD用于检测载波,在半双工BISYNC中可能都需要。// 3. & 4. 配置时钟:使用外部时钟CLK3驱动SCC2 // PAPAR[5]=1: 将PA5引脚功能分配给CLK3 // PADIR[5]=0: 配置为输入 // SICR[R2CS]=0b110, SICR[T2CS]=0b110: 将接收和发送时钟源都设置为CLK3 // 这意味着收发使用同一个时钟源,是典型的同步通信配置。// 5. 连接SCC2到NMSI(非复用串行接口) // SICR[SC2]=0: 选择NMSI模式,而非TDM或透明模式。5.2 参数RAM与缓冲描述符初始化(步骤6-10, 19-20)
这是软件与CPM通信的核心数据结构设置。
// 6. 初始化SDCR(SDMA配置寄存器) // 通常配置为0x00(8位端口,正常操作),具体值取决于系统内存访问方式。// 7. 设置BD表基址 // 假设在双端口RAM(DPRAM)起始处放置1个RxBD,紧接着1个TxBD。 // RBASE = 0x0000 (RxBD表起始地址) // TBASE = 0x0008 (TxBD表起始地址,因为一个BD占8字节)// 8. 执行初始化命令 // 向CPCR写入0x0041,执行SCC2的`INIT RX AND TX PARAMS`命令。 // 这个命令会使用RBASE和TBASE的值来初始化通道内部的RBPTR和TBPTR。 // **关键点**:此命令必须在通道禁用时执行。// 9. 配置FIFO控制寄存器 // RFCR = 0x10, TFCR = 0x10。0x10通常表示“正常操作”,使用SDMA通道进行内存访问。// 10. 设置最大接收缓冲区长度 // MRBLR = 0x0010。这意味着每个RxBD关联的数据缓冲区最大为16字节。 // **注意**:这是一个硬限制。如果接收的数据超过16字节,即使帧没结束,缓冲区也会关闭,并可能触发“缓冲区忙”错误。应根据协议最大帧长合理设置。// 19. 初始化RxBD // RxBD状态控制字 = 0xB000 // 分解:E=1 (空,CP可写入), W=0 (非最后BD), I=1 (缓冲区关闭时产生RXB中断) // L=0, F=0, CM=0 (非连续模式), 其他错误位初始为0。 // 数据长度 = 0x0000 (初始为0,由CP写入实际长度) // 缓冲区指针 = 0x00001000 (假设数据存放在主存此地址)// 20. 初始化TxBD // TxBD状态控制字 = 0xBD20 // 分解:R=1 (就绪,等待发送), W=0, I=1 (发送完成产生TXB中断) // L=1 (此缓冲区是消息的最后一个), TB=1 (发送BCS), CM=0, BR=0 (不重置BCS) // TD=0, TR=0, B=1 (字符参与BCS计算) // 数据长度 = 0x0005 (发送5个字符) // 缓冲区指针 = 0x00002000 (发送数据位于主存此地址)5.3 协议相关寄存器配置(步骤11-18, 24-26)
这部分配置决定了SCC如何理解并处理BISYNC协议。
// 11. & 12. 初始化CRC寄存器 // PRCRC = 0x0000, PTCRC = 0x0000。对于CRC-16,预设值通常为0x0000或0xFFFF,接收端检查结果应为0。// 13. 清除PAREC(奇偶校验错误计数器) // PAREC = 0x0000。为了调试清晰,开始前清零。// 14. & 16. 配置SYNC和DLE字符 // BSYNC = 0x8033。V=1 (有效), SYNC字符=0x33。 // BDLE = 0x8055。V=1 (有效), DLE字符=0x55。 // **重要**:这些值必须与对端设备协商一致。0x33和0x55是BISYNC常见默认值。// 15. 配置数据同步寄存器 (DSR) // DSR = 0x3333。这定义了同步模式下的同步字符模式。GSMR_H[SYNL]决定了使用多少位。 // 假设GSMR_H[SYNL]=01 (4-bit模式),则实际同步模式为低4位的0x3重复。// 17. & 18. 控制字符表 (本例中未使用) // CHARACTER1-8 = 0x8000 (E=1,无效条目) // RCCM = 0xE0FF (未使用,但按手册建议设置) // 这意味着本例中SCC不会自动识别任何控制字符来结束块,帧结束完全由RxBD满或错误触发。 // 这是一种简单的“字节中断”模式,每个接收字节都可能产生中断,由软件处理协议。// 24. 配置GSMR_H (全局模式寄存器高半部分) // GSMR_H2 = 0x2000_0000。这里主要配置了接收FIFO的阈值。0x2000_0000通常对应一个较小的FIFO宽度(如1字节),这会导致更频繁的DMA请求或中断,但延迟更低。// 25. & 27. 配置并启用GSMR_L (全局模式寄存器低半部分) // 第一次写: GSMR_L2 = 0x00000008。 // 分解:DIAG = 正常模式,但可能配置了CTS和CD的自动控制。最重要的是模式选择位,设置为BISYNC模式。**注意此时ENT和ENR(收发使能)为0**。 // 第二次写: GSMR_L2 = 0x00000038。 // 这是在所有其他配置完成后,最后一步才置位ENT和ENR,使能收发器。这是一个好习惯,避免通道在未正确配置时就开始工作。// 26. 配置PSMR2 (协议特定模式寄存器) // PSMR2 = 0x0600。 // 分解:CRC=01 (CRC-16), RBCS=1 (使能接收BCS计算), RTR=0 (正常接收模式,非透明), RPM/TPM未使用。 // 这配置了一个使用CRC-16校验、非透明模式的经典BISYNC通道。5.4 中断与事件清理(步骤21-23, 27之后)
// 21. 清除SCC事件寄存器 // SCCE2 = 0xFFFF。通过写1清除所有可能挂起的事件位。// 22. 配置SCC掩码寄存器 // SCCM2 = 0x0013。使能TXE(发送错误)、TXB(发送缓冲区完成)、RXB(接收缓冲区完成)中断。 // 这意味着当发送出错、一个缓冲区发送完毕、或一个接收缓冲区被关闭时,会产生中断。// 23. 配置CPM中断路由 // CIMR |= 0x2000_0000; // 允许SCC2中断连接到系统中断控制器。 // CICR也需要初始化,以确定中断优先级和向量。完成以上所有步骤后,SCC2的BISYNC通道就初始化完毕,并开始工作。发送器会立即开始发送0x00002000地址处的5字节数据,并在结束后自动附加CRC-16校验码。接收器则等待同步字符0x33,并在收到16字节或发生错误时,关闭RxBD并产生中断。
6. 高级应用与调试技巧
6.1 透明模式下的驱动设计
透明模式是BISYNC的难点,但SCC的硬件支持使其大大简化。驱动设计流程如下:
- 初始化:设置PSMR[RTR]=1,使能接收透明模式。配置BDLE寄存器(如0x8055)。
- 发送:
- 对于普通数据,SCC会自动在需要转义的字符(如与ETX同值的数据)前插入DLE。
- 对于控制字符序列(如DLE STX),你需要确保它们在数据流中以“DLE DLE STX”的形式存在,或者使用TxBD的
TD位让硬件自动添加前导DLE。 - 设置TxBD的
TR=1,使发送器在发送该缓冲区后进入透明模式。
- 接收:
- 接收器在透明模式下,会自动剥离有效的“DLE+数据字符”中的前导DLE。
- 只有跟在DLE后的控制字符(如DLE ETX)才会被识别为帧结束,并触发控制字符表动作。
- 确保控制字符表配置正确,例如CHARACTER1设置为DLE ETX (0x1003,假设DLE=0x10,ETX=0x03),并设置B=1, H=1。
6.2 利用控制字符表实现高效接收
避免“每字节一中断”的低效模式是关键。
- 策略:准备多个多字节的RxBD(例如,每个4KB)。初始时,使能SCCM[RCH](接收字符中断),让每个接收字符都中断。
- 软件协议解析:在RCH中断服务程序中,检查接收到的前几个字节(如SOH, STX, DLE STX)。一旦识别出帧开始和类型(透明/非透明),软件立即:
- 如果是透明模式,设置PSMR[RTR]=1。
- 如果是新数据块开始,发出
RESET BCS CALCULATION命令。 - 屏蔽SCCM[RCH]中断。
- 硬件自动处理:此后,SCC将自动接收数据,填充RxBD,直到遇到控制字符表中定义的帧结束字符(如ETX)。此时,SCC会自动关闭当前RxBD,产生RXB中断,并根据配置决定是否进入搜索模式。
- 中断处理:在RXB中断中,处理完整的数据块,然后重新使能SCCM[RCH]中断,准备解析下一个帧头。
这种方法将软件干预降到最低(仅处理帧头帧尾),极大提升了吞吐量。
6.3 常见问题排查实录
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 发送数据,对方收不到同步 | 1. 时钟未正确配置或未激活。 2. GSMR_L[ENT]未使能。 3. 引脚复用配置错误。 | 1. 用示波器检查CLK引脚是否有时钟信号。 2. 确认GSMR_L最终写入了ENT=1。 3. 检查PAPAR/PCPAR配置,确认TXD引脚功能已分配给SCC。 |
| 接收不到数据,或一直处于搜索模式 | 1. BSYNC寄存器SYNC字符值与对端不匹配。 2. DSR寄存器同步模式/长度配置错误。 3. 接收器未使能(GSMR_L[ENR]=0)。 4. CD信号���效(如果启用CD检查)。 | 1. 核对两端SYNC字符值。 2. 检查GSMR_H[SYNL]与DSR配置。 3. 确认GSMR_L[ENR]=1。 4. 检查CD线物理连接和极性。 |
| 接收数据错位或乱码 | 1. 数据位序反转位RVD设置错误。 2. 时钟相位/极性问题(但BISYNC通常固定)。 3. 波特率不匹配。 | 1. 检查PSMR[RVD]是否与对端设备匹配。 2. 确认使用同步时钟,且主从配置正确。 3. 用示波器测量位宽度,计算实际波特率。 |
| CRC校验持续失败 | 1. PRCRC/PTCRC初始值错误。 2. 透明模式下,RBCS操作或控制字符表配置不当,导致DLE字符被错误地计入/排除BCS。 3. 发送端TxBD的 B位未正确设置,导致某些字符未参与BCS计算。 | 1. 确认CRC-16预设值为0x0000,并检查对端设备校验算法。 2. 在透明模式下,仔细分析硬件自动处理DLE的规则,使用 RBCS位动态控制或确保控制字符表正确。3. 检查所有发送缓冲区的TxBD控制字,确保数据字符的 B=1,非数据字符(如纯SYN)的B=0。 |
| 发送完成后无法产生TXB中断 | 1. TxBD的I位未置位。2. SCCM[TXB]未使能。 3. CPM中断路由(CIMR)未配置。 4. 中断服务程序未正确清除SCCE[TXB]位(写1清除)。 | 1. 检查TxBD控制字。 2. 检查SCCM寄存器。 3. 检查CIMR和CICR。 4. 在ISR中,读取SCCE后,向相应位写1清除。 |
| 接收缓冲区未满但提前关闭 | 1. 收到了控制字符表中定义的字符。 2. 发生了错误(OV, CD, PR等)。 3. 软件发出了 CLOSE RXBD或ENTER HUNT MODE命令。 | 1. 检查控制字符表配置,确认是否无意中定义了某个常见数据字符作为结束符。 2. 检查RxBD状态字中的错误位。 3. 检查代码逻辑,是否在不当时候发出了接收命令。 |
调试SCC BISYNC驱动,逻辑分析仪或带协议解码功能的示波器是必不可少的。它们可以直观地显示线上的SYN、DLE、数据、BCS序列,帮助你验证硬件行为是否与软件配置一致。同时,充分利用BD的状态位和SCCE事件寄存器,在中断服务程序中打印或记录这些状态,是定位软件配置问题的快速方法。记住,SCC是一个复杂的状态机,你的配置就是在为它编写“剧本”,任何歧义都会导致通信故障。
