MPC8260 SCC透明模式:从硬件配置到同步与CRC的工程实践
1. MPC8260 SCC透明模式:从硬件手册到工程实践
如果你在嵌入式通信领域摸爬滚打过几年,尤其是在处理PowerPC架构的处理器时,大概率绕不开Freescale(现NXP)的MPC8260 PowerQUICC II。这颗芯片的通信处理模块(CPM)集成了多个串行通信控制器(SCC),功能强大但也足够复杂。今天我们不聊那些封装好的协议,比如HDLC或UART,我们来深挖一下SCC的“透明模式”(Transparent Mode)。这个模式听起来简单——不就是透传数据吗?但当你真正需要用它来实现一个稳定可靠的、比特级的自定义串行通信链路时,你会发现手册里那些关于同步、CRC和错误处理的寄存器配置,每一个比特位都藏着魔鬼。我花了相当长的时间,在几个工业控制项目里用这个模式对接过各种非标设备,踩过的坑和总结出的经验,希望能帮你少走弯路。
透明模式的核心价值在于“无协议干预”。它不像HDLC那样自动插入标志位,也不像UART那样有固定的起始/停止位。它就是把你的内存缓冲区数据,按照你设定的时钟,一个比特一个比特地“吐”到线上,同时把线上来的比特流原样收进来。这给了你极大的灵活性,可以用来实现专有的同步串行协议、模拟某些老旧设备的接口,或者进行底层的数据抓取和分析。但灵活性带来的代价是,所有的帧同步、数据对齐和错误检查,都需要你亲自通过配置SCC的寄存器来指挥硬件完成。这就像给你一辆没有ABS和ESP的赛车,速度可以很快,但每一个弯道都需要你精准操控。
2. 透明模式的核心设计思路与配置哲学
2.1 透明模式为何存在:在灵活性与复杂性间寻找平衡
在嵌入式通信中,我们常常遇到一些“非标准”场景。比如,你需要与一个使用自定义同步串行协议的传感器通信,或者要模拟一个旧的、文档不全的通信接口。使用标准的协议控制器(如UART、SPI)可能无法满足其特殊的同步或成帧要求。这时,SCC的透明模式就派上了用场。它本质上是一个高度可配置的串行移位寄存器,将数据收发过程的控制权几乎完全交给了软件开发者。
这种设计的思路是:硬件提供最基础的比特流收发能力(移位、时钟、FIFO),以及一套丰富的“触发器”和“状态机”(通过寄存器配置),而由开发者来定义什么是“一帧的开始”、什么是“一帧的结束”、如何计算校验和。因此,理解透明模式,就是理解如何通过配置GSMR(通用SCC模式寄存器)、DSR(数据同步寄存器)、PSMR(协议特定模式寄存器,在透明模式下基本不用)以及一系列参数RAM和缓冲区描述符(BD),来“教”SCC硬件识别你的数据帧格式。
2.2 全局配置基石:GSMR寄存器详解
GSMR是控制SCC行为的核心,分为高32位(GSMR_H)和低32位(GSMR_L)。在透明模式下,几乎所有关键特性都在这里开关。我们先看几个最关键的位域,这直接决定了你的通信链路能否建立。
GSMR_H[SYNL](同步模式长度):这是同步机制的“总开关”。它决定了SCC如何识别一帧数据的开始。
00:使用外部同步信号(CD和CTS引脚),而非DSR中的同步码。这是最常用的方式之一,尤其在与外部设备进行硬件握手时。01:使用4比特的内联同步码。SCC会在接收数据流中连续匹配这4个比特后,开始将后续比特存入缓冲区。10:使用8比特内联同步码。11:使用16比特内联同步码。
注意:选择内联同步码时,务必记住手册里的重要提示:发送方不会自动在数据前插入同步码。你必须手动将同步码作为数据的一部分,放在发送缓冲区的最开头。否则,接收方将永远等不到同步信号,导致通信失败。这是一个非常常见的初学者的坑。
GSMR_H[TCRC](发送CRC模式) & GSMR_H[RCRC](接收CRC模式):它们控制是否在帧尾添加或校验CRC。虽然手册表格里有时只列出了TCRC,但接收端同样需要配置以进行CRC计算和检查。CRC的计算标准(如CRC-CCITT、CRC-16)则由参数RAM中的CRC_P(预设值)和CRC_C(常数)决定。
GSMR_H[REVD](数据反转):这个位非常关键,它决定了比特序。当REVD=0时,数据按非反转(Normal)顺序处理,即数据的LSB(最低有效位)先发送/接收。当REVD=1时,数据按反转(Reversed)顺序处理,即MSB(最高有效位)先发送/接收。这必须与对端设备严格匹配,否则你收到的将是一堆乱码。很多通信问题追查到最后,发现都是这个位设反了。
GSMR_H[RFW](接收FIFO宽度):设置接收FIFO在存满多少比特后向DMA发起一次传输请求。可以是8比特(1字节)或32比特(4字节)。这会影响总线效率和实时性。对于低速或数据量小的应用,8比特即可;对于需要高吞吐量的场景,设置为32比特可以减少中断次数,提升效率。
GSMR_L[DIAG](诊断模式):这个字段用于设置回环测试。
00:正常操作。01:自动回环(Local Loopback),发送端数据直接环回到接收端,用于测试SCC自身功能。10:仅限TDM接口的回环。11:保留。
在调试阶段,强烈建议先使用自动回环模式,验证你的软件配置、BD表和中断处理逻辑是否正确,排除了硬件线路问题。
GSMR_L[ENT](使能发送) & GSMR_L[ENR](使能接收):最后的“闸门”。务必在配置好所有其他参数(时钟、同步模式、BD表等)之后,最后再置位这两个比特来启动收发器。错误的启动顺序可能导致不可预知的行为。
2.3 参数RAM与缓冲区描述符:数据流转的指挥官
SCC不直接操作你的应用数据缓冲区,而是通过一个叫做缓冲区描述符(Buffer Descriptor, BD)的数据结构来管理。这是一个位于CPM内部双口RAM中的链表(或表格)。每个BD包含一个状态控制字、数据长度和指向实际数据缓冲区的指针。
发送BD(TxBD)的关键字段:
- R (Ready):软件置1,表示该BD及其指向的缓冲区已准备好发送。硬件发送完成后会将其清零。
- L (Last):置1表示这是当前帧的最后一个缓冲区。发送完这个缓冲区后,如果
TxBD[TC]=1,硬件会自动附加CRC,然后等待新的同步信号才能发送下一帧。 - TC (Transmit CRC):置1表示在本缓冲区数据发送完毕后,硬件应自动计算并发送CRC校验码。
- CM (Continuous Mode):连续模式。置1时,硬件在发送完本BD后不会清除
R位,而是会立即重新发送本缓冲区的内容。这在需要发送固定、重复的测试图案时非常有用。
接收BD(RxBD)的关键字段:
- E (Empty):软件置1,表示该BD及其指向的缓冲区为空,可供硬件接收数据。硬件接收满或出错后会将其清零。
- L (Last):由硬件置1,表示此缓冲区是当前帧的最后一个缓冲区。触发条件可能是外部CD信号丢失或发生错误。
- F (First):由硬件置1,表示此缓冲区是当前帧的第一个缓冲区。
- CM (Continuous Mode):连续模式。置1时,硬件在收满本BD后不会清除
E位,而是会覆盖本缓冲区继续接收。这可以用于实现一个“环形缓冲区”,但需小心处理数据覆盖和帧边界识别。
参数RAM中,对于透明模式,最重要的是CRC_P和CRC_C。它们必须根据你选择的CRC算法进行初始化。例如,对于16位CRC-CCITT(多项式0x1021),CRC_P通常初始化为0x0000FFFF,CRC_C初始化为0x0000F0B8。这里的“预设值”和“常数”是硬件CRC生成器/校验器的初始值和最终异或值,填错了CRC校验必然失败。
3. 同步机制:让收发双方“对齐”的艺术
透明模式下没有固定的帧头,因此“同步”(Synchronization)是确保收发双方能从正确的比特位置开始解读数据流的第一道,也是最重要的一道关卡。MPC8260提供了两种主要的同步方式,理解其原理和适用场景至关重要。
3.1 内联同步模式:在数据流中嵌入“暗号”
这种方式要求你在发送的数据流中,预先插入一段特殊的比特模式(同步码)。接收方的SCC被配置为持续监视输入比特流,一旦连续检测到与DSR寄存器中预设的码型完全匹配的序列,就认为同步已建立,紧接着的下一个比特即被视为有效数据的开始。
配置要点:
- 设置GSMR_H[SYNL]:根据同步码长度,设置为
01(4位)、10(8位)或11(16位)。 - 编程DSR寄存器:将你选定的同步码写入
DSR。注意,码型是左对齐还是右对齐,以及比特序(受REVD影响)需要仔细确认。通常,先发送/接收的比特对应DSR的最高位(如果REVD=0)。 - 发送缓冲区包含同步码:这是最关键的步骤!你必须确保发送缓冲区的前几个字节就包含了这个同步码。例如,你设置了8位同步码
0xAA(二进制10101010),那么你待发送数据的第一个字节必须是0xAA。
一个常见的误解与陷阱:开发者常常认为设置了SYNL和DSR,硬件就会自动在每帧前加同步码。事实并非如此。硬件只负责“识别”,不负责“插入”。因此,你的应用层协议设计必须包含这个同步头。
适用场景:适用于点对点、数据流中允许插入固定开销的场合。其优点是无需额外的硬件连线(只需要数据线、时钟线和地线)。缺点是同步码会占用有效带宽,且同步码本身不能在有效数据段中出现,否则会引起假同步。因此需要选择在数据中出现概率极低的码型,如0x55、0xAA或其组合。
3.2 外部同步信号:硬件握手控制帧边界
这是更可靠、更常用的方式,尤其在全双工或需要明确帧控制的系统中。它利用SCC的CD(Carrier Detect,载波检测)和CTS(Clear To Send,清除发送)引脚作为同步控制信号。
配置逻辑:
- 接收同步:通过
CD引脚。当GSMR_H[CDP]=0(脉冲模式)时,CD引脚的一个下降沿(从高到低)会触发接收器开始将后续比特存入当前RxBD。当CD引脚变高时,接收器会关闭当前RxBD(并置位L位),并等待下一个下降沿。如果CDP=1(电平模式),则CD为低电平时持续接收,变高时停止。 - 发送同步:通过
CTS引脚。当GSMR_H[CTSP]=0时,CTS引脚为低电平是发送器开始发送数据的必要条件。如果发送过程中CTS变高,会触发CTS Lost错误并停止发送。
GSMR_H[CDP]和GSMR_H[CTSP]的选择:
- 脉冲模式(Pulse):
CDP/CTSP = 0。控制信号只需一个边沿(对于接收)或一个短暂的低电平脉冲(对于发送)即可启动流程,之后数据流可以连续传输。这适用于需要传输连续数据块,而由外部设备通过一个脉冲来指示每个数据块开始和结束的场景。 - 电平模式(Envelope):
CDP/CTSP = 1。控制信号必须在整个帧传输期间保持有效(低电平)。这提供了更严格的硬件流控,确保每一帧都在明确的硬件信号控制下。
GSMR_H[CDS]和GSMR_H[CTSS]的选择:这两个位决定CD和CTS信号是同步于数据时钟还是异步。
- 同步(Synchronous):
CDS/CTSS = 1。信号与数据时钟同步,响应延迟小,时序更精确。 - 异步(Asynchronous):
CDS/CTSS = 0。信号在SCC内部被同步化,适用于信号与数据时钟不同源的场景,但会引入几个时钟周期的延迟。
实操心得:在大多数自定义协议中,我推荐使用脉冲模式。发送方在准备好一帧数据后,可以主动控制RTS(Request To Send)引脚输出一个低脉冲给接收方的CD引脚,从而启动对方接收。同时,接收方也可以用自己的RTS(作为CTS功能)来控制发送方。如图24-1所示的互连方式(RTS接对方的CD)就是一种经典的点对点全双工硬件流控接法。这种方式帧边界清晰,软件处理简单。
3.3 无显式同步的“伪同步”技巧
手册第24.4.1.3节提到,如果不需要在特定点同步,可以通过软件“伪造”同步。这听起来有点“黑科技”,但在某些简单测试或内部回环中非常有用。
方法一:软件操纵I/O引脚。将CTS和CD引脚配置为普通的并行I/O口,并在使能收发器后,在软件中控制该I/O引脚产生一个下降沿。这相当于用软件模拟了一个硬件同步信号。
方法二:利用回环模式切换。先将SCC配置为回环模式(DIAG=01)并启用收发器,然后在运行时将DIAG改为正常模式(00)。这种切换过程可能会在内部触发一个同步事件。
警告:这两种方法都是非标准的“Hack”,严重依赖于特定芯片版本和时钟状态,时序难以保证,绝不推荐用于正式产品。仅可作为前期快速功能验证的权宜之计。
3.4 使用时隙分配器时的同步考量
当SCC通过TDM(时分复用)接口与外部时隙分配器(TSA)连接时,同步行为有所不同。TSA本身提供了基于时隙的帧同步。此时,SCC可以:
- 继续使用内联同步模式:在TDM提供的时隙框架内,再用一个特定的数据模式作为子帧的起始标记。
- 使用固有同步:将
GSMR_H[CDP, CDS, CTSP, CTSS]都置位。这告诉SCC,一旦TDM通道被启用,就默认已经同步,直接接收所有来自TDM的数据。这里有一个重要提示:手册提到,新启用的发送器由于TDM启动要求,会先发送10到15帧的0xFF空闲字符,然后才是真实数据。在做TDM回环测试时,一定要在接收端预留空间或编程时忽略这些前导空闲字节,否则会导致数据错位。
4. CRC计算与校验:数据的“指纹”验证
在透明模式下,CRC(循环冗余校验)是保证数据完整性的主要手段。SCC硬件自动完成计算,极大减轻了CPU负担。
4.1 CRC的配置与计算流程
- 选择算法:通过
GSMR_H[TCRC]选择发送CRC的位数(如16位或32位)。接收端会自动进行相同位数的校验。 - 初始化参数:在SCC参数RAM中设置
CRC_P和CRC_C。这两个值决定了CRC生成多项式和初始值。- CRC_P (CRC Preset):发送CRC计算的初始值,也是接收CRC校验器的初始值。
- CRC_C (CRC Constant):接收端在完成一帧数据CRC计算后,会将结果与此常数进行比较。如果相等,则认为CRC正确;否则,
RxBD[CR]位会被置位。
- 数据反转的影响:
GSMR_H[REVD]位至关重要。它控制数据在CRC计算前是否进行比特反转。- 当
REVD=0(非反转)时,数据流的LSB先进入CRC计算器。 - 当
REVD=1(反转)时,数据流的MSB先进入CRC计算器。 - 无论数据是否反转,最后附加到帧尾的CRC字节,总是以MSB优先的方式发送。这一点必须理解,否则对端设备校验会失败。
- 当
- 发送流程:当
TxBD[TC]=1时,硬件在发送完该BD缓冲区内的所有数据后,会自动计算CRC并附加到数据流末尾。 - 接收流程��接收硬件对每个进入的比特(包括数据位和CRC位)进行实时CRC计算。一帧结束后,将计算结果与
CRC_C比较,并更新RxBD[CR]状态位。
4.2 常见CRC标准配置示例
以下是一些常用CRC标准的参数RAM配置(假设REVD=0):
| CRC标准 | 多项式(Hex) | CRC_P (初始值) | CRC_C (最终异或值/常数) | 备注 |
|---|---|---|---|---|
| CRC-16 (IBM) | 0x8005 | 0x00000000 | 0x00000000 | 常用于Modbus等协议。注意是CRC-16,非CCITT。 |
| CRC-16-CCITT | 0x1021 | 0x0000FFFF | 0x0000F0B8 | 最常用的16位CRC,用于X.25, HDLC, Bluetooth等。 |
| CRC-32 (IEEE 802.3) | 0x04C11DB7 | 0xFFFFFFFF | 0xDEBB20E3 | 用于Ethernet, ZIP, PNG等。 |
避坑指南:CRC配置错误是透明模式调试中最头疼的问题之一,因为症状可能仅仅是偶尔的校验错误,难以定位。务必确认三点:1) 你选择的CRC标准是否与对端设备一致;2)
CRC_P和CRC_C的值是否正确;3)REVD位是否与对端设备的数据比特序匹配。强烈建议在项目初期,编写一个简单的回环测试程序,发送固定的已知数据,然后检查接收BD中的CRC标志位,并打印出接收到的原始数据和CRC值,与软件计算的结果进行比对。
5. 错误处理与诊断:构建鲁棒的通信链路
透明控制器通过缓冲区描述符(BD)的状态位、事件寄存器(SCCE)和错误计数器来报告错误。及时、正确地处理这些错误是保证通信可靠性的关键。
5.1 发送端错误
发送器欠载 (Transmitter Underrun):
- 标志位:
TxBD[UN]被置位,同时SCCE[TXE]可能产生中断。 - 原因:CPM的SDMA通道未能及时将下一个待发送数据从内存加载到SCC的发送FIFO中,导致FIFO变空,发送中断。这通常是因为系统总线过于繁忙,或者发送BD链表的
R位没有及时置位(软件准备数据太慢)。 - 硬件行为:立即停止发送当前缓冲区,刷新发送FIFO。当前
TxBD的R位被清除,但TBPTR(发送BD指针)不会自动指向下一个BD。发送通道进入停止状态。 - 软件处理:
- 检查系统负载,优化DMA或内存访问。
- 确保在上一帧数据发送完成前,就准备好下一帧数据的BD并置位
R。 - 必须向CPM发送
RESTART TRANSMIT命令,才能重新启动发送通道。发送会从当前TBPTR指向的BD(即发生欠载的那个BD)重新开始。你需要判断是重发该BD的数据,还是跳过它发送新的数据。
- 标志位:
CTS丢失 (CTS Lost):
- 标志位:
TxBD[CT]被置位,同时SCCE[TXE]可能产生中断。 - 原因:在发送过程中,
CTS引脚信号变为无效(高电平)。这表明对端设备或线路条件不允许继续发送。 - 硬件行为:与欠载类似,停止发送当前缓冲区,关闭该BD。发送通道停止。
- 软件处理:
- 检查硬件连接,确认
CTS信号是否受到干扰。 - 检查对端设备状态。
- 同样需要发送
RESTART TRANSMIT命令来恢复发送。
- 检查硬件连接,确认
- 标志位:
5.2 接收端错误
接收过载 (Overrun):
- 标志位:
RxBD[OV]被置位,同时SCCE[RXB]可能产生中断。 - 原因:接收FIFO已满,但CPM的SDMA通道未能及时将数据取走到内存,导致新到的数据覆盖了未取走的数据。这是最严重的接收错误,意味着数据丢失。
- 硬件行为:关闭当前
RxBD,接收器立即进入** Hunt 模式**(寻找新的同步)。 - 软件处理:
- 提高处理优先级:这是最直接的解决办法。确保接收中断的服务例程(ISR)执行速度足够快,或者使用更大的接收缓冲区(
MRBLR)和更多的BD,为软件争取更长的处理时间。 - 检查
GSMR_H[RFW]设置。如果设为32位,意味着FIFO攒够4字节才触发一次DMA,如果数据流速很快但单帧数据量小,可能不效率。可以尝试改为8位。 - 优化内存访问,确保DMA通道畅通。
- 提高处理优先级:这是最直接的解决办法。确保接收中断的服务例程(ISR)执行速度足够快,或者使用更大的接收缓冲区(
- 标志位:
CD丢失 (CD Lost):
- 标志位:
RxBD[CD]被置位,同时SCCE[RXB]可能产生中断。 - 原因:在接收过程中,
CD引脚信号丢失(变为高电平)。在使用外部同步信号时,这通常表示一帧数据结束。 - 硬件行为:关闭当前
RxBD,并置位其L位,表示这是帧的最后一个缓冲区。接收器立即进入** Hunt 模式**。 - 软件处理:这不一定是一个“错误”,而可能是一个正常的帧结束指示。在中断服务程序中,你需要检查
RxBD[CD]和RxBD[L],如果它们同时被置位且没有其他错误标志(如OV,CR),则表明一帧数据已正常接收完毕。软件应处理该帧数据,并重新准备好一个空的RxBD(置位E)以供下次使用。
- 标志位:
CRC错误 (CRC Error):
- 标志位:
RxBD[CR]被置位。 - 原因:接收到的数据的CRC校验值与预期不符。
- 硬件行为:正常关闭BD,不一定会产生单独的中断(依赖于
SCCM对RXB的配置)。 - 软件处理:丢弃该帧数据,并可能需要进行错误计数。需要排查线路噪声、地线问题、时钟抖动,或者双方CRC配置不一致的问题。
- 标志位:
非字节对齐 (Non-octet Alignment):
- 标志位:
RxBD[NO]被置位。 - 原因:接收到的帧的比特总数不是8的整数倍。在透明模式下,数据是按比特收发的,但存入内存时是按字节组织的。如果一帧的比特数不是8的倍数,最后一个字节会有部分比特无效。
- 硬件行为:正常关闭BD。
- 软件处理:根据你的协议决定。有些协议允许非字节对齐的帧。如果需要,你可以通过数据长度字段和
NO标志来计算出有效的比特数。
- 标志位:
5.3 事件寄存器与中断管理
SCC事件寄存器(SCCE)和掩码寄存器(SCCM)是管理中断的关键。
SCCE[TXB]:发送缓冲区完成。当TxBD[L]=1的缓冲区开始发送最后一个字节时置位。这是一个“发送完成”通知,而不是“发送成功”通知。SCCE[RXB]:接收缓冲区满。当一个接收缓冲区被填满或因为帧结束(CD丢失)而关闭时置位。SCCE[TXE]:发送错误。当发生发送器欠载或CTS丢失时置位。SCCE[GRA]:优雅停止完成。当执行GRACEFUL STOP TRANSMIT命令后,发送器完成当前帧时置位。
中断服务程序(ISR)最佳实践:
- 读取
SCCE寄存器值,保存到本地变量。 - 立即向
SCCE寄存器写入相同的值(写1清零对应位),以清除中断源。这是CPM事件寄存器的典型操作方式。 - 根据本地保存的事件标志,分别处理。
- 如果是
RXB,遍历接收BD链表,找到所有E=0的BD,读取数据,处理帧,然后将BD重新初始化(E=1)并链接回链表。 - 如果是
TXB,遍历发送BD链表,找到所有R=0的BD,表示这些BD已完成发送,可以释放或重用其数据缓冲区。 - 如果是
TXE,必须检查TxBD[UN]和TxBD[CT]来确定具体错误,并执行恢复操作(如重发、记录错误日志),最后必须发送RESTART TRANSMIT命令。
- 如果是
- 确保ISR执行效率高,避免长时间关中断,防止接收过载。
6. 实战编程示例与深度解析
让我们结合手册第24.14节的示例,拆解一个完整的SCC2透明模式初始化序列,并补充手册未明说的细节和潜在陷阱。
场景:实现两个MPC8260之间通过SCC2进行透明数据传输,使用外部时钟(CLK3),采用RTS/CD硬件握手,CRC-CCITT校验。
6.1 初始化步骤精讲
配置端口引��:这是硬件连接的基础。示例中配置了Port D的TXD2、RXD2、RTS2,以及Port C的CTS2、CD2和CLK3。关键在于正确设置引脚复用(
PPAR)、方向(PDIR)和开漏(PSOR)。例如,将CTS2配置为输入且内部上拉无效(或外部接地),是因为在本例中它未被使用,但必须将其置于已知状态,避免浮空输入导致意外。配置时钟路由:通过
CMXSCR寄存器,将BRGO3或外部CLK3连接到SCC2的接收和发送时钟源。示例中CMXSCR[R2CS]和CMXSCR[T2CS]设置为0b110,选择CLK3。务必确认你选择的时钟源有正确的频率和稳定性。设置参数RAM基址:
RBASE和TBASE必须指向双口RAM内对齐的地址。示例中设置为0x0000和0x0008,意味着接收BD表从0开始,发送BD表从8开始(一个BD占8字节)。你需要根据你的内存规划来设置。执行CPM初始化命令:通过写
CPCR寄存器,发送INIT RX AND TX PARAMETERS命令(命令码0x0041)。在这之前,需要先执行一个STOP TRANSMIT命令(0x04A1_0000)吗?示例中第7步写入了这个值,但注释是“execute INIT RX AND TX PARAMETERS”,这里似乎有歧义。实际上,0x04A1_0000是停止SCC2发送的命令。安全的做法是:在初始化任何通道前,先发送STOP命令确保通道静止,然后再发送INIT命令重置参数。配置FIFO和缓冲区:
RFCR/TFCR设置为0x10表示正常操作(非摩托罗拉总线模式)。MRBLR定义了每个接收缓冲区的最大字节数,这里设为16。这个值需要权衡:太小会导致频繁中断,增加CPU负载;太大会增加单次中断的延迟,可能引发过载。配置CRC参数:如前述,写入
CRC_P=0x0000FFFF和CRC_C=0x0000F0B8对应CRC-CCITT。初始化BD表:
- 接收BD:状态字
0xB000。分解:E=1(空,CPM可写),W=0(非最后BD),I=1(缓冲区满时产生中断),L=0,F=0,CM=0(非连续模式)。缓冲区指针指向0x00001000。 - 发送BD:状态字
0xBC00。分解:R=1(就绪),W=0,I=1(发送完成中断),L=1(本缓冲区是帧的最后一个),TC=1(发送CRC),CM=0。数据长度5,指针指向0x00002000,该地址应存放5字节待发数据。 - 注意:示例中只准备了一个接收BD和一个发送BD。在实际应用中,这极其危险。一旦接收了一个超过16字节的帧,或者软件未能及时处理完已满的BD,就会立刻发生“Busy”错误(
SCCE[BSY]被置位),导致后续数据丢失。必须实现一个BD环(链表),通常准备4-8个BD,并通过W位将最后一个BD指回第一个BD。
- 接收BD:状态字
配置中断:清除
SCCE中所有旧事件(写0xFFFF)。设置SCCM=0x0013,即允许TXE、TXB、RXB事件产生中断。同时需要在SIU级别使能SCC2的中断。配置GSMR——最关键的一步:
GSMR_H2 = 0x0000_1980。我们解析一下:SYNL=00(外部同步),TCRC=11(16位CRC),REVD=0(数据不反转),RFW=00(8位FIFO?这里与示例文本可能不符,需根据实际需求设定),ENT=1,ENR=1(注意,手册示例是分两步写的,先写0x0000_1980可能未包含使能位,第二步写GSMR_L2时才使能)。需要查寄存器定义确认。GSMR_L2 = 0x0000_0000。设置DIAG=00(正常模式),CTSS=1,CDS=1(同步模式),CTSP=0,CDP=0(脉冲模式)。注意,此时ENT和ENR为0,收发器未启动。GSMR_L2 = 0x0000_0030。这次写入的目的是单独设置ENT和ENR位为1,从而在最后时刻启动收发器。这是一种良好的实践,避免在配置未完成时意外开始收发数据。
6.2 数据收发流程与软件协同
初始化完成后,通信流程如下:
发送流程:
- 应用层将数据填入发送缓冲区(例如
0x00002000)。 - 更新对应
TxBD的数据长度字段。 - 置位该
TxBD的R位和L位(如果是帧尾)。 - CPM检测到
R=1的BD,开始通过SDMA读取数据,送入SCC发送FIFO。 - 在获得同步(如
CTS有效)后,SCC将数据串行移出。 - 发送完缓冲区数据及CRC后,CPM清除该BD的
R位,如果I=1则触发TXB中断。 - 软件在
TXB中断中,发现R=0的BD,即可释放或重用该缓冲区。
接收流程:
- 软件预先准备多个
RxBD,均置E=1,并链接成环。 - 当有效的
CD信号下降沿到来,SCC开始接收比特流。 - 数据填满一个BD的缓冲区(或
CD信号丢失),CPM清除该BD的E位,如果I=1则触发RXB中断。 - 软件在
RXB中断中,遍历BD环,找到E=0的BD。 - 从该BD读取数据长度和状态(检查
L,CR,OV,CD等)。 - 处理数据。如果是帧尾(
L=1)且无错误,则交付给上层协议。 - 将该BD重新初始化(
E=1,数据长度清零或忽略),放回BD环中。
6.3 高级话题与性能优化
- BD环的动态管理:不要使用静态的、固定数量的BD。可以实现一个基于链表的动态BD池。当应用层消费数据的速度快于接收速度时,池中空闲BD多;反之,则可能需要动态分配更多BD,防止
BSY错误。 - 使用DMA链式传输:对于大数据量传输,可以配置SDMA使用链式(Chained)传输模式,让CPM自动从内存中读取多个分散的数据缓冲区组成一帧发送,或者将接收到的数据分散存储到多个缓冲区,减少内存拷贝。
- 时钟与波特率精度:透明模式的波特率完全由外部时钟(
CLKx)或BRG输出决定。确保时钟精度满足通信要求。对于高速通信,还需要考虑时钟的抖动和占空比。 - 电源与噪声管理:透明模式常用于长距离或工业环境,对信号完整性敏感。确保电源干净,使用正确的终端电阻,并考虑在
TXD/RXD线上添加适当的滤波或保护电路。 - 调试技巧:
- 示波器/逻辑分析仪是必备的:直接观察
TXD、RXD、CLK、RTS、CTS、CD的波形,是排查同步、时序问题的最直接手段。 - 充分利用回环模式:先在内环(
DIAG=01)模式下测试,确保软件驱动、BD管理和中断处理逻辑正确。 - 打印寄存器状态:在关键节点(如初始化后、中断发生时、错误发生时)打印
GSMR、SCCE、SCCS以及当前BD的内容,能快速定位配置错误或状态机异常。 - 编写诊断帧:发送固定的、有规律的测试帧(如递增计数器),在接收端验证数据的完整性和顺序,可以有效定位CRC、比特序、同步等问题。
- 示波器/逻辑分析仪是必备的:直接观察
透明模式是MPC8260 CPM中一个强大而灵活的工具。它把底层的复杂性暴露给了开发者,同时也给予了开发者最大的控制权。吃透其同步、CRC和错误处理机制,你就能驾驭这种复杂性,在各种非标准通信场景中游刃有余。记住,耐心和细致的调试是成功的关键,从最小配置开始,逐步增加功能,并善用硬件提供的状态信息来引导你的调试过程。
