MC68HC681 DUART:双通道串口通信芯片架构、编程与调试全解析

发布时间:2026/6/18 23:11:49
MC68HC681 DUART:双通道串口通信芯片架构、编程与调试全解析 1. MC68HC681 DUART嵌入式通信的“瑞士军刀”在嵌入式系统开发尤其是那些需要与多个外围设备、其他微控制器或上位机进行数据交换的项目里串行通信接口UART几乎是工程师的“空气和水”。它简单、可靠、历史悠久是调试信息输出、参数配置、模块间对话的首选协议。然而当你的系统需要同时与两个甚至更多设备进行异步通信时事情就开始变得复杂。是选择两个独立的UART芯片增加布线和成本还是用软件模拟牺牲宝贵的CPU时间和稳定性摩托罗拉后来的飞思卡尔的MC68HC681 DUARTDual Universal Asynchronous Receiver/Transmitter为这个问题提供了一个优雅的工业级答案。MC68HC681不仅仅是将两个UART封装在一起。它集成了两个完全独立且功能完整的异步串行通道每个通道都自带深度缓冲、灵活的时钟选择、硬件流控支持以及多种诊断模式。更关键的是它还内置了一个16位的可编程计数器/定时器以及一个8位的通用输入/输出GPIO端口。这种高度集成使得它在上世纪80年代末到本世纪初的工业控制、电信设备、POS终端和复杂的嵌入式网关中极为常见。即便在今天理解这颗芯片的工作原理对于维护遗留系统、学习经典的通信控制器设计思想乃至在特定场景下选型都极具价值。本文将深入拆解MC68HC681 DUART的核心工作原理、寄存器编程细节以及在实际应用中的关键技巧让你不仅能看懂数据手册更能用好这颗经典的通信芯片。2. 核心架构与工作模式全景解析MC68HC681 DUART的设计哲学是“独立但可协同”。其核心可以看作是两个并行的UART子系统共享一套与CPU交互的总线接口、一个计数器/定时器模块和一个I/O端口模块。理解这个架构是进行有效编程和故障排查的基础。2.1 双通道独立性与内部数据流芯片内部通道A和通道B在逻辑上是完全独立的。它们拥有各自独立的发送器Transmitter、接收器Receiver、模式寄存器MR1A/MR2A, MR1B/MR2B、命令寄存器CRA, CRB、状态寄存器SRA, SRB以及时钟选择寄存器CSRA, CSRB。这意味着你可以为两个通道配置不同的波特率、数据格式数据位、停止位、校验位并让它们同时工作而互不干扰。数据流是理解UART工作的关键。对于发送过程CPU将待发送的数据字节写入发送保持寄存器THR在手册中常被称为Transmit Buffer如TBA/TBB。这个寄存器是CPU可访问的。当发送移位寄存器TSR空闲时硬件会自动将THR中的数据加载到TSR中。一旦加载完成THR就变为“空”状态状态寄存器的TxRDY位会置1并可能产生中断通知CPU可以写入下一个字节。与此同时TSR开始工作按照设定的格式起始位、数据位、校验位、停止位和波特率时钟将数据逐位移出到TxD引脚。这个过程是并行的CPU可以填充下一个字节到THR而TSR正在发送当前字节从而实现了一个字节的缓冲提高了效率。接收过程则更为精巧。RxD引脚上的串行数据首先进入接收移位寄存器RSR。接收器会持续监测RxD线路寻找从高电平Mark空闲状态到低电平Space的跳变即起始位。一旦检测到有效的起始位RSR便会在每个数据位的理论中心点进行采样将串行数据组装成并行字节。组装完成后该字节会被送入一个三级的FIFOFirst-In First-Out接收保持寄存器堆栈。这个FIFO是MC68HC681的一大亮点它意味着芯片可以连续接收最多3个字节而无需CPU立即读取。只有当CPU通过读取接收缓冲寄存器RBA/RBB从FIFO顶部“弹出”一个字节后FIFO中后续的字节才会依次上移。状态寄存器的RxRDY位在FIFO中有一个或以上字节时置1FFULL位则在FIFO满3个字节时置1。这种四级缓冲1个RSR 3级FIFO的设计极大地减轻了CPU的中断服务压力特别适合处理突发数据流。2.2 可编程计数器/定时器C/T的双重角色这个16位的C/T模块是DUART功能扩展的灵魂。它并非UART通信所必需但为系统提供了宝贵的定时和计数资源。它有两种基本模式计数器模式Counter Mode和定时器模式Timer Mode。在计数器模式下C/T作为一个递减计数器工作。CPU可以向计数器高/低寄存器CTUR/CTLR写入一个预加载值范围0x0001到0xFFFF。当CPU发出“启动计数器”命令后计数器从预加载值开始根据选定的时钟源可以是外部IP2引脚信号、通道A/B的发送时钟或X1晶振的16分频进行递减计数。当计数从0x0001到达0x0000称为终端计数时中断状态寄存器ISR中的CTRDY位被置位并可配置产生中断。之后计数器会翻转到0xFFFF继续递减。CPU可以随时发出“停止计数器”命令来暂停计数并安全地读取当前计数值。这个模式非常适合用于事件计数如脉冲计数或生成单次延时。在定时器模式下C/T变成一个自动重载的方波发生器。它同样从预加载值开始递减到达终端计数0x0000时其输出翻转并自动重载预加载值开始下一个计数周期。因此它输出的方波周期是2 × (预加载值) × (时钟源周期)。这个稳定的方波输出可以被编程为通道A和B的发送或接收时钟源从而让两个UART通道共享一个精确的、可编程的波特率发生器无需外部时钟芯片。同时它也能作为系统的周期性中断源。需要注意的是定时器模式一旦启动就无法停止只能复位中断标志它会一直运行提供稳定的时钟基准。2.3 输入/输出I/O端口与硬件流控MC68HC681提供了6个输入引脚IP0-IP5和8个输出引脚OP0-OP7。它们的功能远不止简单的GPIO。通过灵活的编程这些引脚可以复用为UART和C/T模块的关键控制信号实现硬件流控这是构建可靠通信链路的关键。最重要的复用功能是硬件流控。对于发送端可以通过设置模式寄存器启用“自动RTS”功能。此时对应的输出引脚如OP0用于通道A变为TxRTS请求发送信号。在发送开始时需要软件手动置位TxRTS为有效低电平。当发送器被禁用且其发送移位寄存器和保持寄存器都为空时芯片会自动将TxRTS置为无效高电平告知对方“我已完成发送通道空闲”。对于接收端可以启用“自动RTR”功能使对应输出引脚变为RxRTR接收就绪信号。当接收器的FIFO满时芯片会自动拉低RxRTR通知发送方“暂停发送”当FIFO有空位时再自动拉高RxRTR允许继续发送。通常我们会将本机的TxRTS连接到对端的CTS清除发送对应IP0或IP1输入引脚将对端的RTR连接到本机的CTS形成一个双向的硬件流控环从根本上避免因处理速度不匹配导致的数据丢失。此外输入引脚IP2可以作为C/T的外部时钟源输出引脚OP3可以输出C/T的计数完成信号或方波信号。其他I/O引脚也可以被配置为中断源变化检测或通用的状态指示。这种高度的集成和复用使得MC68HC681能够以最小的外围电路实现复杂的通信和系统管理功能。3. 寄存器编程详解与实战配置对MC68HC681的编程本质上就是通过CPU读写其内部的一系列寄存器来实现。这些寄存器分为几大类控制类模式、命令、时钟选择、状态类、数据缓冲类以及辅助控制类。理解每个寄存器的位定义和访问顺序是成功驱动芯片的第一步。3.1 寄存器地址映射与访问顺序MC68HC681通过4根寄存器选择线RS1-RS4和读/写R/W信号来寻址内部寄存器。其地址映射表对应手册中的Table 4-1是编程的“地图”。一个需要特别注意的细节是模式寄存器MR1和MR2的访问顺序。它们共享同一个地址对于通道A是0b0000。首次向该地址写入时数据会进入MR1后续的写入操作在发出特定的“复位指针”命令通过命令寄存器之前都会进入MR2。这是一个经典的“双缓冲”设计很容易在初始化时出错。正确的初始化顺序通常是先写MR1再写MR2完成通道的基本配置。另一个关键点是命令寄存器CRA/CRB。它用于触发瞬时动作如复位接收器/发送器、启用/禁用接收器/发送器、发出中断应答等。向命令寄存器写入不同的位组合相当于给DUART下达一个“动作”指令。例如软件复位发送器并不会丢失正在发送的字符会发送完但会丢弃发送保持寄存器中的字符而复位接收器则会清空整个FIFO堆栈和所有状态标志。3.2 通道初始化流程与参数计算一个典型的UART通道初始化流程如下我们以通道A目标波特率9600bps8位数据位1位停止位无校验启用接收为例软件复位通过命令寄存器CRA发出“复位接收器”和“复位发送器”命令。这是一个好习惯确保通道从一个已知的干净状态开始。配置模式寄存器MR1A写入MR1A。需要设置的位包括字符长度例如11代表8位。校验类型例如00代表无校验。校验模式普通模式。错误模式字符模式或块模式初学者建议用字符模式。是否启用接收器RTS流控根据需求。配置模式寄存器MR2A紧接着写入MR2A。需要设置的位包括停止位长度例如1代表1位停止位。是否启用发送器CTS流控根据需求。是否启用发送器自动RTS根据需求。配置时钟选择寄存器CSRA这是设定波特率的关键。波特率时钟源可以是外部引脚TxCA, RxCA也可以是内部C/T产生的时钟。计算公式为波特率 (时钟源频率) / (分频系数 × 16)。手册的Table 4-3和4-4详细列出了CSRA[7:4]接收时钟和CSRA[3:0]发送时钟的编码对应不同的分频系数如1, 16, 64等。例如若系统主晶振频率为3.6864MHz要得到9600bps的时钟分频系数应为24因为3.6864MHz / (24 × 16) 9600。我们需要在CSRA的编码表中找到最接近24的可用分频系数配置。启用通道最后通过命令寄存器CRA发出“启用接收器”和“启用发送器”命令。此时接收器开始监测RxDA引脚发送器准备就绪。注意在通道运行期间切忌随意更改CSRA、ACR[7]以及模式寄存器的大部分位多机通信的地址/数据位除外。如需更改必须先通过命令寄存器禁用并复位对应的接收器/发送器修改配置后重新启用。否则可能导致通信错乱或字符格式错误。3.3 计数器/定时器C/T的配置与应用C/T的配置主要通过辅助控制寄存器ACR和计数器/定时器寄存器CTUR, CTLR完成。模式选择ACR[6]位决定C/T工作在计数器模式0还是定时器模式1。时钟源选择ACR[5:4]位选择时钟源具体选项见手册Table 4-4。例如在定时器模式下可以选择IP2引脚输入1X或16X分频或X1晶振1X或16X分频。预加载值设置向CTUR高8位和CTLR低8位写入16位的初始值。值为0x0001到0xFFFF。在定时器模式下方波周期 2 × N × Tclk其中N是预加载值Tclk是时钟源周期。启动与停止计数器模式向“启动计数器”命令地址执行读操作计数器加载预加载值并开始递减。向“停止计数器”命令地址执行读操作计数器暂停。只能在停止状态下安全读取当前计数值CUR/CLR。定时器模式向“启动计数器”命令地址执行读操作会复位当前计数序列并重新开始。向“停止计数器”命令地址执行读操作仅清除中断状态位ISR[3]不会停止定时器。定时器运行时不应读取其计数值因为高低字节的读取可能发生在两次借位之间导致读到错误值。一个常见应用是将C/T配置为定时器模式产生一个精确的38.4kHz时钟然后通过CSRA/CSRB将其设置为通道A和B的波特率时钟源。这样只需一个外部晶振就能为两个UART通道提供稳定且可调的波特率节省了外部波特率发生器芯片。4. 高级工作模式与诊断技巧除了标准的异步通信模式MC68HC681还提供了几种特殊工作模式用于系统诊断和多设备组网这些功能在复杂系统中非常实用。4.1 循环回环模式Looping Modes循环回环模式主要用于通信链路的自检和故障隔离。芯片提供了三种模式自动回波模式Automatic-Echo Mode在此模式下接收器接收到的数据会逐位地立即自动转发给发送器发送出去。CPU到接收器的通信正常CPU可以读到数据但CPU到发送器的链路被禁用CPU写入发送缓冲区的数据不会被发送。这个模式通常用于测试本机UART核心接收发送的基本功能是否正常以及检查RxD和TxD引脚的外部连接如电平转换芯片是否有问题。本地环回模式Local-Loopback Mode此模式下发送器的输出在芯片内部直接连接到接收器的输入外部TxD引脚被强制保持在高电平Mark状态。CPU到发送器和接收器的通信都正常。这是最彻底的本地自检。你可以让CPU发送一串数据然后从接收器读取比较两者是否一致。如果一致则证明该通道内部的发送移位寄存器、接收移位寄存器、时钟电路等完全正常。这常用于系统上电自检POST。远程环回模式Remote-Loopback Mode此模式下通道也会自动将接收到的数据逐位回传发送出去但同时禁用本地CPU与接收器和发送器的连接。这个模式需要配合远程设备使用。将本地DUART设置为此模式后远程设备发送的数据会被本地DUART原样发回。远程设备通过比较发送和接收的数据可以测试整个通信链路包括线路、两端的接口电路的完整性而本地CPU无需参与。实操心得在系统调试初期强烈建议先使用“本地环回模式”验证每个DUART通道本身的硬件和底层驱动是否工作正常。这能迅速排除芯片损坏、焊接不良、电源或时钟问题。只有在本地环回测试通过后再进行实际的对外通信测试可以大大缩小问题排查范围。4.2 多机通信模式Multidrop Mode多机通信模式是实现“一主多从”总线式异步通信的关键。在这种模式下一个主站Master通过一条总线连接多个从站Slave每个从站都有一个唯一的地址。其工作原理的核心是“地址/数据位”A/D Bit。在普通模式下一个字符由起始位、数据位、校验位、停止位组成。在多机模式下校验位被替换为A/D位。当A/D位为1时表示该字符是一个地址字符为0时表示是数据字符。通信过程如下所有从站的接收器初始处于禁用但监听状态。它们不将数据字符装入FIFO但持续监听总线。主站发送一个A/D位为1的地址字符后跟A/D位为0的数据字符块。所有从站收到地址字符A/D1时都会将字符装入FIFO并置位RxRDY可产生中断通知其CPU。每个从站的CPU读取这个地址字符并与自己的预设地址比较。地址匹配的从站其CPU通过命令寄存器启用接收器。此后主站发送的数据字符A/D0才会被该从站接收并存入FIFO。地址不匹配的从站其接收器保持禁用监听状态忽略后续的数据字符直到检测到下一个地址字符A/D1。数据块传输结束后主站可以发送下一个地址字符开始新一轮通信。被寻址的从站在接收完数据后可以再次禁用其接收器等待下一次寻址。注意事项在多机模式下校验功能被禁用因为A/D位取代了校验位。如果通信协议需要错误检测必须在软件层面实现例如使用5/6/7位数据位留出1-2位由软件计算校验和如累加和校验或者在整个消息末尾附加CRC校验码。此外从站的地址识别和接收器启用/禁用操作必须非常迅速通常需要在中断服务程序中完成以确保不错过紧随地址字符之后的数据。5. 数据收发管理与中断策略高效、可靠地管理数据收发是嵌入式通信程序的核心。MC68HC681提供了状态查询和中断两种方式结合其FIFO和丰富的状态标志可以设计出非常稳健的通信驱动。5.1 状态寄存器深度解读与错误处理每个通道的状态寄存器SRA/SRB是CPU了解UART实时状态的眼睛。关键位包括RxRDY接收就绪。FIFO中有至少1个字符可读时为1。这是轮询方式下最常检查的位。FFULLFIFO满。FIFO中3个位置全满时为1。可用于实现更积极的流控。TxRDY发送就绪。发送保持寄存器THR为空可接受新字符时为1。TxEMT发送器空。发送移位寄存器和保持寄存器都为空时为1。在自动RTS模式下此条件会触发RTS信号无效。错误标志位PE奇偶校验错误在多机模式下此位反映A/D位。FE帧错误。停止位采样为0且非Break信号。OE超限错误。FIFO已满接收移位寄存器中又有新字符组装完成导致旧字符被覆盖。BRK接收到Break信号。RxD线路保持低电平超过一个完整的字符传输时间。错误处理策略取决于配置的“错误模式”字符模式Character Mode错误标志仅针对FIFO顶部的那个字符有效。必须在读取数据字符之前先读取状态寄存器以获取该字符的错误信息。读取数据字符后该字符及其错误标志会从FIFO中弹出。块模式Block ModePE、FE、BRK标志位是自上次“复位错误”命令以来所有到达FIFO顶部的字符对应错误标志的“逻辑或”。这适用于需要高速接收大块数据且只在块尾进行一次性错误检查的场景。但缺点是一旦出错无法定位是块中哪个字符出错。避坑指南对于大多数应用推荐使用字符模式。它虽然增加了少量软件开销每次读数据前先读状态但提供了最精确的错误定位。在处理超限错误OE时通常意味着你的软件处理速度跟不上数据到达速度需要检查是否启用了硬件流控或者优化中断服务程序/轮询逻辑。5.2 中断系统的配置与使用MC68HC681有一个集中的中断系统。中断状态寄存器ISR指示中断源中断屏蔽寄存器IMR用于使能或屏蔽特定中断源。中断源非常丰富包括通道A/B的接收就绪或FIFO满通道A/B的发送就绪通道A/B的接收错误包括多种错误组合计数器/定时器终端计数输入端口状态变化中断向量寄存器IVR允许你设置一个中断向量号当CPU响应中断时DUART会将该向量号放到数据总线上帮助CPU快速跳转到对应的中断服务程序ISR。中断服务程序设计要点读取ISR进入ISR后第一件事是读取ISR以确定是哪个或哪些事件触发了中断。因为多个中断可能同时发生。分层处理根据ISR的值跳转到对应的处理子程序。例如如果是接收就绪中断则循环读取RBA直到FIFO为空如果是发送就绪中断则从发送缓冲区加载下一个字符到THR。清除中断源对于某些中断如计数器中断需要在ISR中通过向特定命令地址执行“读”操作来清除中断标志ISR[3]。对于发送/接收中断在读取RBA或写入TBA后硬件会自动更新状态通常无需额外操作。效率考虑利用FIFO。在接收中断中不要只读一个字节就退出而应持续读取直到RxRDY变为0。这可以减少中断次数提高效率。同样在发送中断中可以连续加载多个字节到THR直到发送缓冲区空或TxRDY变为0。5.3 FIFO缓冲机制的最佳实践三级接收FIFO是提升性能的关键。要充分利用它中断触发阈值选择你可以选择让RxRDYFIFO非空或FFULLFIFO满来触发接收中断。如果数据是偶尔的单字节命令选择RxRDY可以降低响应延迟。如果数据是连续的流选择FFULL可以减少中断频率但需要确保你的ISR能在下一个字符导致超限错误前清空FIFO。配合硬件流控启用RxRTR自动RTR功能是最佳实践。当FIFO满时DUART会自动拉低RxRTR通常连接到对方的CTS让对方暂停发送。这从硬件层面杜绝了超限错误的发生是可靠通信的基石。软件缓冲区扩展即使在芯片层面有了3字节FIFO在软件层面维护一个更大的环形缓冲区Ring Buffer仍然是标准做法。在接收中断服务程序中将FIFO中的所有字节快速读出存入软件环形缓冲区主循环或后台任务再从软件缓冲区中解析和处理数据。这种“硬件FIFO软件缓冲区”的双缓冲架构能有效应对数据突发并解耦实时性要求高的中断服务与可能耗时的数据处理逻辑。6. 常见问题排查与调试实录在实际硬件调试中遇到通信问题是常态。以下是一些基于MC68HC681特性的常见问题排查思路。6.1 通信完全无数据检查基础配置电源与时钟首先用示波器检查VCC和GND是否稳定X1/X2引脚是否有正确的晶振波形通常为正弦波或方波。没有时钟一切免谈。复位与初始化确认复位引脚RESET在上电后已释放为高电平。检查软件初始化序列是否正确特别是MR1/MR2的写入顺序以及最后是否发出了“启用接收器/发送器”的命令。波特率匹配这是最常见的问题。双检查CSRA/CSRB的配置值确认双方设备的波特率、数据位、停止位、校验位设置完全一致。可以用示波器测量TxD引脚一个起始位低电平的持续时间应为1 / 波特率。例如9600bps下起始位应持续约104微秒。检查硬件连接交叉连接确保A设备的TxD连接到B设备的RxDA设备的RxD连接到B设备的TxD。电平匹配MC68HC681是TTL/CMOS电平0V为逻辑0VCC为逻辑1。如果连接RS-232设备中间必须经过MAX232之类的电平转换芯片。用万用表或示波器测量TxD引脚在空闲状态下应为高电平Mark。流控引脚如果启用了硬件流控RTS/CTS请检查连接是否正确本机RTS接对端CTS并且对端设备是否已准备好CTS为低。一个被拉高的CTS会锁死发送器。6.2 数据错误乱码、丢帧电气干扰与接地长距离通信时干扰可能导致位错误。确保通信线有良好的屏蔽共地良好。尝试降低波特率看问题是否消失。时钟精度异步通信对时钟精度有一定容忍度但偏差过大会导致采样点偏移积累误差后造成帧错误。检查晶振频率是否准确特别是使用内部C/T作为波特率源时计算预加载值是否有误。软件读取不及时如果接收方软件读取FIFO的速度太慢可能导致超限错误OE。检查状态寄存器的OE位是否被置位。如果频繁发生考虑启用硬件流控RTR/CTS或者优化软件确保中断服务程序能及时取走数据。Break信号误触发如果RxD线路受到干扰长时间为低可能被误判为Break信号导致BRK位置位并插入一个全零字符。检查硬件连接和线路环境。6.3 中断不触发中断总使能确认CPU本身的中断系统已全局使能。DUART中断配置检查中断屏蔽寄存器IMR是否使能了对应的事件如接收就绪、发送就绪。检查命令寄存器CRA/CRB是否配置了中断输出例如中断输出到IRQ引脚还是到某个OPx引脚。对于接收中断确认接收器已启用CRA命令。对于计数器中断确认在计数器模式下已发出“启动计数器”命令在定时器模式下定时器已在运行。中断引脚连接如果配置为IRQ输出检查IRQ引脚是否正确连接到CPU的中断请求输入引脚并且是低电平有效还是下降沿有效与CPU配置是否匹配。中断服务程序在ISR中是否清除了中断源对于计数器中断需要读“停止计数器”命令地址来清除ISR[3]。不清除会导致中断持续触发或不再触发。6.4 多机通信模式下的特定问题从站无响应检查所有从站的地址配置是否唯一且与主站发送的地址字符匹配。确认所有设备都正确配置为多机模式设置MR1的相应位并且A/D位极性设置一致。从站的CPU在收到地址字符中断后必须在下一个数据字符到来之前完成地址比较并启用接收器。这个时间窗口很紧需要高效的中断服务程序。数据被所有从站接收检查主站发送的数据字符的A/D位是否确实为0。如果误设为1所有监听状态的从站都会将其当作地址字符装入FIFO。调试MC68HC681一把好的示波器或逻辑分析仪至关重要。通过抓取TxD、RxD、RTS、CTS以及关键配置引脚如芯片选择CS的波形可以直观地看到数据流、时序关系以及配置命令的写入过程绝大多数问题都能迎刃而解。从最基础的本地环回测试开始逐步扩展到点对点通信最后再搭建多机网络这种循序渐进的调试方法能帮你系统地建立信心并定位问题所在。

月新闻