1. 项目概述深入MPC857T的串行通信核心在嵌入式通信处理器的世界里Freescale现NXP的PowerQUICC系列处理器一直是构建路由器、网关和工业控制设备的基石。这类设备的核心任务之一就是高效、可靠地处理多种多样的串行通信协议。MPC857T作为该家族的一员其串行接口SI和串行通信控制器SCC的设计直接决定了系统与外部世界如调制解调器、串行总线、专用网络对话的能力。很多工程师在初次接触其数据手册时往往会被其中繁多的寄存器位和复杂的时钟路由选项所困扰配置不当会导致通信不稳定、数据错误甚至接口无法工作。本文旨在充当一位“引路人”基于MPC857T用户手册的原始资料为你彻底拆解其串行接口特别是非复用串行接口NMSI模式下的配置逻辑以及SCC控制器的核心寄存器设置。我不会止步于翻译手册而是结合多年在通信设备开发中的实战经验解释每一个关键配置位背后的设计意图、不同选择带来的实际影响以及那些手册里不会明说、但能让你少走弯路的“坑”。无论你是正在为MPC857T编写底层驱动还是在设计基于该芯片的硬件原理图这篇文章都将提供从原理到实操的完整视角。2. NMSI模式为SCC和SMC开辟独立通道2.1 NMSI的核心价值与设计思路MPC857T的串行接口单元支持两种主要模式时分复用TDM模式和非复用串行接口NMSI模式。TDM模式允许多个串行通道如多个SCC或SMC共享同一组物理引脚和时序通过时分复用的方式交替传输数据这在E1/T1、ISDN等需要多路复用的场景中非常高效。然而TDM模式引入了复杂的时隙分配和同步逻辑。相比之下NMSI模式的设计哲学是“简单直接”。它为特定的串行控制器如SCC1、SMC1、SMC2分配了专属的物理引脚。例如SCC1在NMSI模式下直接使用TXD1、RXD1、RTS1、CTS1、CD1、TCLK1、RCLK1这一组引脚。这种方式的优势非常明显硬件连接简单软件配置直观时序路径独立避免了TDM总线上的仲裁和竞争延迟。对于只需要单个或少数几个独立串行通道的应用例如一个UART调试口、一个HDLC链路连接外部调制解调器NMSI模式通常是更优、更稳定的选择。注意选择NMSI还是TDM是硬件设计阶段就需要确定的顶层决策。一旦PCB板上将某个SCC的引脚用作其他功能如通用GPIO再想切换到NMSI模式就需要硬件改板。因此在原理图设计时务必根据产品需求预留足够的引脚灵活性。2.2 时钟架构灵活的“时钟银行”系统串行通信的基石是时钟。MPC857T为NMSI模式设计了一套非常灵活且强大的时钟系统称为“时钟银行”Bank-of-Clocks。理解这套系统是正确配置串行接口的关键。时钟来源SCC或SMC的收发时钟可以来自两个源头四个内部波特率发生器BRG1-BRG4这是最常用、最稳定的内部时钟源。八个外部时钟引脚CLK1-CLK8用于接入外部系统或芯片提供的时钟信号。“时钟银行”的妙处系统并没有硬性规定“SCC1的发送时钟必须来自BRG1”或“必须来自CLK2引脚”。相反它提供了一个选择矩阵。例如SCC1的发送时钟TCLK1可以从BRG1-BRG4或CLK1-CLK8这总共8个源中任选一个其接收时钟RCLK1也有同样的8选1自由度。SMC的时钟选择范围类似但具体可用的CLK引脚组可能不同如SMC2使用CLK5-CLK8。这种设计带来了两大核心优势极高的灵活性你可以根据板级时钟资源分布自由地为每个串行通道分配合适的时钟源。例如如果板上有两颗晶振一颗25MHz给系统主频另一颗1.8432MHz专为UART设计你就可以将后者连接到CLK2引脚并配置SCC1的UART模式时钟源为CLK2从而获得精确的标准波特率如115200而不受系统主频分频误差的影响。时钟共享与引脚节约如果多个串行通道需要相同的波特率例如多个UART接口都跑115200bps你可以让它们共享同一个BRG或外部CLK引脚作为时钟源。这样既保证了时钟同源、减少频偏又释放了其他BRG或CLK引脚用于其他功能同时也避免了多个独立时钟源带来的微小偏差Skew问题。配置寄存器SCC的时钟源选择在SI时钟路由寄存器SICR中完成而SMC的时钟源选择则在SI模式寄存器SIMODE中设置。这是配置的第一步务必先查表确定你打算使用的物理引脚TCLK1/RCLK1/SMCLKx对应到哪个内部信号名再在相应寄存器中映射到具体的BRG或CLK源。2.3 关键限制与配置陷阱灵活性的背后也存在着必须遵守的规则忽视它们会导致配置失败。时钟源数量限制虽然“时钟银行”逻辑上有多个源但对于SCC实际上只有8个时钟源可以连接到其接收器或发射器。这通常意味着从BRG1-4和CLK1-8中最多只能有8个不同的时钟可以被SCC的Rx或Tx使用。在规划复杂系统时需要注意。SMC的时钟约束当SMC连接到NMSI时其发射器和接收器必须使用相同的时钟源即SMCLKx同时用于收和发。这与SCC可以分别选择收、发时钟不同在配置SMC时这是一个硬性规定。引脚复用冲突NMSI引脚如TXD1,RXD1可能与端口A/B/C的并行I/OGPIO功能复用。你必须通过相应的并行I/O控制寄存器将相关引脚的功能设置为“串行接口”而非“GPIO”否则信号无法输出到引脚上。这是一个非常常见的低级错误表现为“软件配置正确但示波器测不到波形”。物理连接匹配选择了内部BRG作为时钟源并不意味着时钟信号会自动出现在物理引脚上。如果你需要将BRG产生的时钟输出给外部芯片使用需要额外配置将BRGOn信号路由到特定的引脚同样涉及引脚复用配置并使能该输出。3. 波特率发生器BRG精准时钟的引擎3.1 BRG的工作原理与配置寄存器解析波特率发生器是产生精准串行时钟的核心。MPC857T的CPM通信处理器模块提供了四个独立的、功能相同的BRGBRG1-BRG4。每个BRG都可以被一个或多个SCC/SMC共享。其工作原理是一个可编程的分频器。如图20-22所示BRG的输入时钟源BRGCLK,CLK2,CLK6经过一个可选的16分频预分频器由DIV16位控制再送入一个12位的计数器进行分频分频值由CD[0:11]字段设定范围1-4096。最终产生的时钟既可供内部“时钟银行”使用也可通过BRGOn引脚输出。BRG配置寄存器BRGCn是控制这一切的总开关。我们逐位分析其关键字段EN位15BRG使能位。这是总开关必须置1BRG才开始计数。在进入低功耗模式前可通过清零此位关闭BRG以省电。RST位14软件复位位。写1会产生一个与硬件复位相同的效果停止BRG计数并将BRGO输出驱动为高电平。常用于初始化或重新配置BRG前确保其处于已知状态。EXTC[16:17]外部时钟源选择。00 内部BRGCLK由SIU时钟合成器产生01CLK2引脚10CLK6引脚。选择外部引脚时需注意CLK2/CLK6信号在进入BRG前没有经过内部同步这意味着外部时钟的毛刺可能会直接影响BRG输出要求外部时钟质量较高。DIV16位3116分频预分频选择。0 不分频1 16分频。这个位用于在系统频率很高时产生较低的波特率。因为12位计数器CD的最大分频比为4096如果系统时钟是100MHz不分频时最低只能产生约24.4kHz的时钟。启用16分频后最低可产生约1.5kHz的时钟极大地扩展了低速波特率的支持范围。CD[19:30]时钟分频值。这是12位的主分频系数实际分频比为CD 1。因此可设置的分频范围是1到4096。计算波特率时切记是CD1。ATB位18自动波特率使能位仅BRG1有效。这是UART模式下一个非常实用的功能。当使能后BRG1会通过监测RXD1引脚上起始位的长度自动计算并设置正确的分频值CD和DIV16实现波特率自动匹配。这在对接未知波特率的设备时极为有用。3.2 波特率计算从公式到实例波特率的计算是配置的难点但掌握公式后便一目了然。手册给出了通用公式我们需要根据通信模式异步/同步和协议选择如UART的过采样率来具体应用。对于异步通信如UART异步波特率 (BRG输入时钟频率) / (DIV16 ? 16 : 1) / (CD 1) / (过采样率)其中过采样率由SCC通用模式寄存器低半部分GSMR_L[TDCR, RDCR]决定通常UART模式设置为0b10即16倍过采样。举例假设系统BRGCLK为25MHz我们需要配置UART波特率为115200bps采用16倍过采样。首先计算BRG需要输出的时钟频率115200 * 16 1.8432 MHz。计算BRG分频比25,000,000 / 1,843,200 ≈ 13.56。尝试DIV160不分频CD 13.56 - 1 12.56非整数不可用。尝试DIV16116分频此时BRG输入时钟先被16分频25,000,000 / 16 1.5625 MHz。然后计算CD1,562,500 / 1,843,200 ≈ 0.847更不合理。查阅手册表20-11。在25MHz系统频率下115200bps对应的推荐配置是DIV160,CD13。代入公式验证25,000,000 / 1 / (131) / 16 25,000,000 / 14 / 16 ≈ 111,607 Hz。这与目标115200存在误差误差率约为-3.1%。对于UART通信通常误差在2%以内可以接受但3.1%可能处于临界状态长距离或高速时可能出错。更好的选择使用专用的外部时钟。从表20-11可以看到当使用24.576MHz的时钟时配置DIV160,CD12可得24,576,000 / 1 / (121) / 16 ≈ 118,154 Hz误差约为2.6%。虽然仍不完美但许多晶体可以提供更精确的1.8432MHz或3.6864MHz时钟直接连接到CLK2/CLK6引脚并设置EXTC选择此外部时钟可以几乎实现零误差的115200波特率。对于同步通信如HDLC、BISYNC同步波特率 (BRG输入时钟频率) / (DIV16 ? 16 : 1) / (CD 1)因为同步通信不需要过采样BRG输出的时钟直接就是数据速率。举例需要64kbps的同步链路使用25MHz的BRGCLK。计算分频比25,000,000 / 64,000 390.625。尝试DIV160CD 390.625 - 1 389.625取整CD389。实际波特率25,000,000 / 1 / (3891) 25,000,000 / 390 ≈ 64,102.56 bps误差很小。如果CD390则波特率为25,000,000 / 391 ≈ 63,938 bps。通常选择CD389。实操心得波特率计算时不要只追求数学上的精确。要优先考虑使用标准频率的晶振如1.8432MHz, 3.6864MHz, 11.0592MHz, 24.576MHz等这些频率是经典通信速率的整数倍能极大简化配置并提高精度。如果必须使用系统主频分频务必使用公式或脚本仔细计算误差并确保其在协议允许的容限内UART通常要求2%。3.3 自动波特率Autobaud功能实战自动波特率是UART调试中的“神器”。其工作流程如下初始化先将SCC1配置为UART模式并在GSMR_L[TDCR, RDCR]中选择16倍过采样。关键一步在启动自动波特率前必须先清除BRGC1[ATB]并将BRG1的接收时钟配置为最高频率即设置最小的CD值使SCC能先接收到至少3个Rx时钟。然后再设置BRGC1[ATB]1。检测与计算使能ATB后BRG1开始监控RXD1引脚。当检测到下降沿起始位开始时内部计数器开始对BRG源时钟进行计数测量起始位的宽度。锁定与中断当RXD1变高起始位结束时自动波特率控制逻辑会根据计数值自动计算出近似的分频值并写入BRGC1[CD, DIV16]。此时UART事件寄存器中的AB位会被置位如果使能了中断就会产生中断。软件微调自动计算出的值可能不够精确例如算出56600而非57600。在中断服务程序中软件应读取当前BRGC1[CD, DIV16]的值并根据已知的、期望收到的首个字符如字母 ‘A’ 或 ‘a’进行小幅调整以获得精确的波特率然后再开始正式接收数据。注意事项自动波特率功能仅适用于UART协议且通常要求发送方发送一个特定的、已知的字符如 ‘A’ 0x41其二进制位模式为01000001起始位为0停止位为1有清晰的边沿来触发。它依赖于标准的UART帧格式1起始位、8数据位、1停止位无奇偶校验是常见配置。如果线路噪声大或帧格式不标准自动波特率可能会失败。4. 串行通信控制器SCC寄存器深度解析SCC是协议处理的智能核心。其行为几乎完全由一组寄存器控制其中最重要的是通用SCC模式寄存器GSMR分为高32位GSMR_H和低32位GSMR_L。4.1 GSMR_H高级功能与透明模式控制GSMR_H控制着一些高级和协议相关的功能。TTX/TRX位19/20透明收发器使能。这是SCC一个非常强大的功能。它允许SCC的发送器和接收器独立地工作在“完全透明”模式下不受GSMR_L[MODE]所设置协议如HDLC、UART的约束。例如你可以设置MODE0b0100UART但同时设置TTX0发送器正常UART工作TRX1接收器透明工作。这意味着发送端按照UART协议组帧发送而接收端则忽略所有协议直接将比特流存入缓冲区。这在实现协议转换或监听原始数据流时非常有用。但注意Ethernet和串行ATM模式不支持半透明操作。TFL/RFW位25/26FIFO长度与宽度控制。SCC1的收发FIFO深度均为32字节。TFL置1可将发送FIFO缩短为1字节RFW置1可将接收FIFO宽度从32位改为8位。这牺牲了性能换取了极低的延迟。对于UART这类面向字符、对实时性要求高的协议设置RFW1是必须的这样每收到一个字节就能立即触发中断或DMA而不是等到攒够4个字节。对于HDLC等面向帧的协议则必须保持RFW0以利用32位宽FIFO获得高吞吐量。RTSM位30RTS模式。此位决定了帧间发送的内容。0默认表示在帧间发送空闲符Idle通常为高电平或连续‘1’并且RTS信号在帧间无效。1则表示在帧间持续发送标志Flag如HDLC的0x7E或同步字符并且RTS信号始终有效只要SCC使能。在多点HDLC总线主站应用中常需设置RTSM1以持续发送标志维持总线时钟。4.2 GSMR_L基础协议与时钟配置GSMR_L包含了最核心的协议、编码和时钟配置。MODE[28:31]协议模式选择。这是SCC的“大脑”。你必须根据通信需求准确设置0000: HDLC最常用0010: AppleTalk/LocalTalk0100: UART1000: BISYNC1100: Ethernet1110: 完全透明Transparent 其他模式通常保留或用于RAM微码扩展。TDCR/RDCR[14:15, 16:17]收发DPLL时钟速率。这个设置与编码方式和是否需要时钟恢复紧密相关。1x模式仅用于NRZ/NRZI编码且通信是同步的有独立的时钟线。此时DPLL不工作。8x/16x/32x模式用于需要时钟恢复的场合。例如FM0/FM1、曼彻斯特、差分曼彻斯特编码必须使用这些模式。对于异步UART也必须选择16x或32x模式因为UART需要从数据流中恢复时钟。16x是UART和AppleTalk的典型选择。倍数越高时钟恢复分辨率越高但支持的最高数据速率越低。RENC/TENC[18:20, 21:23]收发编码/解码方法。必须与物理线路上的编码方式一致。000: NRZ不归零。最常见的编码高电平代表1低电平代表0。001: NRZI反向不归零。电平翻转代表0保持代表1。常用于USB等。010: FM0零调制频率。一种曼彻斯特变种每位中间都有跳变。100: 曼彻斯特编码。每位中间跳变前半位与后半位反相。110: 差分曼彻斯特编码。重要RENC和TENC在大多数应用中应设置为相同值。同时TDCR和RDCR也应匹配除非有特殊需求如环回测试。DIAG[24:25]诊断模式。用于测试和调试。00: 正常操作。01:本地环回Local Loopback。发送器的输出在芯片内部直接连接到接收器的输入。这是一个极其重要的硬件自测试功能。配置此模式后发送的数据会被自己立刻接收可用于验证SCC内核、FIFO、缓冲区描述符BD链路是否工作正常而无需外部连接。测试时收发必须使用同一时钟源。10:自动回波Automatic Echo。接收到的数据位在接收时钟的控制下被立即从发送引脚发送出去。常用于模拟调制解调器的回声功能。11: 环回与回波同时进行。4.3 其他关键SCC寄存器协议特定模式寄存器PSMR在GSMR_L[MODE]选择了特定协议后PSMR用于配置该协议独有的参数。例如在UART模式下PSMR用于设置数据位、停止位、奇偶校验在HDLC模式下用于设置CRC类型、地址比较等。数据同步寄存器DSR在BISYNC或透明模式下用于定义同步字符Sync的比特模式。接收器会用它来识别帧的开始。发送按需寄存器TODR用于触发立即发送减少帧发送的延迟。5. 配置流程与实战指南5.1 SCC初始化与NMSI配置步骤配置一个SCC通道进行通信以UART NMSI模式为例需要遵循一个清晰的流程引脚复用配置通过端口Port的并行I/O控制寄存器将TXD1、RXD1、RTS1、CTS1、CD1、TCLK1、RCLK1等引脚的功能从GPIO切换到SCC1。这是硬件连接生效的前提。时钟源配置 a.配置BRG确定UART所需波特率。计算或查表得到BRGC1的EXTC、DIV16、CD值。例如25MHz系统115200bps16倍过采样可设置EXTC00BRGCLKDIV160CD13。写入BRGC1寄存器并置位EN。 b.路由时钟到SCC在SI时钟路由寄存器SICR中找到对应SCC1_TCLK和SCC1_RCLK的字段将其设置为BRG1或你选择的BRG编号。SCC基础协议配置GSMR_L a. 设置MODE 0b0100UART。 b. 设置TDCR RDCR 0b1016倍过采样UART必需。 c. 设置RENC TENC 0b000NRZ编码。 d. 设置RFW 1接收FIFO宽度为8位低延迟UART必需。 e. 根据需求设置DIAG通常为00正常模式。 f. 暂时不要使能ENR和ENT。SCC高级与协议特定配置 a. 配置GSMR_H根据需求设置RTSM、TFL等。 b. 配置PSMRUART模式设置数据位如8位、停止位如1位、奇偶校验如无。缓冲区描述符BD表初始化在双端口RAM中为发送和接收分别创建BD环。每个BD指向一个数据缓冲区并包含控制位如数据长度、帧结束标志E、就绪标志R等。这是SCC与主存交换数据的核心机制。参数RAM初始化设置SCC参数RAM中的基地址指针指向刚才创建的BD表。使能SCC最后置位GSMR_L[ENR]和GSMR_L[ENT]启动SCC的接收和发送状态机。启动通信将待发送数据的BD的R位置1SCC会自动从该BD获取数据并发送。当收到数据时SCC会将数据写入接收BD并在完成后置位相应状态位并可能产生中断。5.2 常见问题排查速查表在实际开发中你一定会遇到各种问题。下面是一个快速排查指南现象可能原因排查步骤发送无波形1. 引脚复用未配置。2. SCC发送未使能ENT0。3. 发送BD的R位未置1或BD链未正确初始化。4. 时钟源未正确配置或未使能。1. 检查端口控制寄存器确认TXD1等引脚功能已设为SCC。2. 确认GSMR_L[ENT]1。3. 检查发送BD环的基地址指针TBASE是否正确第一个BD的R位是否为1。4. 用示波器测量TCLK1引脚是否有时钟输出。检查BRGCn[EN]和SICR中的时钟路由。接收不到数据1. 引脚复用未配置。2. SCC接收未使能ENR0。3. 接收BD的E位空未置1或BD链已满。4. 波特率/时钟配置错误。5. 编码方式RENC设置错误。1. 检查RXD1引脚配置。2. 确认GSMR_L[ENR]1。3. 检查接收BD环确保有BD的E1且指向有效缓冲区。4. 核对发送端和接收端的波特率、数据位、停止位、奇偶校验是否完全一致。使用示波器测量RCLK1和RXD1波形。5. 确认RENC与发送方编码一致通常为NRZ。通信数据错误1. 波特率误差过大2%。2. FIFO配置错误如UART用了32位FIFO。3. 电磁干扰或信号完整性差。4. DPLL配置错误同步通信。1. 重新计算波特率分频比尽量使用标准频率时钟源。2. 对于UART确保RFW1。3. 检查PCB布线确保信号线有参考地远离噪声源必要时加串联电阻或并联电容。4. 对于曼彻斯特等编码确认TDCR/RDCR设置为8x/16x/32x模式。本地环回测试失败1. 环回模式未正确使能DIAG非01。2. 收发时钟源不同。3. 环回测试代码逻辑错误。1. 确认GSMR_L[DIAG]01。2. 在环回模式下收发器必须使用同一时钟源。检查TCLK1和RCLK1的SICR配置是否指向同一个BRG或CLK。3. 确保发送的数据和接收比较的数据是同一块内存或正确比较了接收缓冲区的内容。5.3 性能优化与高级技巧利用发送按需TODR降低延迟在实时性要求高的应用中配置好BD和数据后向TODR寄存器写入特定值可以命令SCC立即开始发送当前帧而不是等待内部调度这能显著减少发送延迟。合理使用RTS/CTS流控在UART或透明模式下使能硬件流控通过GSMR_H相关位和引脚配置可以防止缓冲区溢出。确保RTS和CTS信号线正确连接并配置为自动控制模式。缓冲区描述符BD环的大小BD环不是越大越好。更大的环意味着更多的内存和更长的遍历时间。对于高吞吐量、低延迟的应用可以适当增大BD环并使用多个缓冲区来平滑数据流对于低速率应用小环即可。确保环是闭环的最后一个BD的WWrap位置1。中断与轮询的权衡SCC在帧发送完成、接收到帧、发生错误时都可以产生中断。对于高频率、小数据量的通信如UART键盘输入中断是高效的。但对于大数据量、高吞吐的链路如百兆以太网频繁的中断会成为系统瓶颈。此时可以考虑使用DMA或更大的缓冲区并采用轮询方式检查BD状态或者使用CPM的SDMA功能。功耗管理当串口暂时不用时可以通过清除GSMR_L[ENR]和GSMR_L[ENT]来关闭SCC收发器清除BRGCn[EN]来关闭BRG以降低功耗。重新使能前需重新初始化相关寄存器。
MPC857T串行通信配置详解:NMSI模式、BRG与SCC寄存器实战
发布时间:2026/6/19 5:29:00
1. 项目概述深入MPC857T的串行通信核心在嵌入式通信处理器的世界里Freescale现NXP的PowerQUICC系列处理器一直是构建路由器、网关和工业控制设备的基石。这类设备的核心任务之一就是高效、可靠地处理多种多样的串行通信协议。MPC857T作为该家族的一员其串行接口SI和串行通信控制器SCC的设计直接决定了系统与外部世界如调制解调器、串行总线、专用网络对话的能力。很多工程师在初次接触其数据手册时往往会被其中繁多的寄存器位和复杂的时钟路由选项所困扰配置不当会导致通信不稳定、数据错误甚至接口无法工作。本文旨在充当一位“引路人”基于MPC857T用户手册的原始资料为你彻底拆解其串行接口特别是非复用串行接口NMSI模式下的配置逻辑以及SCC控制器的核心寄存器设置。我不会止步于翻译手册而是结合多年在通信设备开发中的实战经验解释每一个关键配置位背后的设计意图、不同选择带来的实际影响以及那些手册里不会明说、但能让你少走弯路的“坑”。无论你是正在为MPC857T编写底层驱动还是在设计基于该芯片的硬件原理图这篇文章都将提供从原理到实操的完整视角。2. NMSI模式为SCC和SMC开辟独立通道2.1 NMSI的核心价值与设计思路MPC857T的串行接口单元支持两种主要模式时分复用TDM模式和非复用串行接口NMSI模式。TDM模式允许多个串行通道如多个SCC或SMC共享同一组物理引脚和时序通过时分复用的方式交替传输数据这在E1/T1、ISDN等需要多路复用的场景中非常高效。然而TDM模式引入了复杂的时隙分配和同步逻辑。相比之下NMSI模式的设计哲学是“简单直接”。它为特定的串行控制器如SCC1、SMC1、SMC2分配了专属的物理引脚。例如SCC1在NMSI模式下直接使用TXD1、RXD1、RTS1、CTS1、CD1、TCLK1、RCLK1这一组引脚。这种方式的优势非常明显硬件连接简单软件配置直观时序路径独立避免了TDM总线上的仲裁和竞争延迟。对于只需要单个或少数几个独立串行通道的应用例如一个UART调试口、一个HDLC链路连接外部调制解调器NMSI模式通常是更优、更稳定的选择。注意选择NMSI还是TDM是硬件设计阶段就需要确定的顶层决策。一旦PCB板上将某个SCC的引脚用作其他功能如通用GPIO再想切换到NMSI模式就需要硬件改板。因此在原理图设计时务必根据产品需求预留足够的引脚灵活性。2.2 时钟架构灵活的“时钟银行”系统串行通信的基石是时钟。MPC857T为NMSI模式设计了一套非常灵活且强大的时钟系统称为“时钟银行”Bank-of-Clocks。理解这套系统是正确配置串行接口的关键。时钟来源SCC或SMC的收发时钟可以来自两个源头四个内部波特率发生器BRG1-BRG4这是最常用、最稳定的内部时钟源。八个外部时钟引脚CLK1-CLK8用于接入外部系统或芯片提供的时钟信号。“时钟银行”的妙处系统并没有硬性规定“SCC1的发送时钟必须来自BRG1”或“必须来自CLK2引脚”。相反它提供了一个选择矩阵。例如SCC1的发送时钟TCLK1可以从BRG1-BRG4或CLK1-CLK8这总共8个源中任选一个其接收时钟RCLK1也有同样的8选1自由度。SMC的时钟选择范围类似但具体可用的CLK引脚组可能不同如SMC2使用CLK5-CLK8。这种设计带来了两大核心优势极高的灵活性你可以根据板级时钟资源分布自由地为每个串行通道分配合适的时钟源。例如如果板上有两颗晶振一颗25MHz给系统主频另一颗1.8432MHz专为UART设计你就可以将后者连接到CLK2引脚并配置SCC1的UART模式时钟源为CLK2从而获得精确的标准波特率如115200而不受系统主频分频误差的影响。时钟共享与引脚节约如果多个串行通道需要相同的波特率例如多个UART接口都跑115200bps你可以让它们共享同一个BRG或外部CLK引脚作为时钟源。这样既保证了时钟同源、减少频偏又释放了其他BRG或CLK引脚用于其他功能同时也避免了多个独立时钟源带来的微小偏差Skew问题。配置寄存器SCC的时钟源选择在SI时钟路由寄存器SICR中完成而SMC的时钟源选择则在SI模式寄存器SIMODE中设置。这是配置的第一步务必先查表确定你打算使用的物理引脚TCLK1/RCLK1/SMCLKx对应到哪个内部信号名再在相应寄存器中映射到具体的BRG或CLK源。2.3 关键限制与配置陷阱灵活性的背后也存在着必须遵守的规则忽视它们会导致配置失败。时钟源数量限制虽然“时钟银行”逻辑上有多个源但对于SCC实际上只有8个时钟源可以连接到其接收器或发射器。这通常意味着从BRG1-4和CLK1-8中最多只能有8个不同的时钟可以被SCC的Rx或Tx使用。在规划复杂系统时需要注意。SMC的时钟约束当SMC连接到NMSI时其发射器和接收器必须使用相同的时钟源即SMCLKx同时用于收和发。这与SCC可以分别选择收、发时钟不同在配置SMC时这是一个硬性规定。引脚复用冲突NMSI引脚如TXD1,RXD1可能与端口A/B/C的并行I/OGPIO功能复用。你必须通过相应的并行I/O控制寄存器将相关引脚的功能设置为“串行接口”而非“GPIO”否则信号无法输出到引脚上。这是一个非常常见的低级错误表现为“软件配置正确但示波器测不到波形”。物理连接匹配选择了内部BRG作为时钟源并不意味着时钟信号会自动出现在物理引脚上。如果你需要将BRG产生的时钟输出给外部芯片使用需要额外配置将BRGOn信号路由到特定的引脚同样涉及引脚复用配置并使能该输出。3. 波特率发生器BRG精准时钟的引擎3.1 BRG的工作原理与配置寄存器解析波特率发生器是产生精准串行时钟的核心。MPC857T的CPM通信处理器模块提供了四个独立的、功能相同的BRGBRG1-BRG4。每个BRG都可以被一个或多个SCC/SMC共享。其工作原理是一个可编程的分频器。如图20-22所示BRG的输入时钟源BRGCLK,CLK2,CLK6经过一个可选的16分频预分频器由DIV16位控制再送入一个12位的计数器进行分频分频值由CD[0:11]字段设定范围1-4096。最终产生的时钟既可供内部“时钟银行”使用也可通过BRGOn引脚输出。BRG配置寄存器BRGCn是控制这一切的总开关。我们逐位分析其关键字段EN位15BRG使能位。这是总开关必须置1BRG才开始计数。在进入低功耗模式前可通过清零此位关闭BRG以省电。RST位14软件复位位。写1会产生一个与硬件复位相同的效果停止BRG计数并将BRGO输出驱动为高电平。常用于初始化或重新配置BRG前确保其处于已知状态。EXTC[16:17]外部时钟源选择。00 内部BRGCLK由SIU时钟合成器产生01CLK2引脚10CLK6引脚。选择外部引脚时需注意CLK2/CLK6信号在进入BRG前没有经过内部同步这意味着外部时钟的毛刺可能会直接影响BRG输出要求外部时钟质量较高。DIV16位3116分频预分频选择。0 不分频1 16分频。这个位用于在系统频率很高时产生较低的波特率。因为12位计数器CD的最大分频比为4096如果系统时钟是100MHz不分频时最低只能产生约24.4kHz的时钟。启用16分频后最低可产生约1.5kHz的时钟极大地扩展了低速波特率的支持范围。CD[19:30]时钟分频值。这是12位的主分频系数实际分频比为CD 1。因此可设置的分频范围是1到4096。计算波特率时切记是CD1。ATB位18自动波特率使能位仅BRG1有效。这是UART模式下一个非常实用的功能。当使能后BRG1会通过监测RXD1引脚上起始位的长度自动计算并设置正确的分频值CD和DIV16实现波特率自动匹配。这在对接未知波特率的设备时极为有用。3.2 波特率计算从公式到实例波特率的计算是配置的难点但掌握公式后便一目了然。手册给出了通用公式我们需要根据通信模式异步/同步和协议选择如UART的过采样率来具体应用。对于异步通信如UART异步波特率 (BRG输入时钟频率) / (DIV16 ? 16 : 1) / (CD 1) / (过采样率)其中过采样率由SCC通用模式寄存器低半部分GSMR_L[TDCR, RDCR]决定通常UART模式设置为0b10即16倍过采样。举例假设系统BRGCLK为25MHz我们需要配置UART波特率为115200bps采用16倍过采样。首先计算BRG需要输出的时钟频率115200 * 16 1.8432 MHz。计算BRG分频比25,000,000 / 1,843,200 ≈ 13.56。尝试DIV160不分频CD 13.56 - 1 12.56非整数不可用。尝试DIV16116分频此时BRG输入时钟先被16分频25,000,000 / 16 1.5625 MHz。然后计算CD1,562,500 / 1,843,200 ≈ 0.847更不合理。查阅手册表20-11。在25MHz系统频率下115200bps对应的推荐配置是DIV160,CD13。代入公式验证25,000,000 / 1 / (131) / 16 25,000,000 / 14 / 16 ≈ 111,607 Hz。这与目标115200存在误差误差率约为-3.1%。对于UART通信通常误差在2%以内可以接受但3.1%可能处于临界状态长距离或高速时可能出错。更好的选择使用专用的外部时钟。从表20-11可以看到当使用24.576MHz的时钟时配置DIV160,CD12可得24,576,000 / 1 / (121) / 16 ≈ 118,154 Hz误差约为2.6%。虽然仍不完美但许多晶体可以提供更精确的1.8432MHz或3.6864MHz时钟直接连接到CLK2/CLK6引脚并设置EXTC选择此外部时钟可以几乎实现零误差的115200波特率。对于同步通信如HDLC、BISYNC同步波特率 (BRG输入时钟频率) / (DIV16 ? 16 : 1) / (CD 1)因为同步通信不需要过采样BRG输出的时钟直接就是数据速率。举例需要64kbps的同步链路使用25MHz的BRGCLK。计算分频比25,000,000 / 64,000 390.625。尝试DIV160CD 390.625 - 1 389.625取整CD389。实际波特率25,000,000 / 1 / (3891) 25,000,000 / 390 ≈ 64,102.56 bps误差很小。如果CD390则波特率为25,000,000 / 391 ≈ 63,938 bps。通常选择CD389。实操心得波特率计算时不要只追求数学上的精确。要优先考虑使用标准频率的晶振如1.8432MHz, 3.6864MHz, 11.0592MHz, 24.576MHz等这些频率是经典通信速率的整数倍能极大简化配置并提高精度。如果必须使用系统主频分频务必使用公式或脚本仔细计算误差并确保其在协议允许的容限内UART通常要求2%。3.3 自动波特率Autobaud功能实战自动波特率是UART调试中的“神器”。其工作流程如下初始化先将SCC1配置为UART模式并在GSMR_L[TDCR, RDCR]中选择16倍过采样。关键一步在启动自动波特率前必须先清除BRGC1[ATB]并将BRG1的接收时钟配置为最高频率即设置最小的CD值使SCC能先接收到至少3个Rx时钟。然后再设置BRGC1[ATB]1。检测与计算使能ATB后BRG1开始监控RXD1引脚。当检测到下降沿起始位开始时内部计数器开始对BRG源时钟进行计数测量起始位的宽度。锁定与中断当RXD1变高起始位结束时自动波特率控制逻辑会根据计数值自动计算出近似的分频值并写入BRGC1[CD, DIV16]。此时UART事件寄存器中的AB位会被置位如果使能了中断就会产生中断。软件微调自动计算出的值可能不够精确例如算出56600而非57600。在中断服务程序中软件应读取当前BRGC1[CD, DIV16]的值并根据已知的、期望收到的首个字符如字母 ‘A’ 或 ‘a’进行小幅调整以获得精确的波特率然后再开始正式接收数据。注意事项自动波特率功能仅适用于UART协议且通常要求发送方发送一个特定的、已知的字符如 ‘A’ 0x41其二进制位模式为01000001起始位为0停止位为1有清晰的边沿来触发。它依赖于标准的UART帧格式1起始位、8数据位、1停止位无奇偶校验是常见配置。如果线路噪声大或帧格式不标准自动波特率可能会失败。4. 串行通信控制器SCC寄存器深度解析SCC是协议处理的智能核心。其行为几乎完全由一组寄存器控制其中最重要的是通用SCC模式寄存器GSMR分为高32位GSMR_H和低32位GSMR_L。4.1 GSMR_H高级功能与透明模式控制GSMR_H控制着一些高级和协议相关的功能。TTX/TRX位19/20透明收发器使能。这是SCC一个非常强大的功能。它允许SCC的发送器和接收器独立地工作在“完全透明”模式下不受GSMR_L[MODE]所设置协议如HDLC、UART的约束。例如你可以设置MODE0b0100UART但同时设置TTX0发送器正常UART工作TRX1接收器透明工作。这意味着发送端按照UART协议组帧发送而接收端则忽略所有协议直接将比特流存入缓冲区。这在实现协议转换或监听原始数据流时非常有用。但注意Ethernet和串行ATM模式不支持半透明操作。TFL/RFW位25/26FIFO长度与宽度控制。SCC1的收发FIFO深度均为32字节。TFL置1可将发送FIFO缩短为1字节RFW置1可将接收FIFO宽度从32位改为8位。这牺牲了性能换取了极低的延迟。对于UART这类面向字符、对实时性要求高的协议设置RFW1是必须的这样每收到一个字节就能立即触发中断或DMA而不是等到攒够4个字节。对于HDLC等面向帧的协议则必须保持RFW0以利用32位宽FIFO获得高吞吐量。RTSM位30RTS模式。此位决定了帧间发送的内容。0默认表示在帧间发送空闲符Idle通常为高电平或连续‘1’并且RTS信号在帧间无效。1则表示在帧间持续发送标志Flag如HDLC的0x7E或同步字符并且RTS信号始终有效只要SCC使能。在多点HDLC总线主站应用中常需设置RTSM1以持续发送标志维持总线时钟。4.2 GSMR_L基础协议与时钟配置GSMR_L包含了最核心的协议、编码和时钟配置。MODE[28:31]协议模式选择。这是SCC的“大脑”。你必须根据通信需求准确设置0000: HDLC最常用0010: AppleTalk/LocalTalk0100: UART1000: BISYNC1100: Ethernet1110: 完全透明Transparent 其他模式通常保留或用于RAM微码扩展。TDCR/RDCR[14:15, 16:17]收发DPLL时钟速率。这个设置与编码方式和是否需要时钟恢复紧密相关。1x模式仅用于NRZ/NRZI编码且通信是同步的有独立的时钟线。此时DPLL不工作。8x/16x/32x模式用于需要时钟恢复的场合。例如FM0/FM1、曼彻斯特、差分曼彻斯特编码必须使用这些模式。对于异步UART也必须选择16x或32x模式因为UART需要从数据流中恢复时钟。16x是UART和AppleTalk的典型选择。倍数越高时钟恢复分辨率越高但支持的最高数据速率越低。RENC/TENC[18:20, 21:23]收发编码/解码方法。必须与物理线路上的编码方式一致。000: NRZ不归零。最常见的编码高电平代表1低电平代表0。001: NRZI反向不归零。电平翻转代表0保持代表1。常用于USB等。010: FM0零调制频率。一种曼彻斯特变种每位中间都有跳变。100: 曼彻斯特编码。每位中间跳变前半位与后半位反相。110: 差分曼彻斯特编码。重要RENC和TENC在大多数应用中应设置为相同值。同时TDCR和RDCR也应匹配除非有特殊需求如环回测试。DIAG[24:25]诊断模式。用于测试和调试。00: 正常操作。01:本地环回Local Loopback。发送器的输出在芯片内部直接连接到接收器的输入。这是一个极其重要的硬件自测试功能。配置此模式后发送的数据会被自己立刻接收可用于验证SCC内核、FIFO、缓冲区描述符BD链路是否工作正常而无需外部连接。测试时收发必须使用同一时钟源。10:自动回波Automatic Echo。接收到的数据位在接收时钟的控制下被立即从发送引脚发送出去。常用于模拟调制解调器的回声功能。11: 环回与回波同时进行。4.3 其他关键SCC寄存器协议特定模式寄存器PSMR在GSMR_L[MODE]选择了特定协议后PSMR用于配置该协议独有的参数。例如在UART模式下PSMR用于设置数据位、停止位、奇偶校验在HDLC模式下用于设置CRC类型、地址比较等。数据同步寄存器DSR在BISYNC或透明模式下用于定义同步字符Sync的比特模式。接收器会用它来识别帧的开始。发送按需寄存器TODR用于触发立即发送减少帧发送的延迟。5. 配置流程与实战指南5.1 SCC初始化与NMSI配置步骤配置一个SCC通道进行通信以UART NMSI模式为例需要遵循一个清晰的流程引脚复用配置通过端口Port的并行I/O控制寄存器将TXD1、RXD1、RTS1、CTS1、CD1、TCLK1、RCLK1等引脚的功能从GPIO切换到SCC1。这是硬件连接生效的前提。时钟源配置 a.配置BRG确定UART所需波特率。计算或查表得到BRGC1的EXTC、DIV16、CD值。例如25MHz系统115200bps16倍过采样可设置EXTC00BRGCLKDIV160CD13。写入BRGC1寄存器并置位EN。 b.路由时钟到SCC在SI时钟路由寄存器SICR中找到对应SCC1_TCLK和SCC1_RCLK的字段将其设置为BRG1或你选择的BRG编号。SCC基础协议配置GSMR_L a. 设置MODE 0b0100UART。 b. 设置TDCR RDCR 0b1016倍过采样UART必需。 c. 设置RENC TENC 0b000NRZ编码。 d. 设置RFW 1接收FIFO宽度为8位低延迟UART必需。 e. 根据需求设置DIAG通常为00正常模式。 f. 暂时不要使能ENR和ENT。SCC高级与协议特定配置 a. 配置GSMR_H根据需求设置RTSM、TFL等。 b. 配置PSMRUART模式设置数据位如8位、停止位如1位、奇偶校验如无。缓冲区描述符BD表初始化在双端口RAM中为发送和接收分别创建BD环。每个BD指向一个数据缓冲区并包含控制位如数据长度、帧结束标志E、就绪标志R等。这是SCC与主存交换数据的核心机制。参数RAM初始化设置SCC参数RAM中的基地址指针指向刚才创建的BD表。使能SCC最后置位GSMR_L[ENR]和GSMR_L[ENT]启动SCC的接收和发送状态机。启动通信将待发送数据的BD的R位置1SCC会自动从该BD获取数据并发送。当收到数据时SCC会将数据写入接收BD并在完成后置位相应状态位并可能产生中断。5.2 常见问题排查速查表在实际开发中你一定会遇到各种问题。下面是一个快速排查指南现象可能原因排查步骤发送无波形1. 引脚复用未配置。2. SCC发送未使能ENT0。3. 发送BD的R位未置1或BD链未正确初始化。4. 时钟源未正确配置或未使能。1. 检查端口控制寄存器确认TXD1等引脚功能已设为SCC。2. 确认GSMR_L[ENT]1。3. 检查发送BD环的基地址指针TBASE是否正确第一个BD的R位是否为1。4. 用示波器测量TCLK1引脚是否有时钟输出。检查BRGCn[EN]和SICR中的时钟路由。接收不到数据1. 引脚复用未配置。2. SCC接收未使能ENR0。3. 接收BD的E位空未置1或BD链已满。4. 波特率/时钟配置错误。5. 编码方式RENC设置错误。1. 检查RXD1引脚配置。2. 确认GSMR_L[ENR]1。3. 检查接收BD环确保有BD的E1且指向有效缓冲区。4. 核对发送端和接收端的波特率、数据位、停止位、奇偶校验是否完全一致。使用示波器测量RCLK1和RXD1波形。5. 确认RENC与发送方编码一致通常为NRZ。通信数据错误1. 波特率误差过大2%。2. FIFO配置错误如UART用了32位FIFO。3. 电磁干扰或信号完整性差。4. DPLL配置错误同步通信。1. 重新计算波特率分频比尽量使用标准频率时钟源。2. 对于UART确保RFW1。3. 检查PCB布线确保信号线有参考地远离噪声源必要时加串联电阻或并联电容。4. 对于曼彻斯特等编码确认TDCR/RDCR设置为8x/16x/32x模式。本地环回测试失败1. 环回模式未正确使能DIAG非01。2. 收发时钟源不同。3. 环回测试代码逻辑错误。1. 确认GSMR_L[DIAG]01。2. 在环回模式下收发器必须使用同一时钟源。检查TCLK1和RCLK1的SICR配置是否指向同一个BRG或CLK。3. 确保发送的数据和接收比较的数据是同一块内存或正确比较了接收缓冲区的内容。5.3 性能优化与高级技巧利用发送按需TODR降低延迟在实时性要求高的应用中配置好BD和数据后向TODR寄存器写入特定值可以命令SCC立即开始发送当前帧而不是等待内部调度这能显著减少发送延迟。合理使用RTS/CTS流控在UART或透明模式下使能硬件流控通过GSMR_H相关位和引脚配置可以防止缓冲区溢出。确保RTS和CTS信号线正确连接并配置为自动控制模式。缓冲区描述符BD环的大小BD环不是越大越好。更大的环意味着更多的内存和更长的遍历时间。对于高吞吐量、低延迟的应用可以适当增大BD环并使用多个缓冲区来平滑数据流对于低速率应用小环即可。确保环是闭环的最后一个BD的WWrap位置1。中断与轮询的权衡SCC在帧发送完成、接收到帧、发生错误时都可以产生中断。对于高频率、小数据量的通信如UART键盘输入中断是高效的。但对于大数据量、高吞吐的链路如百兆以太网频繁的中断会成为系统瓶颈。此时可以考虑使用DMA或更大的缓冲区并采用轮询方式检查BD状态或者使用CPM的SDMA功能。功耗管理当串口暂时不用时可以通过清除GSMR_L[ENR]和GSMR_L[ENT]来关闭SCC收发器清除BRGCn[EN]来关闭BRG以降低功耗。重新使能前需重新初始化相关寄存器。