1. 项目概述:深入MC68349串行通信模块的内核
在嵌入式系统开发,尤其是基于Motorola 68000系列处理器的经典系统中,串行通信(UART)是连接设备与外部世界的“咽喉要道”。它不像并行总线那样需要大量引脚,仅凭TxD、RxD两根线就能实现全双工数据交换,这种简洁高效的设计使其在工业控制、数据采集、多机联网等场景中经久不衰。今天,我们就来深入拆解一款极具代表性的芯片——MC68349集成处理器中的串行通信模块(Serial Module)。这个模块远不止一个简单的UART,它集成了独立的波特率发生器、深度可配置的FIFO缓冲区、灵活的多机通信模式以及丰富的硬件流控支持,堪称嵌入式串行通信设计的教科书级范例。
对于从事老系统维护、嵌入式教学或对经典架构有浓厚兴趣的工程师来说,理解MC68349的串行模块,不仅能让你驾驭这块特定芯片,更能深刻理解通用异步收发器(UART)设计的核心思想与权衡艺术。无论是配置一个简单的9600波特率串口,还是构建一个复杂的、带硬件流控的多点通信网络,其底层逻辑都在这里。本文将带你从模块框图走到寄存器位,结合手册中的时序图与配置表,还原一个资深嵌入式工程师在调通这个模块时的完整思考路径与实操细节。
2. 核心模块架构与工作模式解析
MC68349的串行模块是一个高度集成且功能完备的双通道UART。每个通道(A和B)完全独立,拥有自己的一套控制、状态和数据寄存器。这种设计允许系统同时管理两个独立的串行数据流,例如一个用于调试终端输出,另一个用于连接调制解调器或传感器网络。
2.1 模块整体框图与数据流
从系统视角看,串行模块是CPU32+内核与外部串行引脚(TxD, RxD, RTS, CTS等)之间的桥梁。其核心数据通路围绕两个关键缓冲区展开:发送缓冲区(Transmit Buffer, TB)和接收缓冲区(Receive Buffer, RB)。
发送路径:当CPU需要发送数据时,它将一个字节写入对应通道的发送缓冲区(TBA/TBB)。这个缓冲区实际上是一个单字节的保持寄存器(Transmit Holding Register)。一旦该寄存器为空(TxRDY状态位置1),且发送移位寄存器(Transmit Shift Register)也准备就绪,数据便会从保持寄存器加载到移位寄存器中。随后,在波特率时钟的驱动下,移位寄存器将并行数据转换为串行比特流,从TxD引脚逐位送出。这个过程会自动添加起始位、可编程的奇偶校验位和停止位。
接收路径:数据接收是一个相反的过程。RxD引脚上的串行数据在接收时钟同步下,被移入接收移位寄存器(Receiver Shift Register)。当一个完整的字符(包括起始位、数据位、校验位和停止位)接收完毕并经过校验后,该字符及其状态(如奇偶错误、帧错误)会被压入接收FIFO堆栈。这个FIFO是模块设计的一大亮点,它由三个接收保持寄存器(Receiver Holding Register)组成,实现了四级缓冲(一个移位寄存器 + 三个FIFO单元)。CPU通过读取接收缓冲区(RBA/RBB)来从FIFO顶部“弹出”数据。状态寄存器(SRA/SRB)会实时反映FIFO顶部的字符状态或错误信息。
控制与状态:所有行为都由一组寄存器精密控制。模式寄存器(MR1, MR2)定义了字符格式、奇偶校验、工作模式等;命令寄存器(CR)用于动态启用/禁用收发器、发送中断命令等;时钟选择寄存器(CSR)和辅助控制寄存器(ACR)共同决定波特率;状态寄存器(SR)和中断状态寄存器(ISR)则让CPU能够轮询或通过中断感知模块状态。
2.2 关键工作模式深度剖析
模块支持几种超越基本UART的高级工作模式,这对于系统调试和网络构建至关重要。
2.2.1 自动回波模式(Automatic Echo Mode)在此模式下,通道接收到的数据会立即、按位地重新从TxD引脚发送出去,就像一个数字回声。本地CPU到接收器的通信(即CPU读取接收数据)仍然正常进行,但CPU到发送器的链路被禁用。这意味着发送器本身并未被“启用”,它只是被动地转发接收到的比特流。
实操心得:自动回波模式是测试通信链路物理层完整性的绝佳工具。例如,你可以将开发板的TxD和RxD短接,然后让上位机发送数据。如果配置为自动回波,上位机发送的每一个字符都应该被立刻回传回来。如果收不到回波,则可能是波特率设置错误、引脚连接问题或时钟源故障。需要注意的是,此模式下接收器会进行奇偶校验,但发送时不会重新计算奇偶位,而是原样发送接收到的校验位。这要求通信双方使用相同的校验设置。
2.2.2 本地环回模式(Local Loopback Mode)这是更彻底的自我测试。在此模式下,芯片内部将通道的TxD输出直接连接到RxD输入,完全绕过了外部引脚。发送器必须被启用,CPU可以正常写入发送缓冲区,数据会经过完整的发送处理流程(添加起始位、停止位等),然后直接被内部环回到接收路径,由接收器进行解帧和校验。
注意事项:进行本地环回测试前,务必先禁用接收器。因为此时外部RxD引脚输入被忽略,如果外部有信号干扰,可能会影响测试结果。测试时,CPU写入一个数据到发送缓冲区,然后去读取接收缓冲区。如果读回的数据与发送的一致,且无帧错误、奇偶错误,则证明该通道内部的发送逻辑、接收逻辑以及波特率发生器工作正常。这是排查软件驱动问题(如寄存器配置错误)与硬件问题(如外部电平转换芯片故障)的分水岭。
2.2.3 远程环回模式(Remote Loopback Mode)此模式用于测试远程设备。本地通道的发送器被禁用,但接收器接收到的数据会按位从TxD引脚发送出去。这相当于本地设备成了一个透明的“中继器”或“回声器”。远程设备可以通过观察其发送的数据是否被原样环回,来测试通信链路和本地设备的接收功能。
模式切换黄金法则:手册中明确强调,在切换这些循环模式之前,必须确保通道的发送器和接收器都已禁用。这是因为模式切换是立即生效的,如果正在收发数据时突然改变内部连接,会导致数据帧混乱甚至硬件状态机锁死。安全的操作顺序是:1) 发送禁止命令;2) 接收禁止命令;3) 等待当前操作完成(可通过查询状态位);4) 配置模式寄存器(MR2)中的CM[1:0]位;5) 按需重新启用发送器或接收器。
3. 波特率生成:精度与灵活性的基石
串行通信的同步依赖于精确的波特率时钟。MC68349的波特率发生器设计兼顾了灵活性与精度,提供了两种时钟源和丰富的分频选择。
3.1 时钟源与发生器结构
模块的时钟心脏是一个3.6864 MHz的晶体振荡器。选择这个特定频率并非偶然,它是早期电信标准中常见的基准频率,通过整数分频可以轻松得到一系列标准波特率,如300, 1200, 2400, 9600等。模块也支持外部SCLK输入,这为系统使用更高精度或特殊频率的时钟源提供了可能。
波特率发生器的核心是一个可编程分频器。时钟选择寄存器(CSR)中的RCS[3:0](接收时钟选择)和TCS[3:0](发送时钟选择)位,各自独立地为接收器和发送器选择时钟分频比。值得注意的是,辅助控制寄存器(ACR)的最高位(BRG)用于在两组预定义的波特率表之间切换。这相当于将���用的波特率选项翻倍。
时钟选择逻辑:除了从预定义表中选择,CSR还提供了两个特殊值:
1110:选择SCLK/16。此时,外部提供的SCLK时钟被16分频后作为UART的位时钟(即1x时钟)。这用于异步模式,因为UART接收器需要16倍过采样来定位起始位中心。1111:选择SCLK/1。外部SCLK直接作为位时钟。这用于同步模式,通信双方需要共享同一个同步时钟信号。
3.2 波特率计算与配置实战
假设我们使用内部3.6864 MHz晶体,需要配置通道A的发送和接收波特率均为9600 bps。
- 确定分频系数:对于异步模式,UART内部实际运行在16倍波特率的频率上(用于采样)。因此所需时钟频率 = 9600 * 16 = 153600 Hz。
- 计算分频比:基准频率 / 所需频率 = 3686400 / 153600 = 24。这是一个整数分频,可以产生非常精确的9600波特率。
- 查找寄存器值:查阅手册中的表8-1和表8-2。我们需要找到对应分频比为24的编码。在ACR的BRG位为0(选择Set 1)时,
TCS/RCS = 1011对应9600波特率。在BRG位为1(选择Set 2)时,1011同样对应9600。但注意,Set 2中的1010对应1800,1100对应19200。因此,我们选择1011。 - 配置步骤: a. 等待晶体稳定:读取中断状态寄存器(ISR)的XTAL_RDY位,确保其为0。 b. 配置ACR的BRG位(例如,设为0选择Set 1)。 c. 向CSRA寄存器写入
0xBB(二进制1011 1011),即接收和发送时钟都选择1011(9600)。
踩坑记录:绝对不要在晶体振荡器未稳定时(XTAL_RDY=1)去配置CSR寄存器。不稳定的时钟会导致分频器产生毛刺,进而使波特率严重偏离预期,通信必然失败。上电或退出低功耗模式后,必须加入等待稳定的延时或查询例程。
关于外部SCLK的考量:当使用SCLK时,你需要自己确保其频率和稳定性。例如,若SCLK输入为1.8432 MHz,配置为SCLK/16,则得到的位时钟为115200 Hz,对应波特率为7200 bps(115200 / 16)。这是一个非标准波特率,但在某些专有系统中可能会用到。此时,通信双方必须使用完全相同的SCLK源。
4. FIFO机制与流控:可靠通信的双保险
FIFO(先进先出)缓冲区和硬件流控是保障高速或大数据量串行通信不丢数据的两个关键机制。MC68349对此提供了硬件级的强力支持。
4.1 四级接收FIFO的运作细节
模块的接收路径采用了“移位寄存器 + 3级FIFO”的四级缓冲结构。这比许多只有一级缓冲的简单UART要强大得多。
工作流程:
- 接收移位寄存器收齐一个完整字符(包括停止位)后,会进行帧错误、奇偶错误检测。
- 如果FIFO栈未满,该字符及其三个状态位(PE, FE, RB)会被推入FIFO底部。此时,状态寄存器(SR)的RxRDY位(或中断状态寄存器ISR的对应位)会被置1,通知CPU有数据可读。
- CPU读取接收缓冲区(RB)地址。这个操作会从FIFO顶部“弹出”最旧的一个字符及其状态,并送入CPU数据总线。
- 如果CPU读取速度跟不上数据接收速度,FIFO的三个位置可能会被填满。当FIFO满时,状态寄存器的FFULL位会被置1。此时如果移位寄存器又接收完一个新字符,它将无法存入FIFO,只能原地等待。
- 最危险的情况:在FIFO满且移位寄存器已占用的状态下,如果又一个新字符的起始位被检测到,就会发生溢出错误(Overrun Error, OE)。移位寄存器中等待的字符会被新字符覆盖而丢失,OE状态位被置1。这意味着至少丢失了一个字符。
字符模式 vs. 块模式:模式寄存器1(MR1)中的ERR位控制着错误报告的粒度。
- 字符模式(ERR=0):状态寄存器(SR)中的RB, FE, PE位仅代表FIFO顶部当前字符的状态。CPU每读一个字符,就需要检查一次状态。这种方式精准,但软件开销大。
- 块模式(ERR=1):SR中的错误位是自上一次“复位错误状态”命令以来,所有经过FIFO顶部的字符错误的逻辑或(OR)。也就是说,只要整块数据中任何一个字符出错,相应的错误位就会置1并保持,直到被明确清除。这种方式适合高速连续传输,软件只需在接收完一个完整数据块后检查一次状态即可,但无法定位具体是哪个字符出错。
实操心得:在多机通信模式(Multidrop Mode)下,必须使用字符模式(ERR=0)。因为在此模式下,奇偶错误位(PE)被重新用作地址/数据标志位(A/D bit)。如果使用块模式,这个重要的标识信息会在逻辑OR操作中丢失,导致无法区分地址帧和数据帧。
4.2 硬件流控的实现:RTS/CTS握手
流控(Flow Control)是解决速度不匹配、防止数据丢失的终极手段。MC68349支持完整的RTS/CTS硬件流控。
- CTS(Clear to Send, 清除发送):输入信号。当本设备(作为发送方)的TxCTS位(MR2[4])使能后,发送器在发送每个字符前都会检查CTS引脚的电平。只有CTS有效(低电平)时,才会开始发送。如果发送中途CTS失效,当前字符会继续发完,但后续字符会暂停发送,TxD线保持“标记”(高电平)状态,直到CTS再次有效。这实现了接收方控制发送方数据流。
- RTS(Request to Send, 请求发送):输出信号。其行为由两部分控制:
- 发送器控制(TxRTS):当MR2[5](TxRTS)置1,且发送器被禁用后,RTS输出会在最后一个字符(包括停止位)发送完毕后,延迟一个位时间被自动置为无效(高电平)。这用于通知对方“我发完了”。
- 接收器控制(RxRTS):当MR1[7](RxRTS)置1时,RTS输出由接收FIFO的状态控制。当接收器检测到一个有效的起始位,且其FIFO已满时,RTS会自动变为无效(高电平),告诉对方“别发了,我缓冲区满了”。当FIFO中出现一个空位时,RTS又会自动变为有效(低电平),通知对方“可以继续发了”。
经典流控连接:将设备A的RTS输出连接到设备B的CTS输入,同时将设备B的RTS连接到设备A的CTS。这样,任何一方的接收缓冲区快满时,都能通过拉高自己的RTS(即让对方CTS无效)来让对方暂停发送,实现了全双工的自动流量控制。
重要警告:切勿在同一个通道上同时使能发送器RTS控制(TxRTS)和接收器RTS控制(RxRTS)。手册明确指出,这种配置是错误的,会导致RTS控制功能被禁用。因为两者对RTS引脚的控制意图是冲突的:一个想在发送完成后关闭,另一个想根据缓冲区状态动态控制。
5. 多机通信模式:构建主从网络的硬件支持
多机通信模式(Multidrop Mode)是MC68349串行模块用于构建主从式网络的高级功能。它允许一条串行总线上挂接一个主设备和最多256个从设备,通过数据帧中的特殊标识位来寻址。
5.1 工作原理与帧结构
在多机模式下,数据帧结构发生了变化。除了常规的起始位、数据位、停止位,还引入了一个关键的地址/数据标志位(A/D bit),它取代了普通模式下的奇偶校验位的位置。
- A/D位 = 1:表示当前帧是一个地址帧。主设备用它来广播或指定���标从机。
- A/D位 = 0:表示当前帧是一个数据帧。跟在地址帧之后,发给被寻址的从机。
工作流程:
- 初始化:所有从设备的串行通道接收器初始化为禁用状态,但硬件上仍在持续监控总线。
- 寻址:主设备发送一个地址帧(A/D=1)。所有从设备都会接收到这个帧,并将其加载到自己的接收FIFO中,并触发接收就绪(RxRDY)中断。
- 从机响应:每个从机的CPU在中断服务程序中读取这个地址,并与自身预设的地址进行比较。
- 选择通信:地址匹配的从机,使能自身的接收器。不匹配的从机,保持接收器禁用。
- 数据传输:主设备开始发送一系列数据帧(A/D=0)。只有使能了接收器的目标从机会接收这些数据帧。其他从机看到A/D=0的帧会直接丢弃,不会产生中断或占用FIFO。
- 通信结束:数据块发送完毕后,主设备可以发送下一个地址帧,开始新一轮通信。目标从机在接收完数据后,应再次禁用自身的接收器,重新回到监听地址的状态。
5.2 配置要点与软件流程
配置多机模式涉及模式寄存器1(MR1)的几个关键位:
- PM[1:0] = 11:选择多机模式。
- PT:此位在发送时,决定了发出的帧是地址(PT=1)还是数据(PT=0)。对于接收方,此位无意义,接收到的A/D位会被存入状态寄存器的PE位(原奇偶错误位)位置。
- ERR:必须设置为0(字符模式)。这样才能在每次读取数据时,正确获取该帧的A/D标志(在SR的PE位中)。
软件驱动设计要点:
- 从机地址过滤:从机的中断服务程序必须足够快,在下一个帧到来之前完成地址比较和接收器使能/禁用的操作。
- 错误处理:多机模式下,硬件不进行奇偶校验。如果系统需要差错检测,需要在软件层面实现,例如使用5/6/7位数据位,空出最高位用于软件计算的校验和。
- 状态读取顺序:读取数据时,应先读状态寄存器(SR),获取A/D位(在PE位)和帧错误(FE)等信息,然后再读数据寄存器(RB)。这个顺序是标准操作。
避坑指南:在多机网络中,总线冲突是致命问题。虽然MC68349本身是UART,不支持多主竞争,但错误的软件操作可能导致多个从机意外使能发送器(如果它们也配置了发送)。务必确保网络为严格的主从架构,从机仅在收到明确指令时才进行发送,并且通常需要主设备通过协议进行轮询。物理层上,建议使用RS-485差分总线来提高抗干扰能力和驱动多节点能力,此时需要额外的方向控制引脚(DE/RE),这可以通过MC68349的通用输出端口(OP)来实现。
6. 寄存器编程详解与驱动编写实战
理解了原理,最终都要落实到寄存器配置上。MC68349的串行模块寄存器虽然繁多,但归类清晰。编程模型的核心是理解各个寄存器的作用域(全局、通道A、通道B)和访问权限(只读、只写、读写)。
6.1 关键寄存器功能速查与配置序列
以下是一个典型的串行通道初始化序列,以通道A、9600波特率、8位数据、无校验、1位停止位、启用RTS/CTS流控为例:
模块使能与基础配置:
// 假设串行模块基地址为 0x800710 #define MCR (*(volatile uint16_t *)0x800700) #define ACR (*(volatile uint8_t *)0x800714) #define CSR_A (*(volatile uint8_t *)0x800711) #define MR1A (*(volatile uint8_t *)0x800710) #define MR2A (*(volatile uint8_t *)0x800720) #define CR_A (*(volatile uint8_t *)0x800712) #define OPCR (*(volatile uint8_t *)0x80071D) // 1. 确保模块已使能(MCR的STP位为0),通常由系统初始化完成。 // 2. 等待晶体稳定:轮询ISR(0x800715)的XTAL_RDY位直到为0。 while (ISR & 0x08); // 假设ISR已定义,bit3为XTAL_RDY // 3. 配置波特率:选择Set 1, 9600 bps ACR = 0x00; // BRG=0, IECx=0 (先禁用CTS变化中断) CSR_A = 0xBB; // 接收和发送时钟均选择 1011 (9600) // 4. 配置操作模式:正常模式,无循环回环 MR2A = 0x00; // CM[1:0]=00(正常), TxRTS=0, TxCTS=0, 停止位=0000(1位) // 注意:MR2的停止位SB[3:0]=0000对应1.0位停止位(对于8位数据) // 5. 配置字符格式与FIFO模式:8位数据,无校验,字符模式,接收器RTS控制 MR1A = 0x93; // RxRTS=1(使能), R/F=0(接收就绪中断), ERR=0(字符模式) // PM[1:0]=00(带校验), PT=0(偶校验) -> 但注意,我们实际不用校验 // B/C[1:0]=11(8位) // 等一下,这里有个矛盾。我们想要无校验,但PM[1:0]=00是“带校验”。 // 正确配置应为:PM[1:0]=10 (无校验) MR1A = 0xB3; // RxRTS=1, R/F=0, ERR=0, PM[1:0]=10, PT=X(无关), B/C=11 // 6. 配置输出引脚功能:将OP0引脚配置为RTSA功能 OPCR |= 0x01; // 设置OPCR的bit0为1,使OP0作为RTSA // 7. 使能发送器和接收器 CR_A = 0x05; // MISC[3:0]=0000(无命令), TC[1:0]=01(使能发送), RC[1:0]=01(使能接收)发送一个字符:
#define SR_A (*(volatile uint8_t *)0x800711) #define TB_A (*(volatile uint8_t *)0x800713) void uart_send_char(uint8_t ch) { while (!(SR_A & 0x04)); // 等待TxRDY位(SR bit2)为1 TB_A = ch; // 写入发送缓冲区 }接收一个字符(轮询方式):
#define RB_A (*(volatile uint8_t *)0x800713) int uart_receive_char(uint8_t *ch) { if (SR_A & 0x01) { // 检查RxRDY位(SR bit0)是否为1 uint8_t status = SR_A; // 先读取状态 *ch = RB_A; // 再读取数据,这会“弹出”FIFO // 检查状态位:bit7(RB), bit6(FE), bit5(PE), bit4(OE) if (status & 0xF0) { // 处理错误:断线、帧错误、奇偶错误、溢出错误 return -1; // 返回错误码 } return 1; // 成功接收到一个字符 } return 0; // 无数据 }
6.2 中断驱动编程要点
中断是高效利用CPU资源的关键。MC68349的串行模块中断源丰富,通过中断使能寄存器(IER)和中断状态寄存器(ISR)管理。
中断配置步骤:
- 初始化中断向量:向IVR寄存器写入中断服务程序(ISR)的向量号。
- 设置中断优先级:配置ILR寄存器,决定本模块中断在系统中的优先级。
- 使能特定中断源:在IER寄存器中,置位你关心的位。例如,使能接收就绪中断(RxRDYA)和发送就绪中断(TxRDYA)。
#define IER (*(volatile uint8_t *)0x800715) IER = 0x03; // 使能通道A的接收就绪和发送就绪中断 - 编写中断服务程序:在ISR中,需要读取中断状态寄存器(ISR)来判断具体的中断源,并清除中断标志。对于接收中断,读取RB会清除RxRDY标志;对于发送中断,写入TB会清除TxRDY标志。对于CTS状态变化中断,需要读取IPCR寄存器来清除COS标志。
经验之谈:在中断服务程序中,务必先读取状态,再根据状态进行相应操作。对于接收,顺序是“读SR -> 读RB”;对于发送,顺序是“检查TxRDY -> 写TB”。避免在中断中做耗时操作,如果数据量大,应设置环形缓冲区,中断只负责快速搬运数据,主循环处理业务逻辑。另外,注意IER和ISR的位定义,通道A和通道B的中断标志是交错排列的,编程时需仔细对照手册。
7. 调试技巧与常见问题排查
即使按照手册配置,在实际硬件调试中也可能遇到各种问题。以下是一些经典的排查思路和技巧。
7.1 通信完全无响应的排��清单
- 时钟与电源:最基础也最易忽略。首先确认芯片供电正常,晶体是否起振?可以用示波器测量X1/X2引脚(如果引出)或SCLK输入是否有稳定的3.6864MHz波形?XTAL_RDY位是否已清零?
- 引脚配置:MC68349的串行引脚可能与其他功能复用。确认SIM(系统集成模块)的引脚分配寄存器是否正确配置,将相关引脚设置为串行功能而非通用I/O。
- 寄存器访问权限:许多关键寄存器(如CR, CSR, MR)需要模块使能(MCR的STP=0)且处于管理态(如果SUPV位被设置)才能写入。检查你的程序是否运行在正确的处理器模式下。
- 波特率匹配:这是最常见的问题。用示波器测量TxD引脚。即使没有数据发送,使能发送器后,TxD线应保持高电平(Mark)。发送一个字符(如0x55, 二进制01010101)时,你应该能看到一个标准的串行帧:起始位(低)-> 8个数据位 -> 停止位(高)。测量一个位的时间,计算其倒数是否等于你设定的波特率(如9600bps对应约104us)。如果不符,检查CSR和ACR配置,以及时钟源频率。
7.2 能发送但不能接收,或数据乱码
- 环回测试:这是隔离问题的黄金方法。将模块配置为本地环回模式(MR2的CM[1:0]=10),然后发送数据并接收。如果环回模式下自发自收正常,则证明芯片内部的发送逻辑、接收逻辑、波特率发生器均正常,问题出在外部电路(如电平转换芯片MAX232损坏、RxD线路断开或短路)或对方设备上。
- 帧格式匹配:确保通信双方的数据位、停止位、奇偶校验设置完全一致。MC68349可以配置非常规的停止位长度(如1.5位),如果对方是标准1位停止位,就会产生帧错误。
- 电气电平:如果是RS-232电平,测量空闲时TxD/RXD引脚电压是否在-5V到-15V(逻辑1)之间?发送数据时,是否有跳变到+5V到+15V(逻辑0)?RS-232是负逻辑,与TTL正逻辑相反,别搞混了。
- FIFO与中断:如果使用中断接收,确认IER已正确使能接收中断(RxRDYA)。如果使用轮询,确认你查询的是状态寄存器(SR)的RxRDY位,而不是其他位。另外,在读取数据前,是否先读取了状态寄存器?在字符模式下,每个字符的状态需要单独读取。
7.3 流控不工作或工作异常
- 引脚连接:确认RTS和CTS是否已正确交叉连接。本设备的RTS应连接对端设备的CTS。
- 配置冲突:再次检查,绝对没有在同一个通道上同时设置MR1的RxRTS和MR2的TxRTS。这是手册明确禁止的。
- 极性理解:MC68349的RTS/CTS信号是低电平有效。寄存器中OP位的状态是输出信号电平的反相。例如,向OP0写1会使RTSA引脚输出低电平(有效)。读取IP或IPCR的CTS位时,1表示CTS引脚为高电平(无效),0表示低电平(有效)。编程时务必注意这个反相关系。
- 自动RTS行为:当使能接收器RTS控制(RxRTS=1)后,RTS信号由FIFO状态自动管理。如果你用万用表或示波器测量,会发现当FIFO空时RTS有效(低),当FIFO满时RTS无效(高)。如果行为相反,检查OPCR配置是否正确将引脚设置为RTS功能。
7.4 多机通信中的典型故障
- 从机收不到地址:检查所有从机的MR1配置,PM[1:0]必须为11(多机模式),ERR必须为0(字符模式)。确认主设备发送的地址帧A/D位为1(PT=1)。
- 从机收到错误数据:目标从机在使能接收器后,是否成功接收了后续数据帧?检查主设备发送数据帧时,PT位是否已设为0。非目标从机是否错误地使能了接收器?确保地址比较逻辑正确,且从机在非寻址时接收器处于禁用状态。
- 总线冲突与干扰:在多机长距离通信中,务必使用RS-485等差分标准,并正确安装终端电阻。检查总线是否有多个驱动器同时使能的情况。MC68349的UART本身不支持总线竞争,需要上层协议(如轮询)来避免。
调试嵌入式外设,尤其是这种老式但功能强大的模块,一半靠理解数据手册,另一半靠耐心和细致的测量。逻辑分析仪是调试串行通信的利器,它能清晰地展示每一帧的时序、数据和信号电平,帮助你快速定位是配置问题、软件时序问题还是硬件物理层问题。从最基础的环回测试开始,逐步增加复杂度,是解决任何通信问题的不二法门。