1. 项目概述
在嵌入式通信领域,尤其是在工业控制、金融终端或传统的数据采集系统中,我们常常会遇到一些“老而弥坚”的通信协议。BISYNC(Binary Synchronous Communication,二进制同步通信)协议就是其中之一。它可能不像现代的以太网或USB那样广为人知,但在那些对稳定性和确定性要求极高的场景里,BISYNC凭借其严谨的字符同步和差错控制机制,依然是可靠数据传输的基石。最近,我在一个基于Freescale(现NXP)MPC8323E PowerQUICC II Pro处理器的旧设备升级项目中,就深度折腾了一把BISYNC协议的实现。MPC8323E内部集成的QUICC Engine模块,其通用通信控制器(UCC)原生支持BISYNC模式,这为我们省去了用软件模拟协议栈的麻烦,但同时也意味着我们需要深入芯片手册,去理解和配置一堆寄存器与内存结构。
这个项目的核心,就是吃透MPC8323E的UCC模块在BISYNC模式下的工作原理,特别是其**参数RAM(Parameter RAM)的精细配置和控制字符识别(Control Character Recognition)**机制。简单来说,我们的目标不是让CPU去逐个字节地解析数据流,而是通过合理配置硬件,让UCC控制器能自动识别数据帧的开始、结束以及关键的控制指令,只在必要时才中断CPU,从而实现高效、低开销的通信。这就像给通信端口配了一个智能的“前台”,它能处理大部分常规事务,只有遇到重要客人(特定控制字符)或突发事件(传输错误)时,才需要向你汇报。本文将基于我的实际调试经验,详细拆解如何在MPC8323E上实现BISYNC通信,从核心概念到寄存器配置,再到避坑指南,希望能为面临类似任务的工程师提供一份实用的参考。
2. BISYNC协议核心与MPC8323E硬件支持解析
在动手配置寄存器之前,我们必须先理解BISYNC协议到底在干什么,以及MPC8323E的硬件为我们提供了哪些“武器”。
2.1 BISYNC协议精要:不止于同步
BISYNC是一种面向字符的同步数据链路控制协议。它的核心思想是使用特殊的、预先约定好的字符来控制通信过程。与异步通信(如UART)每个字符都有起始位和停止位不同,BISYNC通信以“帧”或“块”为单位,在帧的开始使用特定的**同步字符(SYNC)**来建立位同步和字符同步。一旦接收方锁定到SYNC字符序列,它就认为后续的字节流是一个完整的数据块。
一个典型的BISYNC数据块结构可能包含:SYNC SYNC SOH(正文头) ... 数据正文 ... ETX(正文结束) BCS(块校验序列)。这里的SOH、ETX都是控制字符,它们具有特殊的含义,用于界定数据块的开始、结束,或传递链路控制命令(如询问ENQ、确认ACK)。**数据链路转义字符(DLE)**则用于实现“透明文本”传输,即当数据域中出现了与控制字符相同的代码时,通过在它前面插入一个DLE来告知接收方“后面这个字符请当作普通数据处理”。
MPC8323E的UCC模块的BISYNC模式,其价值就在于硬件层面实现了对这些复杂规则的解析。它能够自动:
- 同步与剥离:在接收端自动搜寻并丢弃SYNC字符;在发送端自动插入SYNC字符。
- 透明文本处理:自动处理DLE字符的插入(发送时)和剥离(接收时)。
- 控制字符识别:自动比对接收到的字符与用户预定义的控制字符表,并在匹配时触发相应动作(如关闭缓冲区、期待BCS)。
- 块校验序列(BCS)计算与验证:支持CRC-16和纵向冗余校验(LRC),自动计算和校验,减轻CPU负担。
2.2 MPC8323E UCC模块的BISYNC支持框架
MPC8323E的每个UCC通道在BISYNC模式下,其配置和状态主要通过以下几类资源来管理:
- 协议模式寄存器:主要是
GUMR(通用UCC模式寄存器)和UPSMR(协议特定模式寄存器)。GUMR[MODE]位域用于选择BISYNC协议,GUMR[SYNL]定义同步字符的长度(4/8/16位或外部同步)。UPSMR则集中配置了BISYNC特有的参数,如同步字符对数量、校验方式、透明模式、奇偶校验模式等。 - 参数RAM(Parameter RAM):这是配置的核心区域,也是一块位于多用户RAM中、专属于该UCC通道的内存空间。它包含了协议运行所需的各种变量和表格,例如:
BSYNC(SYNC字符寄存器)BDLE(DLE字符寄存器)CHARACTER1~CHARACTER8(控制字符表)RCCM(接收控制字符掩码)PRCRC/PTCRC(收发CRC预置值)PAREC(奇偶错误计数器)
- 缓冲区描述符(BD):这是数据搬运的“任务单”。无论是发送还是接收,数据都存放在由BD指向的系统内存缓冲区中。BD不仅包含了缓冲区地址和长度,更重要的是其状态控制位,例如,对于接收BD(RxBD),有
C(控制字符)、B(BCS接收)等位来告知CPU当前缓冲区内容的性质;对于发送BD(TxBD),有L(消息结束)、TB(发送BCS)、TR(透明模式)等位来指导发送器如何操作当前缓冲区。 - 事件与掩码寄存器:
UCCE(事件寄存器)和UCCM(掩码寄存器)。UCCE记录了通道发生的各种事件(如发送完成TXB、接收完成RXB、收到字符RCH、错误TXE等),UCCM则用于控制哪些事件可以产生中断。
关键理解:硬件自动化的程度,直接取决于你对参数RAM和BD控制位的配置精度。配置得好,UCC就能像一个尽职的协处理器,默默处理大部分通信杂务;配置不当,则会导致频繁中断、数据错乱甚至通信失败。
3. 核心配置详解:从参数RAM到控制字符表
理解了框架,我们进入实战环节。配置BISYNC通道,就像在组装一台精密的仪器,每一步都需要准确无误。
3.1 同步与透明模式的基础:BSYNC与BDLE寄存器
BSYNC和BDLE寄存器分别定义了SYNC和DLE字符的值及其处理方式。
BSYNC寄存器(偏移0x3E):
- SYNC字段(位8-15):这里写入你协议中规定的同步字符值。例如,常见的BISYNC协议使用
0x16作为SYNC字符。注意:如果使用7位数据加奇偶校验,这个值需要包含校验位。 - V位(有效位,位0):这是关键。当
V=1且接收器不处于搜索(Hunt)模式时,收到的SYNC字符会被硬件自动丢弃,且不参与BCS计算。这正符合BISYNC协议要求。通常我们需要设置V=1。 - DIS位(禁用剥离,位1):当
DIS=1时,禁用SYNC剥离功能。这主要用于“透明模式”(BISYNC transparent mode only)。在普通模式下,应保持DIS=0。
- SYNC字段(位8-15):这里写入你协议中规定的同步字符值。例如,常见的BISYNC协议使用
BDLE寄存器(偏移0x40):
- DLE字段(位8-15):写入DLE字符值,通常是
0x10。 - V位(有效位,位0):与
BSYNC[V]类似。当V=1时,在透明模式下,接收器会剥离收到的DLE字符(且不参与BCS计算)。如果紧随其后的字符是SYNC,则SYNC也被剥离;如果是另一个DLE,则第二个DLE会被写入缓冲区并计入BCS。这完美实现了透明文本规则。 - DIS位(禁用剥离,位1):当
DIS=1时,禁用DLE剥离。此时,所有DLE和SYNC字符都将被当作普通数据写入缓冲区。这个功能用于一些特殊的协议变种,常规BISYNC透明模式应设置DIS=0。
- DLE字段(位8-15):写入DLE字符值,通常是
配置示例与心得: 假设我们使用标准的8位数据、无奇偶校验、SYNC=0x16、DLE=0x10的BISYNC协议。
// 假设 pBisyncParamRam 是指向UCC BISYNC参数RAM基地址的指针 pBisyncParamRam->BSYNC = 0x8000 | 0x16; // V=1, DIS=0, SYNC=0x16 pBisyncParamRam->BDLE = 0x8000 | 0x10; // V=1, DIS=0, DLE=0x10注意:这些寄存器必须在UCC通道禁用(
GUMR[EN] = 0)时进行初始化。在通道运行期间修改它们可能导致不可预知的行为。
3.2 协议行为的总开关:UPSMR寄存器详解
UPSMR寄存器(偏移UCC_BASE + 0x8)是BISYNC模式的“控制面板”,许多全局行为在此定义。
- NOS(位0-3):发送的SYN1-SYN2对的最小数量。这个设置决定了在消息开始前或消息之间,发送器要发送多少对同步字符。例如,
0001表示发送2对。增加这个值可以增强接收端的同步鲁棒性,特别是在有噪声的线路上。这是一个可以在线修改(on-the-fly)的参数,你可以根据链路质量动态调整。 - CRC(位4-5):块校验序列(BCS)选择。
01:选择CRC-16校验。多项式是X^16 + X^15 + X^2 + 1。这是最常用的差错检测方式,能力很强。关键点:选择CRC-16时,协议默认使用8位数据字符(无奇偶校验)。PRCRC和PTCRC(收发CRC预置值)必须被初始化为全0或全1(根据协议规定),发送器计算出的CRC会以非反转形式发送,接收器校验结果应为0。11:选择纵向冗余校验(LRC),即和校验。当选择LRC时,收发器会自动启用字符奇偶校验(VRC)(除非处于透明模式)。这意味着每个7位数据字符会附带一个奇偶校验位。PRCRC和PTCRC需要根据你想要的LRC初始值(全0为偶校验,全1为奇校验)进行设置。
- RBCS(位6):接收BCS使能。置1使能接收端的BCS计算和检查。它可以在线修改,允许你在接收一个数据块的过程中,动态地将某个字符排除在BCS计算之外(通过清零
RBCS),这在处理某些特殊帧结构时有用。 - RTR(位7):接收器透明模式。这是核心模式开关之一。
0:普通接收模式。接收器会进行SYNC剥离和控制字符识别。1:透明接收模式。只有当收到一个前导DLE字符后,接收器才会去识别后续的SYNC、DLE或控制字符。重要提示:在透明模式下,即使CRC字段被设置为LRC,接收器内部仍然使用CRC-16算法计算BCS。因此,在设置RTR=1之前,必须将PRCRC初始化为CRC-16的预置值(通常是0xFFFF或0x0000)。
- RVD(位8):数据反转。置1后,该UCC通道的BISYNC模式将反转字符的比特顺序(先发送/接收最高位MSB)。这用于适配某些特殊设备的数据格式。
- DRT(位9):发送时禁用接收器。通常在半双工通信中,我们虽然不期望收到自己发送的数据,但接收器在物理上仍是打开的。设置
DRT=1可以在本机发送时,通过内部RTS信号门控来禁用接收器,这在多站共享总线(multidrop)的场景下可以避免收到自己的回声。注意:如果设置了DRT=1,除非满足特定时钟和CTS时序条件,否则GUMR_H[CDS](时钟和帧同步选择)应被清零。 - RPM/TPM(位12-15):收发器奇偶校验模式。这两个字段仅在
CRC=11(LRC模式)时有效。它们定义了奇偶校验的生成和检查规则(奇校验、偶校验、强制高、强制低)。RPM和TPM都可以在线修改,允许动态调整。
配置策略: 对于典型的、使用CRC-16、非透明模式的BISYNC链路,一个基础的UPSMR配置可能是:
// NOS=1对同步字符, CRC=CRC-16, 接收BCS使能, 非透明模式, 正常数据顺序, 发送时不关闭接收 // 假设寄存器是32位,我们关注的低16位 uint32_t upsmr_value = 0; upsmr_value |= (0x0 << 0); // NOS = 0 (1 pair) upsmr_value |= (0x1 << 4); // CRC = 01 (CRC-16) upsmr_value |= (0x1 << 6); // RBCS = 1 (Enable) upsmr_value |= (0x0 << 7); // RTR = 0 (Normal Rx) upsmr_value |= (0x0 << 8); // RVD = 0 (Normal bit order) upsmr_value |= (0x0 << 9); // DRT = 0 (Normal operation) // RPM和TPM在CRC-16模式下被忽略,可设为0 UCC_REG->UPSMR = upsnmr_value;3.3 智能化的关键:控制字符识别机制
这是BISYNC模式最强大的功能之一,也是减少CPU中断的关键。UCC硬件可以识别最多8个用户定义的控制字符,并根据配置采取不同动作。
控制字符表位于参数RAM的CHARACTER1到CHARACTER8(偏移0x42至0x50)。每个条目是16位,但只有低8位(位8-15)用于存放控制字符值。高8位(位0-7)是控制位:
- E位(位0):表结束标志。
0表示该条目有效,需要与接收字符比较。1表示此条目无效,且其后没有其他有效条目。如果你只定义了3个控制字符,那么就在CHARACTER4的E位写1。 - B位(位1):BCS期待位。这是一个非常重要的位。
0:收到此字符后,立即关闭当前接收缓冲区。适用于像ENQ(询问)这样的字符,它本身就是一个完整的命令,后面不跟数据块和BCS。1:收到此字符后,字符被写入缓冲区,但不立即关闭。接收器会等待后续的1个(LRC)或2个(CRC-16)BCS字节,接收完BCS后再关闭缓冲区。这用于ETX(正文结束)、ETB(传输块结束)等标识数据块结束的字符。
- H位(位2):搜索模式使能位。
0:关闭此缓冲区后,BISYNC控制器保持字符同步。1:关闭此缓冲区后,BISYNC控制器进入搜索(Hunt)模式,重新开始寻找SYNC字符序列。当B=1时,控制器在接收完BCS后才进入搜索模式。
RCCM寄存器(接收控制字符掩码,偏移0x52):这是一个16位的掩码,对应CHARACTERn的16位。RCCM的每一位如果置1,则在比较时,对应CHARACTERn的那一位必须严格匹配;如果置0,则对应位在比较时被忽略(视为“不关心”)。这允许你定义一类字符,而不是单个字符。例如,你可以设置RCCM = 0xFF00,那么CHARACTER1的高8位(字符值)必须匹配,而低8位(控制位E/B/H)在比较时被忽略。手册特别警告:如果RCCM没有正确设置,在控制字符识别期间可能会导致错误操作。
配置示例: 假设我们的协议定义:SOH (0x01)表示报文头开始,后面是数据;ETX (0x03)表示正文结束,后面跟CRC-16;ENQ (0x05)是一个独立的询问命令。
// 定义控制字符表 // CHARACTER1: SOH, B=0 (无BCS), H=0 (保持同步) pBisyncParamRam->CHARACTER1 = (0x01 << 8); // E=0, B=0, H=0, 字符=0x01 // CHARACTER2: ETX, B=1 (期待BCS), H=1 (接收完BCS后进入搜索模式) pBisyncParamRam->CHARACTER2 = (0x1 << 1) | (0x1 << 2) | (0x03 << 8); // E=0, B=1, H=1, 字符=0x03 // CHARACTER3: ENQ, B=0, H=1 (命令结束,重新搜索同步) pBisyncParamRam->CHARACTER3 = (0x1 << 2) | (0x05 << 8); // E=0, B=0, H=1, 字符=0x05 // CHARACTER4: 标记表结束 pBisyncParamRam->CHARACTER4 = (0x1 << 0); // E=1, 其他位无关 // 设置RCCM,我们要求完全匹配8位字符值,忽略控制位(E/B/H) pBisyncParamRam->RCCM = 0xFF00; // 高8位(字符值)必须匹配,低8位(控制位)不关心通过这样的配置,当接收器收到ETX (0x03)时,它会:1) 将ETX写入当前缓冲区;2) 等待接收2个字节的CRC-16;3) 将CRC字节也写入缓冲区;4) 关闭缓冲区,设置RxBD的C=1(���制字符)和B=1(包含BCS);5) 产生接收完成中断(如果使能);6) 进入搜索模式,准备接收下一帧。整个过程完全由硬件完成,CPU仅在整帧数据就绪后才被中断一次。
4. 数据流与缓冲区描述符(BD)的协同工作
硬件配置好了,数据怎么流动?这就要靠缓冲区描述符(BD)来指挥。BD是CPU和QUICC Engine之间关于数据缓冲区的“契约”。
4.1 接收缓冲区描述符(RxBD)详解
接收BD告诉UCC:“请把收到的数据放到这个内存地址,最多放这么长,收满了或者遇到特殊情况就告诉我。” 图25-7和表25-10描述了其结构。
- 核心控制/状态位:
- E(空,位0):CPU将其置1,表示“这个缓冲区空着,你可以用”。UCC在填满缓冲区或因错误关闭缓冲区后,将其清零。
- W(回环,位2):置1表示这是BD表中的最后一个BD。UCC用完这个BD后,会回到RBASE指向的第一个BD,形成环状队列。
- I(中断,位3):CPU置1,表示“当你关闭这个缓冲区时,请产生一个中断通知我”。
- C(控制字符,位4):由UCC设置。如果此缓冲区的最后一个字节是一个用户定义的控制字符(来自CHARACTER表),则置1。
- B(BCS接收,位5):由UCC设置。如果此缓冲区包含了接收到的BCS(校验字节),则置1。注意,控制字符(C=1)可能就在BCS的前一个字节。
- CM(连续模式,位6):如果置1,UCC在关闭此BD后不会自动清除E位。这意味着UCC下次会覆盖这个缓冲区的内容。这用于需要极高速度、CPU保证在数据被覆盖前处理的场景。慎用,因为一旦CPU处理慢了,数据就会丢失。
- 错误标志位(DL, PR, CR, OV, CD):分别指示DLE后续字符错误、奇偶校验错误、BCS错误、接收溢出、载波检测丢失。任何错误都会导致缓冲区被立即关闭(E被清零)。
数据长度字段:UCC在关闭缓冲区时写入,表示实际写入缓冲区的字节数,包括BCS字节。例如,一个数据块以ETX结尾并跟随2字节CRC,那么关闭缓冲区时,数据长度会比ETX的位置多2。
操作流程:
- CPU初始化一个RxBD链表,将所有BD的
E位置1,W位在最后一个BD设置,I位根据需要设置。 - 使能UCC接收器。
- UCC从第一个
E=1的BD开始,将接收到的数据写入其指向的缓冲区。 - 当发生以下情况之一时,UCC关闭当前BD(清零
E):- 缓冲区被写满(达到Data Length)。
- 收到了一个控制字符(且根据其B位决定是否等待BCS)。
- 发生了错误(DL, PR等)。
- 软件发出了
ENTER HUNT MODE命令。
- 如果该BD的
I=1,UCC会设置UCCE[RXB]位,可能产生中断。 - CPU在中断服务程序或轮询中,发现某个BD的
E=0,便读取数据并进行处理。处理完毕后,CPU必须手动将该BD的E位置1(并清除可能的错误状态位),将其重新放入空闲队列。对于CM=1的BD,则不需要此操作,但CPU处理必须比UCC覆盖数据更快。
4.2 发送缓冲区描述符(TxBD)详解
发送BD告诉UCC:“我这里有一块数据要发送,请你按如下规则发送它。” 图25-8和表25-11描述了其结构。
- 核心控制/状态位:
- R(就绪,位0):CPU将其置1,表示“数据准备好了,请发送”。UCC发送完成后(或出错后)将其清零。
- L(消息结束,位4):极其重要。置1表示这个缓冲区中的最后一个字符,是当前整个消息块的最后一个字符。
- TB(发送BCS,位5):仅在
L=1时有效。置1表示在发送完这个缓冲区的数据后,自动追加发送BCS(CRC-16或LRC)。发送完BCS后,BCS计算器会被复位。 - CM(连续模式,位6):与RxBD类似,置1时UCC发送完此BD后不清除
R位,下次会重新发送这个缓冲区的数据。用于需要循环发送固定数据的场景。 - BR(BCS复位,位7):置1表示在发送此缓冲区数据之前,先复位BCS计算器。这用于发送一些不参与整体块校验的头部信息(如SOH)。
- TD(发送DLE,位8):置1表示在发送此缓冲区数据之前,硬件自动插入一个DLE字符。这在透明模式下非常有用,可以避免为每个需要转义的DLE字符单独准备一个缓冲区。
- TR(透明模式,位9):置1表示发送器在发送完此缓冲区后,进入或保持透明模式。在透明模式下,发送器会自动检查所有待发字符,如果发现DLE,则自动在其前面再插入一个DLE。如果发生发送器欠载(TBNR underrun),它会发送DLE-SYNC对,而不是单独的SYNC。
- B(BCS使能,位10):置1表示此缓冲区内的字符参与BCS计算;置0则表示不参与。这允许你将一帧数据中不参与校验的部分(如某些填充字节)放在单独的、
B=0的缓冲区里。 - 错误标志位(UN, CT):分别指示发送欠载错误和CTS信号丢失错误。
发送流程:
- CPU准备数据,初始化TxBD,设置
R=1,并根据数据性质设置L,TB,TR,B,TD等位。 - 使能UCC发送器。
- UCC从第一个
R=1的BD开始发送。发送前,如果BR=1则复位BCS;如果TD=1则先发一个DLE。 - 发送缓冲区内的数据,如果
B=1则同时进行BCS计算。 - 发送完缓冲区后:
- 如果
L=1且TB=1,则发送计算好的BCS,然后复位BCS生成器,并开始发送SYNC字符对或进入空闲状态(由GUMR[RTSM]决定)。 - 如果
L=1但TB=0,则直接发送SYNC对或进入空闲状态。 - 如果
L=0,则继续准备发送下一个R=1的BD。
- 如果
- UCC清除当前BD的
R位,如果I=1则设置UCCE[TXB](发送完成)或UCCE[TXE](发送错误)事件。 - CPU检查到
R=0后,即可回收或重用该BD对应的缓冲区。
一个典型的多缓冲区发送例子(发送一个带SOH头、透明数据、以ETX+CRC结束的帧):
- BD1: 数据=SOH,
R=1,L=0,TB=0,BR=1(复位BCS,因为SOH不参与校验),B=0(SOH不参与BCS计算)。 - BD2: 数据=透明数据部分,
R=1,L=0,TB=0,TR=1(进入透明模式),B=1(数据参与BCS计算),TD=0。 - BD3: 数据=ETX,
R=1,L=1,TB=1(发送ETX后追加BCS),TR=0(发送完ETX后退出透明模式?取决于协议,可能需要保持),B=1(ETX参与BCS计算),TD=0。
5. 实战配置步骤与调试心得
理论最终要落地到代码。以下是我在MPC8323E上配置一个UCC通道为BISYNC模式的基本步骤和踩过的坑。
5.1 初始化配置流程
- 关闭UCC通道:在修改任何关键配置(特别是
GUMR, 参数RAM)前,确保通过GUMR[EN]位禁用UCC发送和接收。 - 配置引脚复用:通过芯片的I/O控制器,将UCC对应的TXD, RXD, CLK, CTS, RTS等引脚功能正确映射到物理管脚。
- 配置UCC时钟:通过系统时钟和BRG(波特率发生器)配置,为UCC提供正确的发送时钟(TCLK)和接收时钟(RCLK)。BISYNC是同步协议,收发时钟必须同源且稳定。
- 初始化参数RAM:
- 清零整个UCC参数RAM区域(通常有256字节)。
- 设置
BSYNC和BDLE寄存器。 - 设置
PRCRC和PTCRC(根据选择的BCS类型)。 - 设置
CHARACTER1~CHARACTER8和RCCM。 - 设置
UPSMR寄存器。 - 设置
UDSR(数据同步寄存器),写入SYN1和SYN2字符。GUMR[SYNL]决定使用其中几位。
- 初始化BD表:
- 在系统内存中分配发送和接收BD表(通常是数组或链表)。
- 分配数据缓冲区,并将缓冲区地址填入BD的
Buffer Pointer字段。 - 设置BD的控制位:对于RxBD,初始化时
E=1,I按需设置;对于TxBD,初始化时R=0。 - 设置最后一个BD的
W=1,形成环。 - 将BD表的基地址写入UCC的
TBASE(发送BD基址)和RBASE(接���BD基址)寄存器(这些寄存器通常在UCC的协议特定区域或通过CPCR命令设置)。
- 配置
GUMR寄存器:设置MODE为BISYNC,SYNL选择同步模式,TCI/RCI选择时钟源,TMS/RMS选择同步模式等。 - 使能UCC通道:设置
GUMR[EN] = 1。 - 启动收发:对于接收,只要RxBD的
E=1,接收器会自动开始工作。对于发送,将第一个要发送的数据填入缓冲区,并设置对应TxBD的R=1。
5.2 常见问题与排查技巧实录
在调试BISYNC时,问题往往出在细节上。下面是我遇到的一些典型问题及解决方法:
问题1:接收器完全没反应,收不到任何数据。
- 检查时钟:这是最常见的问题。用示波器测量TCLK和RCLK引脚,确认有时钟信号,且频率正确。确认
GUMR[TCI]和GUMR[RCI]设置正确。 - 检查同步字符:确认
UDSR中写入的SYN1和SYN2值与发送端一致。确认GUMR[SYNL]设置正确(例如,你用了8位SYNC,却设置成4位模式)。 - 检查
BSYNC[V]位:如果V=0,接收器不会剥离SYNC字符,SYNC会被当作数据写入缓冲区,可能导致后续控制字符识别失败。通常V应设为1。 - 检查RxBD状态:确认初始化时
E=1,并且RBASE寄存器指向了正确的BD表起始地址。在调试时,可以在中断或轮询中检查UCCE[RXB]是否置位,以及RxBD的E位是否被清零。
- 检查时钟:这是最常见的问题。用示波器测量TCLK和RCLK引脚,确认有时钟信号,且频率正确。确认
问题2:能收到数据,但控制字符识别不工作,或者缓冲区在不该关闭的时候关闭了。
- 仔细核对控制字符表:确保
CHARACTERn寄存器中写入的字符值(包括可能的奇偶校验位)与线上传输的完全一致。一个常见的错误是忽略了奇偶校验位。如果协议是7位数据+偶校验,那么字符0x01在线上的值可能是0x81(如果MSB是校验位)。 - 检查
RCCM掩码:默认情况下,如果你希望精确匹配8位字符,RCCM应设置为0xFF00。如果你希望匹配7位数据而忽略校验位,可以设置为0x7F00。不正确的RCCM会导致匹配失败。 - 理解
B位和H位的行为:如果你的数据块以ETX+CRC结束,那么对应ETX的CHARACTER条目必须设置B=1(期待BCS)和H=1(接收完BCS后进入搜索模式)。如果H=0,接收器在收到ETX和BCS后不会重新搜索SYNC,可能会丢失下一帧的开头。 - 查看RxBD状态位:当缓冲区关闭时,检查
C位和B位。如果C=1,说明识别到了控制字符;如果B=1,说明缓冲区包含了BCS。这能帮你判断硬件是否按预期工作。
- 仔细核对控制字符表:确保
问题3:CRC校验总是失败。
- 检查
PRCRC/PTCRC初始值:对于CRC-16,通常预置值为全0 (0x0000) 或全1 (0xFFFF),必须与协议规范和对端设备一致。初始化错误会导致双方计算的CRC基准不同。 - 检查
UPSMR[CRC]设置:确认是01(CRC-16)还是11(LRC)。 - 检查哪些字符参与了计算:记住,在非透明模式下,SYNC字符不参与BCS计算。在透明模式下,前导的DLE以及紧随其后的SYNC(如果是DLE-SYNC对)也不参与计算。确保你的软件计算CRC的范围与硬件一致。一个调试技巧:可以先在
UPSMR中禁用BCS(RBCS=0),让数据先通起来,再对比软件计算的CRC和硬件附加的CRC,以确定问题范围。 - 检查发送端的
B位:发送时,只有TxBD[B]=1的缓冲区内的字符才会被计入BCS。确保所有需要校验的数据都在B=1的缓冲区里。
- 检查
问题4:透明模式下数据错乱。
- 确认
UPSMR[RTR]=1且BDLE[V]=1:这是使能透明接收模式的基础。 - 发送端配置匹配:发送端也需要在相应的TxBD上设置
TR=1(进入透明模式)。在透明模式下,发送器才会自动进行DLE插入。 - 理解DLE处理规则:在透明模式下,发送器遇到数据中的DLE (
0x10) 会自动变成0x10 0x10。接收器看到0x10 0x10会剥离第一个,将第二个0x10作为数据。如果接收器收到单个0x10后跟的不是0x10或SYNC或定义的控制字符,它会设置RxBD[DL]错误位。务必理解这种“转义”机制。 PRCRC初始化:再次强调,透明模式下接收器使用CRC-16算法,即使UPSMR[CRC]设置为LRC。因此PRCRC必须初始化为CRC-16的预置值。
- 确认
问题5:通信不稳定,偶尔丢帧。
- 检查缓冲区管理:确保CPU处理速度跟得上数据接收速度。如果RxBD链表中的所有BD的
E位都为0(即全部已满),而新数据又来了,UCC会设置UCCE[BSY](繁忙)位并停止接收,直到有新的E=1的BD可用。这会导致丢帧。确保中断服务程序或后台任务能及时处理完数据并将BD重新置为E=1。 - 调整
UPSMR[NOS]:在噪声较大的环境中,可以增加NOS值,让发送器在帧间发送更多的SYNC字符对,给接收器更充分的同步时间。 - 检查物理层:信号质量、阻抗匹配、终端电阻等物理层问题永远是排查通信问题的首要环节。
- 检查缓冲区管理:确保CPU处理速度跟得上数据接收速度。如果RxBD链表中的所有BD的
调试BISYNC这类同步协议,逻辑分析仪或支持高级协议解码的示波器是必不可少的工具。它们可以直观地展示线上的SYNC字符、数据字节、控制字符和BCS,帮助你快速定位是配置问题、数据问题还是时序问题。