MGT5100 PSC模块:嵌入式串行通信的硬件引擎与多模式应用
1. MGT5100 PSC模块嵌入式串行通信的“多面手”在嵌入式系统开发中串行通信接口就像设备的“嘴巴”和“耳朵”负责与外部世界交换信息。无论是调试信息输出、传感器数据采集还是连接音频编解码器、调制解调器都离不开它。MGT5100芯片内置的可编程串行控制器PSC模块就是这样一个功能强大的“多面手”。它绝不仅仅是一个简单的UART通用异步收发器而是一个集成了UART、多种Modem此处指与编解码器CODEC的同步串行接口以及AC97音频控制器接口的硬件引擎。其核心价值在于通过硬件自动处理繁琐的时序、帧同步和流量控制将CPU从轮询或高频中断的苦差事中解放出来让开发者能更专注于应用逻辑。对于从事工业控制、消费电子或通信设备开发的工程师而言吃透PSC的工作原理和配置细节意味着能在系统设计时更游刃有余在调试时更快定位问题根源。接下来我将结合手册内容和个人实操经验为你拆解PSC在UART、ModemCODEC和AC97三种典型模式下的运作机制、配置要点以及那些手册里可能不会明说的“坑”。2. PSC模块整体架构与核心信号解析要驾驭PSC首先得理解它的“身体构造”和与外界的“连接线”。PSC模块可以看作一个高度可配置的串行通信黑盒其内部核心是相互独立的发送器Tx和接收器Rx它们共享一个可编程的时钟源并围绕FIFO先进先出缓冲区进行数据吞吐。2.1 核心信号引脚定义与功能手册中的Table 15-54是理解硬件连接的钥匙。每个信号在不通模式下扮演的角色略有不同必须区分清楚TxD (Transmitter Serial Data Output) 发送数据线。这是PSC说“话”的通道。UART模式 当发送器被禁用、空闲或处于本地回环模式时TxD被拉高标记状态Mark Condition。数据在时钟源的下降沿被移出低位LSB先行。这个“标记状态为高”的特性很重要它是判断线路空闲和断线Break条件的依据。Modem模式 当发送器被禁用或空闲时TxD被拉低。数据在驱动CTS输入的时钟信号的上升沿被移出。此时数据传输顺序LSB或MSB先行是可编程的。这里有个关键点在Modem模式下TxD的时钟边沿与UART模式是相反的。RxD (Receiver Serial Data Input) 接收数据线。这是PSC听“话”的通道。UART模式 在时钟源的上升沿对数据进行采样低位LSB先行。Modem模式 在驱动PSC1和PSC CTS输入的时钟信号的下降沿进行采样。同样采样顺序可编程。CTS (Clear-to-Send) RTS (Request-to-Send) 硬件流控制信号线。这是UART模式的“专属技能”用于防止数据丢失。CTS输入 由对方设备驱动告诉PSC“我准备好了你可以发数据了”。CTS状态变化可以产生中断。RTS输出 由PSC驱动告诉对方设备“我准备好了你可以发数据给我”。它可以被编程为由Rx或Tx自动置位或清零。当连接到发送器的CTS时RTS就能控制串行数据流实现自动流量控制。这是一个非常实用的硬件流控功能能有效避免FIFO溢出。CLK (Clock) 时钟信号。这是串行通信的“心跳”。Modem模式必须由外部CODEC或AC97控制器提供的串行位时钟BIT_CLK驱动。PSC在这个外部时钟的节拍下收发数据。AC97模式 输入的是AC97的BIT_CLKPSC内部会将其除以256来生成帧同步信号。FRAME (Frame Sync) 帧同步信号。这是同步通信Modem/AC97的“发令枪”。AC97模式 FRAME是输出给外部AC97控制器的帧同步或帧起始SOF信号。Modem8/Modem16模式 FRAME是从外部CODEC输入的帧同步信号。注意 引脚复用是嵌入式系统的常态。在MGT5100上PSC1和PSC2可以灵活配置为连接RS-232收发器、通用CODEC或AC97控制器如图15-3、15-4、15-5所示。设计硬件原理图时务必根据你选择的模式正确连接这些信号线。例如若用作AC97接口除了连接CLKBIT_CLK、TxDSDATA_OUT、RxDSDATA_IN、FRAMEFRAME SYNC还必须将一个GPIO引脚配置为输出连接到AC97设备的复位引脚RESET这是实现AC97低功耗管理的关键。2.2 内部功能框图与数据流图15-7的Tx/Rx功能框图是理解PSC内部运作的核心。数据流路径非常清晰发送路径 CPU将数据写入发送缓冲区Tx Buffer。当发送器就绪数据从缓冲区加载到发送移位寄存器Tx Shift Register。在时钟控制下移位寄存器将并行数据转换为串行比特流从TxD引脚输出。状态寄存器SRn中的TxRDY和TxEMP位用于指示缓冲区状态。接收路径 串行数据从RxD引脚输入由接收移位寄存器Rx Shift Register在时钟边沿采样并组装成并行数据。组装完一个完整字符或样本后数据被送入接收缓冲区Rx Buffer并置位SRn中的RxRDY位通知CPU读取。错误检测如帧错误、奇偶校验错误也在此路径上完成。控制核心 **命令寄存器CRn**用于启停收发器、发送断线信号等。**模式寄存器MR1n, MR2n**用于配置字符格式、流控、工作模式等。**串行接口控制寄存器SICR**在Modem/AC97模式下至关重要用于选择模式、移位顺序、延迟等。FIFO是性能关键。PSC的Tx和Rx各有自己的FIFO栈见图15-7中的Tx FIFO和Rx FIFO。它们不是简单的单字节缓冲而是多级深度具体深度需查芯片数据手册的硬件队列。这允许CPU一次性写入多个数据或从缓冲区读取多个数据而无需频繁被中断打扰。FIFO的“几乎空”Almost Empty和“几乎满”Almost Full阈值可以通过寄存器TFALARM, RFALARM编程用于更精细的中断触发控制是平衡系统响应速度和CPU负载的利器。3. 时钟源与波特率生成通信节奏的掌控者串行通信的基石是精确的时钟。PSC的时钟系统设计兼顾了灵活性和精确性。3.1 时钟源架构如图15-6所示PSC的Tx和Rx时钟源来自一个可编程的时钟生成器。其基础参考时钟是CLKIN即IP总线时钟。这个时钟首先经过一个固定的32分频预分频器。手册特别强调“如果使用CLKIN时钟生成器无法产生标准波特率”。这是因为标准波特率如9600 115200通常是基于1.8432MHz、3.6864MHz等晶体频率推导的而CLKIN例如54MHz经过32分频后是1.6875MHz不是标准频率的整数倍。因此必须使用紧随其后的16位可编程分频器来微调以逼近目标波特率。这个16位分频器的值由两个8位寄存器CTURn高8位和CTLRn低8位拼接而成。最终发送/接收时钟频率 CLKIN / (32 * Divider)其中Divider就是CTURn:CTLRn组成的16位值。3.2 波特率计算实战手册给出了一个基于54MHz CLKIN计算9600波特率的例子公式非常直接分频值 (Divider) CLKIN / (32 * 目标波特率)代入数值Divider 54,000,000 / (32 * 9600) 54,000,000 / 307,200 ≈ 175.78125显然分频器必须是整数。取整后为176十进制转换为十六进制是0x00B0。因此需要设置CTURn 0x00 CTLRn 0xB0。这里有一个非常重要的实操细节误差计算。实际生成的波特率 54,000,000 / (32 * 176) ≈ 9596.59 bps。误差率 (9600 - 9596.59) / 9600 ≈ 0.0355%。对于UART通信通常误差在3%以内即可稳定工作这个误差完全可接受。但对于某些对时序极其敏感的高速或长距离通信就需要评估这个误差是否在接收端采样容限内。如果CLKIN频率不理想你可以通过这个公式反推出最接近的可实现波特率。注意 手册15.4.1.4明确指出对于MGT5100的PSC使用外部时钟不是可选项。这意味着你只能使用内部CLKIN作为基准源。在设计系统时钟树时就需要考虑CLKIN的频率是否便于产生你所需的所有目标波特率。3.3 Modem与AC97模式的时钟在Modem和AC97模式下情况完全不同。此时PSC不再内部生成位时钟而是作为一个从设备接受外部主设备CODEC或AC97控制器提供的位时钟CLK。这个CLK引脚是输入。在AC97模式下PSC甚至还会将这个外部BIT_CLK进行256分频来产生自己输出的帧同步信号FRAME。因此在这些同步模式下通信速率完全由外部主设备决定PSC的时钟配置寄存器不再用于波特率生成但可能用于其他内部时序控制。4. UART模式深度操作指南UART是PSC最基础也是最常用的模式上电复位后默认即处于此模式。其核心是异步通信不需要共享时钟线依靠预定的波特率和帧格式进行数据同步。4.1 发送器Transmitter操作详解发送一个字符的过程是标准化的但细节决定成败使能与就绪 通过写命令寄存器CRn使能发送器。当发送缓冲区TBn为空可以接受新字符时状态寄存器SRn的TxRDY位会被置1。这是CPU写入数据的“绿灯”。帧格式组装 CPU将数据写入TBn后发送器自动开始工作。它首先在TxD上输出一个起始位低电平然后依次输出编程设定的数据位5-8位、可选的奇偶校验位最后是1个、1.5个或2个停止位高电平。数据总是LSB先发。时钟与发送 数据在时钟源的下降沿从移位寄存器移到TxD引脚。注意这个时钟是PSC内部根据CLKIN和分频器生成的发送时钟而非外部信号。完成与空闲 停止位发送完毕后如果TBn中没有新的字符TxD引脚将保持高电平标记状态同时TxEMP位被置1表示发送移位寄存器也空了。发送完全停止。关键流程控制与异常处理CTS硬件流控 如果使能了CTS控制MR2n[TxCTS]1那么CTS输入引脚必须为低电平有效字符才能开始发送。如果在发送过程中CTS变为无效高电平当前正在移位寄存器中的字符会继续发完然后TxD进入标记状态并等待直到CTS再次有效才会发送下一个字符。这个机制保证了流控不会打断正在传输的字节。发送断线Break 通过命令寄存器发送断线命令会强制TxD输出连续的低电平。在断线发送期间CTS的状态会被忽略。断线是通知对方通信线路发生重大事件的特殊信号。RTS自动控制 可以编程让发送器在完成一个消息后自动置无效RTSMR2n[TxRTS]1。如果这样做了在发送下一条消息前必须由软件手动重新置位RTS。这个功能常用于半双工通信中切换收发方向。禁用与复位 如果发送器被禁用Disable它会继续完成当前在移位寄存器中的字符发送。但如果发送器被软件复位它会立即停止哪怕字符发到一半。重新使能需要再次操作CRn。图15-8的时序图完美诠释了这些交互。图中C1、C2代表字符W代表CPU写操作。可以看到CTS如何控制发送流程以及断线信号的产生与结束。4.2 接收器Receiver操作详解接收是一个“侦听”和“判决”的过程起始位检测 接收器持续监测RxD线。当检测到一个从高到低标记到空号的跳变时它启动一个采样序列。在异步模式下它会在该跳变后的半个比特时间开始用16倍波特率的时钟采样8次在同步模式下则在下一个比特时钟上升沿采样。起始位验证 如果在采样点RxD为高则判定为虚假起始位重新开始搜索。如果为低则确认为有效起始位。数据位采样 接收器随后在每个比特的理论中心点异步或时钟边沿同步进行采样依次组装数据位。数据在编程时钟源的上升沿被采样LSB先收。字符组装与存储 收齐数据位和可能的校验位后检测停止位。如果一切正常数据被转移到接收保持寄存器或FIFO并置位SRn[RxRDY]。如果字符不足8位高位会被清零。错误处理 接收器非常“敬业”会检测多种错误帧错误FE 未在预期位置检测到停止位高电平。奇偶错误PE 如果使能了奇偶校验计算出的校验位与接收的不符。溢出错误OE CPU来不及读取新字符已经覆盖了未读的旧字符。断线RB RxD线保持低电平的时间超过一个完整字符帧包括停止位。关于断线检测的深层逻辑 手册描述得很细致。如果断线在字符传输中间开始接收器会把那个残缺的字符放入FIFO并设置错误标志。如果断线持续到下一个字符时间则放入一个全0的字符并设置RB标志。RxD必须在断线结束后恢复高电平至少半个比特时间接收器才会重新开始搜索起始位。这个机制防止将断线结束时的上升沿误判为起始位。RTS自动流控 接收器也可以编程为自动控制RTS。当检测到有效起始位且接收FIFO已满时自动置无效RTS通知对方停止发送当FIFO有空间时自动重新置位RTS。将本端的RTS连接到对端设备的CTS即可实现全自动的硬件流控这是防止接收溢出的最佳实践。4.3 多机通信模式Multidrop Mode这是一种特殊的UART应用用于一主多从的网络。通过设置MR1n[PM]进入此模式。帧结构 每个字符帧在停止位前增加了一个地址/数据A/D标志位。A/D1表示该字符是地址A/D0表示是数据。从机工作流程所有从机默认禁用接收器但硬件仍在监控总线。主机发送一个A/D1的地址字符。所有从机都会收到这个地址字符并产生中断如果使能。每个从机的CPU读取地址并与自身地址比较。地址匹配的从机使能其接收器准备接收后续的A/D0的数据字符块。不匹配的从机保持接收器禁用继续只监听地址字符。数据块结束后主机发送下一个地址字符。之前匹配的从机在收到新地址字符后应禁用接收器重新进入监听状态。关键点 在此模式下奇偶校验位被A/D位取代因此硬件不进行奇偶校验。错误检测需依靠软件在数据字段中实现例如如果不需要8位数据可以用最高位做软件奇偶。图15-16的时序图清晰地展示了主从站之间地址帧与数据帧的交替。5. Modem模式与AC97模式操作解析这里的“Modem模式”并非指电话调制解调器而是指与外部编解码器CODEC或AC97音频控制器连接的同步串行接口模式。它们都需要外部时钟CLK和帧同步FRAME信号。5.1 CODEC接口模式Modem8/Modem16此模式用于连接典型的音频或语音编解码器如MC143416手册图15-4。数据以固定长度的样本8位或16位为单位在帧同步信号的控制下连续、同步地传输。时序关系 如图15-916位LSB先行和图15-108位MSB先行所示。帧同步信号FRAME是一个脉冲标志着一个新样本传输周期的开始。数据在帧同步有效后的某个时刻开始传输这个时刻由SICR[DTS1]位控制是在帧同步上升沿立即开始还是延迟一个位时钟CLK周期。帧同步脉冲的宽度对PSC没有影响它只检测边沿。移位顺序 通过SICR[SHDIR]位选择MSB先行还是LSB先行。必须与CODEC设备的约定一致。数据传输 在发送完一个完整的样本8或16位后TxD会持续输出0直到下一个帧同步到来。接收端同理在收齐一个样本后移位寄存器关闭等待下一帧。5.2 AC97控制器接口模式AC97是PC时代经典的音频架构其接口是固定的、标准的。PSC1和PSC2支持此模式见图15-5。核心差异主从角色 PSC作为AC97总线的主控制器。它接收外部的BIT_CLK但自己生成并输出帧同步信号FRAME。FRAME的频率是BIT_CLK / 256。帧结构 每个AC97帧包含13个时隙Slot每个时隙20位。Slot 1的前16位是标签Tag段其中第0位是“CODEC就绪”标志。Slot 2-13用于传输音频或控制数据。移位顺序必须是MSB先行因此SICR[SHDIR]必须设为0。启动流程 这是一个状态机PSC上电后开始输出FRAME信号。接收器持续监听Slot 1的第0位RxD数据流的第一位。只有当检测到该位为1CODEC就绪时PSC才认为AC97设备在线并开始将后续时隙的数据存入Rx FIFO同时从Tx FIFO取出数据发送出去。如果在一帧的开始检测到该位为0PSC会停止在本帧中存取FIFO数据。因此传输实际上是从检测到“就绪”标志后的下一帧才开始。这确保了通信的同步性。低功耗模式管理与复位 这是AC97模式的关键和易错点。AC97设备支持低功耗状态PSC通过监控发送帧的前三个时隙来检测其是否进入省电模式条件见手册15.4.2.3。唤醒AC97设备有两种方式热复位Warm Reset CPU置位SICR[AWR]至少1微秒。这会在AC97模式下断言FRAME输出。这是一种软唤醒。冷复位Cold Reset 这是一个两步操作必须严格按顺序执行硬件复位 CPU将用于AC97复位的GPIO引脚拉低至少保持AC97规格书要求的最短时间。通知PSC在将GPIO复位引脚拉高之后CPU必须写0到PSC的SICR[ACRB]位。这一步至关重要它告诉PSC内部状态机“一个冷复位正在发生请做好同步准备”。如果缺少这一步PSC可能无法正确识别后续AC97设备的就绪状态。5.3 FIFO在不同模式下的访问方式这是编程时容易混淆的地方UART模式或8位CODEC模式 FIFO可以按1、2或4个单字节样本为单位进行访问即一次可读/写多个字节。16位CODEC模式 FIFO必须以1或2个双字节样本为单位访问即一次读/写16位或32位。AC97模式必须一次访问一个样本。此外当读取Rx FIFO时样本的第20位即第21个比特如果为1则标识此样本是一个新帧的第一个时隙。这个硬件标志位极大简化了音频帧的边界识别软件逻辑。6. 回环测试与诊断模式PSC提供了三种内部回环模式用于硬件自检和系统调试无需外部连线。在切换模式前务必先禁用发送器和接收器。6.1 自动回波模式Automatic Echo如图15-13所示在此模式下PSC将接收到的数据比特流实时地发送回去。CPU到接收器的通信正常但到发送器的链路被断开。发送器本身不工作因此状态位TxRDY/TxEMP无效。它检查接收数据的奇偶和帧但原样转发不重新计算。断线信号也会被回波。此模式用于测试通信链路。6.2 本地回环模式Local Loop-Back如图15-14所示这是最常用的自检模式。TxD和RxD在芯片内部短接。CPU可以正常向发送器写数据并正常从接收器读回数据。外部RxD输入被忽略TxD输出保持标记状态。关键是接收器使用发送器的时钟。此模式用于验证PSC模块自身的发送、接收和FIFO功能是否完好。6.3 远程回环模式Remote Loop-Back如图15-15所示与自动回波类似也是转发接收到的比特流。但不同之处在于接收器不工作CPU无法读取接收到的数据错误状态也无效。发送器使用接收器的时钟。此模式设计用于测试远程设备的收发功能。7. 软件编程流程与实战要点手册图15-17至15-21的流程图给出了UART模式的编程骨架但实际编程需要填充血肉。以下是基于流程图和寄存器描述的初始化与操作核心步骤。7.1 初始化序列以UART模式为例初始化的黄金法则先配置后使能。表15-55是很好的清单但需要细化软件复位 写CRn复位接收器和发送器。这将FIFO和状态机清零。设置中断 配置中断向量寄存器IVRn和中断屏蔽寄存器IMRn决定哪些事件如RxRDY, TxRDY, 错误能产生中断。配置引脚 通过ACRn初始化输入使能控制如果需要。设置时钟源 配置时钟选择寄存器CSRn选择内部时钟源通常是定时器分频后的时钟。计算并设置波特率 根据CLKIN频率和目标波特率计算CTURn/CTLRn的值并写入。配置帧格式 通过MR1n和MR2n设置MR1n: 数据位长度5/6/7/8、奇偶校验模式与类型奇校验、偶校验、无校验、多机模式设置。MR2n: 停止位长度1, 1.5, 2、流控模式TxCTS, TxRTS、操作模式正常UART。设置FIFO阈值 根据系统性能设置RFALARMRx FIFO“几乎满”阈值和TFALARMTx FIFO“几乎空”阈值。例如设置RFALARM为3/4深度可以在FIFO快满时提前产生中断让CPU来读取避免溢出。最后使能 写CRn使能接收器和发送器。如果使用RTS/CTS流控此时RTS应根据配置自动或手动置位。对于Modem/AC97模式在第6步之后还需配置SICR寄存器选择模式MODE、移位方向SHDIR、帧同步延迟DTS1等。7.2 数据收发与中断处理查询方式 最简单的驱动方式。发送前循环检查SRn[TxRDY]接收时循环检查SRn[RxRDY]。这种方式效率低会占用大量CPU时间。中断方式 推荐的高效方式。使能相应中断后发送中断 通常在Tx FIFO“几乎空”或完全空时触发。中断服务程序ISR从应用缓冲区填充数据到Tx FIFO。接收中断 通常在Rx FIFO“几乎满”或非空时触发。ISR从Rx FIFO读取数据到应用缓冲区并检查SRn中的错误位PE, FE, OE, RB。错误中断 单独处理通信错误如断线检测。手册中的SIRQ例程就是处理“断线状态变化”中断的典型例子。一个关键陷阱 读取接收数据时必须先读状态寄存器SRn获取错误信息再读数据缓冲区RBn。因为读RBn的操作会“弹出”FIFO顶部的数据并可能更新状态位。如果顺序反了你读到的错误状态可能属于下一个字符。7.3 调试技巧与常见问题排查无数据收发检查时钟 这是最常见的问题。确认CLKIN频率是否正确波特率分频器计算无误。用示波器测量TxD引脚看是否有任何波形。在UART模式下即使无数据TxD也应保持高电平。检查使能位 确认CRn中的发送器和接收器使能位已设置。检查流控 如果使能了CTS流控确保CTS输入引脚为有效低电平。可以暂时在软件中禁用流控MR2n[TxCTS]0进行测试。数据错误乱码波特率不匹配 发送和接收端波特率哪怕有微小差异长期传输也会出错。精确计算并核对分频值。帧格式不匹配 数据位、停止位、奇偶校验设置必须两端一致。例如一端8N18数据位无校验1停止位另一端7E17数据位偶校验1停止位必然出错。电气问题 线路过长、干扰大可能导致信号畸变。在工业环境中确保使用了正确的RS-232电平转换芯片且共地良好。AC97模式无声或声音异常复位序列 确保严格按照冷复位两步法操作特别是第二步写SICR[ACRB]。“CODEC就绪”检测 用逻辑分析仪抓取AC97总线检查Slot 1的第0位是否为1。如果一直是0说明AC97设备未正确响应或初始化。帧同步 检查FRAME输出信号频率是否为BIT_CLK/256波形是否正确。FIFO访问 确认在AC97模式下是以单个样本20位数据注意对齐为单位访问FIFO的。FIFO溢出或数据丢失流控未启用或失效 在高速或大数据量传输时务必启用硬件RTS/CTS流控。中断服务太慢 优化ISR减少关中断时间。考虑使用DMA如果PSC支持来搬运FIFO数据。FIFO阈值设置不当 调整RFALARM/TFALARM让中断更早触发给CPU留出足够的响应时间。理解并熟练运用PSC模块尤其是其丰富的模式选择和硬件流控功能能极大提升嵌入式系统的通信可靠性和整体性能。它就像一位沉默可靠的通信管家只要配置得当就能独立处理好大部分底层通信杂务让CPU得以专注于更有价值的任务。在实际项目中建议从最简单的UART查询模式开始逐步测试中断、流控最后再挑战复杂的AC97等同步模式每一步都用示波器或逻辑分析仪验证信号这样才能扎实掌握。