1. 项目概述:从UART到DUART的演进与MPC8245的角色
在嵌入式系统开发的世界里,串行通信就像设备之间的“通用语言”。无论是调试信息输出、传感器数据采集,还是模块间的指令交互,都离不开它。而UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)无疑是这门语言最古老、最通用的“方言”。它简单、可靠,几乎存在于每一颗微控制器和处理器中。然而,随着系统复杂度的提升,单一通道的UART有时会显得捉襟见肘。想象一下,你的系统需要同时与一个调试终端和一个GPS模块通信,传统的单UART要么需要分时复用,要么就得外扩芯片,增加了成本和设计的复杂性。
这时,DUART(Dual UART,双通道UART)便应运而生。它本质上是在一个物理模块内集成了两套独立的UART控制器,共享部分系统资源(如时钟、总线接口),但拥有各自独立的发送、接收引脚和寄存器组。这就像给你的设备配备了两个可以同时工作的“嘴巴”和“耳朵”,极大地提升了通信的并行处理能力和系统集成度。飞思卡尔(现恩智浦)的MPC8245集成处理器,作为一款经典的PowerPC架构嵌入式处理器,其内部集成的DUART模块就是一个非常典型的工业级实现。它不仅是简单的双通道叠加,更融合了FIFO缓冲、灵活的DMA支持、丰富的错误检测以及可编程中断机制,使其成为构建高可靠性工业控制、网络设备和通信系统的关键通信基石。
本文将深入解析MPC8245中DUART模块的工作原理,从最基础的异步串行通信协议讲起,逐步拆解其内部结构、寄存器编程模型、高级功能(如FIFO与DMA),并结合实际初始化流程和调试经验,为你呈现一份从理论到实践的完整指南。无论你是正在调试MPC8245硬件,还是希望深入理解嵌入式串行通信的细节,这篇文章都将提供直接的参考。
2. 异步串行通信核心原理与协议拆解
在深入DUART硬件之前,我们必须先夯实其工作的基石——异步串行通信协议。理解这个协议,是理解所有UART类设备行为的钥匙。
2.1 协议帧结构:起始位、数据位、校验位与停止位
异步串行通信之所以“异步”,是因为通信双方没有统一的时钟信号线来同步每一位数据。它们依靠预先约定好的参数,特别是波特率(Baud Rate),来各自在本地生成时序,从而解析数据。一个完整的数据帧由以下几个部分组成,按顺序在单根数据线上传输:
- 空闲状态(Idle State):当总线没有数据传输时,线路保持在高电平(逻辑‘1’),也称为“标记”(Mark)状态。
- 起始位(Start Bit):一个比特时间的低电平(逻辑‘0’),标志着数据帧的开始。它就像一声“预备,开始!”的哨响,告诉接收方:“数据马上来了,准备好计时”。
- 数据位(Data Bits):紧接起始位之后,是要传输的实际数据,通常是5到8位。MPC8245的DUART支持这四种长度。数据位的传输顺序是从最低有效位(LSB)开始,依次到最高有效位(MSB)。例如,要发送字符‘A’(ASCII 0x41,二进制0100 0001),LSB是1,所以线上最先出现的逻辑位是1。
- 校验位(Parity Bit,可选):用于简单的错误检测。发送方根据数据位中‘1’的个数,计算并附加一个奇偶校验位。
- 偶校验(Even Parity):保证数据位+校验位中‘1’的总数为偶数。
- 奇校验(Odd Parity):保证数据位+校验位中‘1’的总数为奇数。
- 标记校验(Mark Parity):校验位固定为1。
- 空格校验(Space Parity):校验位固定为0。
- 无校验(No Parity):不添加校验位。
- 停止位(Stop Bit):一个或多个比特时间的高电平(逻辑‘1’),标志着数据帧的结束。MPC8245 DUART支持1位、1.5位(当数据长度为5位时)或2位停止位。停止位确保了帧与帧之间至少有1个比特时间的“空闲”状态,为接收方提供了帧结束的明确标识和重新同步的机会。
注意:通信双方(发送器和接收器)必须严格配置相同的参数,包括波特率、数据位长度、校验类型和停止位长度。任何一项不匹配都会导致通信彻底失败或产生大量错误。这是调试串口通信时首要检查的事项。
2.2 全双工与点对点拓扑
MPC8245的DUART通道是**全双工(Full-Duplex)**的,这意味着数据的发送(TX)和接收(RX)可以同时独立进行,互不干扰。这得益于其拥有独立的发送数据输出(SOUT)和接收数据输入(SIN)引脚。
同时,它采用**点对点(Point-to-Point)**总线拓扑。一个DUART通道通常只连接两个设备:一个作为发送方,另一个作为接收方。这种简单的拓扑无需复杂的地址寻址或总线仲裁协议,硬件连接通常就是交叉连接双方的TX和RX线(即A的TX接B的RX,A的RX接B的TX),再加上共地线(GND)。
2.3 波特率:通信速度的节拍器
波特率定义了每秒传输的符号(比特)数。例如,9600波特率意味着每秒传输9600个比特。MPC8245 DUART的波特率由一个独立的、可编程的波特率发生器(Baud-Rate Generator)产生。
其工作原理是对输入时钟(通常来源于SDRAM_CLKn)进行分频。波特率计算公式为:目标波特率 = (输入时钟频率) / (16 × 分频因子)
因此,分频因子(Divisor)的计算公式为:分频因子 = 输入时钟频率 / (16 × 目标波特率)
这个16倍的关系是关键。接收方并非在每位数据的中心点采样一次,而是在每个比特时间内采样16次。通过多数表决或边沿检测,它可以更精确地定位起始位的下降沿,并在数据位的中心位置进行最终采样,从而抵抗一定的时钟偏差和噪声干扰。分频因子由两个8位寄存器(UDMB和UDLB)组成一个16位值共同决定,最小值为1。
例如,假设输入时钟频率为66 MHz,我们需要配置成9600波特率:分频因子 = 66,000,000 / (16 × 9600) ≈ 429.6875取整后为430(0x1AE)。UDMB写入0x01,UDLB写入0xAE。此时实际波特率为66,000,000 / (16 × 430) ≈ 9593.02,误差约为0.07%,在可接受范围内。手册中的表格(如输入时钟66MHz时,9600波特率对应分频因子434)是经过优化的推荐值,以最小化误差。
3. MPC8245 DUART模块架构与核心功能解析
MPC8245的DUART模块并非两个独立UART的简单拼凑,而是一个高度集成、功能丰富的通信子系统。理解其内部架构是进行有效编程和调试的前提。
3.1 模块整体结构与数据流
每个UART通道的核心部件包括:
- 发送器(Transmitter):包含发送保持寄存器(UTHR)和发送移位寄存器。数据由处理器核心或PCI主设备写入UTHR,然后被加载到移位寄存器中,并按照配置的格式(数据位、校验位、停止位)转换成串行比特流,从SOUT引脚输出。
- 接收器(Receiver):包含接收移位寄存器和接收缓冲寄存器(URBR)。串行数据从SIN引脚输入,由移位寄存器转换为并行数据,经过校验和帧检查后,存入URBR供处理器读取。
- 波特率发生器(Baud-Rate Generator):为发送和接收提供精确的位定时时钟。
- 中断控制逻辑(Interrupt Control Logic):管理各种中断源(如数据就绪、发送寄存器空、错误等),并可根据配置向本地处理器(通过PIC)或PCI总线发起中断���求。
- 寄存器组(Register Set):每个通道有14个8位控制/状态寄存器,用于配置参数、监控状态和控制操作。
数据流路径清晰:发送时,数据从总线→UTHR(或发送FIFO)→发送移位寄存器→SOUT引脚。接收时,数据从SIN引脚→接收移位寄存器→URBR(或接收FIFO)→总线。
3.2 关键工作模式详解
3.2.1 FIFO模式:减轻CPU中断负担的利器
在非FIFO(或称16450兼容)模式下,每收到一个字节或发送寄存器空,都可能产生一次中断。在高波特率下,频繁的中断会严重消耗CPU资源。MPC8245的DUART提供了FIFO模式来缓解此问题。
通过设置FIFO控制寄存器(UFCR)的FEN位为1,可以启用发送和接收FIFO。每个FIFO深度为16字节(这是此类UART的常见深度,手册虽未明确给出深度,但根据触发级别设置可推断)。
- 发送FIFO:当CPU写入数据到UTHR时,数据实际上被压入发送FIFO。只要FIFO非空,硬件就会自动将数据加载到发送移位寄存器中发送出去。这样,CPU可以一次性写入多个字节(最多16个),而不是写一个等一个。
- 接收FIFO:接收到的字节先存入接收FIFO。CPU可以一次读取多个已接收的字节。更重要的是,可以通过UFCR[RTL]位设置接收FIFO的触发中断水平(1, 4, 8, 14字节)。例如,设置为4字节时,只有当FIFO中累积了4个或更多字节时,才会产生“接收数据可用”中断。这显著降低了中断频率。
实操心得:在高速通信(如115200以上波特率)或实时性要求不极端的场景中,务必启用FIFO模式。它能极大提升系统整体性能。设置触发水平需要权衡:水平设得高(如14字节),中断次数最少,但数据延迟较大;水平设得低(如1字节),响应最及时,但中断负担重回高位。通常4或8字节是一个不错的折中选择。
3.2.2 DMA模式:解放CPU的数据搬运工
FIFO减少了中断次数,但数据在FIFO和内存之间的搬运仍需CPU参与。DMA模式则旨在将CPU从这个任务中彻底解放出来。DUART通过DMA状态寄存器(UDSR)中的TXRDY和RXRDY信号来配合DMA控制器。
- 模式0(UFCR[DMS]=0):这是较简单的模式。RXRDY在接收FIFO/URBR中有至少一个字符时清零(表示有数据),为空时置位。TXRDY在发送FIFO/UTHR为空时清零(表示可写入),有数据后置位。DMA控制器可以据此进行传输。
- 模式1(UFCR[DMS]=1 且 UFCR[FEN]=1):此模式与FIFO深度结合更紧密。RXRDY在接收FIFO达到触发水平或发生超时时清零,当FIFO中再无额外字符时置位。TXRDY在发送FIFO为空时清零,当发送FIFO满时置位。这允许DMA控制器进行更高效的块传输。
要使用DMA,需要MPC8245内部或外部的DMA控制器配合编程,将UDSR的相关位作为DMA请求信号。
3.2.3 本地回环模式:硬件自检的利器
通过设置MODEM控制寄存器(UMCR)的Loop位为1,可以启用本地回环模式。在此模式下:
- 发送器输出(SOUT)被置为逻辑1(空闲状态)。
- 发送移位寄存器的输出在内部直接“绕回”连接到接收移位寄存器的输入。
- 接收器输入(SIN)被断开。
- RTS输出信号在内部连接到CTS输入信号。
这意味着,任何写入UTHR的数据,都会立刻被本通道的接收逻辑收到,并可以从URBR读出。此模式用于诊断测试,在不连接外部硬件的情况下,验证DUART模块本身的发送和接收数据路径、中断逻辑等是否工作正常。在驱动开发初期,这是一个极其重要的调试手段。
3.3 错误检测与处理机制
可靠的通信必须能发现错误。MPC8245 DUART提供了三种主要的错误状态位,位于线路状态寄存器(ULSR)中:
- 帧错误(Framing Error, FE):当接收方在预期的停止位位置检测到逻辑0(而非逻辑1)时,此位置1。最常见的原因是波特率不匹配或线路噪声。在FIFO模式下,该错误标志与产生错误的字符在FIFO中的位置相关联。
- 奇偶校验错误(Parity Error, PE):当使能了奇偶校验,但接收到的数据位和校验位的奇偶性与预期不符时,此位置1。表明数据在传输过程中可能发生了单比特翻转。
- 溢出错(Overrun Error, OE):当一个新的字符已经接收完成并准备好移入URBR(或接收FIFO),但旧的字符还未被CPU读取时,发生溢出,旧字符丢失,此位置1。这通常是因为CPU读取速度跟不上数据接收速度,在未启用FIFO或FIFO已满时容易发生。
- 间隔中断(Break Interrupt, BI):当SIN输入线保持逻辑0的时间超过一个完整字符帧(起始位+数据位+校验位+停止位)的长度时,此位置1。这通常被视为一个特殊的通信事件,而非错误,有时用于表示数据传输的开始或结束。
注意事项:读取ULSR寄存器会清除FE、PE、OE和BI位(TEMT和THRE位除外)。因此,在中断服务程序中,应先读取ULSR保存错误状态,再读取URBR获取数据。否则,先读数据会导致错误标志被清除,从而丢失错误信息。这是很多串口驱动中容易忽略的细节。
4. DUART寄存器编程模型深度剖析
MPC8245 DUART的每个通道都通过一组内存映射的寄存器进行控制。理解每个寄存器的每一位是进行底层驱动开发的关键。所有寄存器均为8位宽,通过PCI内存空间或本地内存空间访问。
4.1 核心数据与配置寄存器
接收缓冲寄存器(URBR)与发送保持寄存器(UTHR)
- URBR (只读):存放从串行线路上接收到的、已去除帧信息(起始、停止、校验位)的并行数据。读取该寄存器会从接收FIFO或缓冲器中弹出数据。
- UTHR (只写):CPU将要发送的数据写入此寄存器。数据会被放入发送FIFO或直接加载到发送移位寄存器。
- 关键点:访问这两个寄存器前,必须确保线路控制寄存器(ULCR)的DLAB位为0。当DLAB=1时,访问的是分频器锁存器。
分频器锁存器(UDLB, UDMB)
- 这两个寄存器共同组成一个16位的分频值(N),用于波特率生成。
波特率 = 输入时钟频率 / (16 * N)。 - UDLB:分频值的低8位。
- UDMB:分频值的高8位。
- 重要步骤:在修改波特率前,需先将ULCR的DLAB位置1,然后写入UDLB和UDMB,最后再将DLAB清0,以恢复对其他寄存器的访问。分频值N必须大于等于1。
- 这两个寄存器共同组成一个16位的分频值(N),用于波特率生成。
线路控制寄存器(ULCR)这是配置串行数据格式的核心寄存器。
位 名称 功能描述
| 7 | DLAB | 分频器锁存器访问位。1=访问UDLB/UDMB/UAFR;0=访问其他寄存器。 | | 6 | SB | 设置间隔。1=强制SOUT输出为0(发送间隔信号);0=正常操作。 | | 5 | SP | 粘性校验位。与PEN、EPS配合选择校验类型(见表12-13)。 | | 4 | EPS | 偶校验选择位。 | | 3 | PEN | 校验使能位。 | | 2 | NSTB | 停止位数量。0=1位停止位;1=若数据位为5则1.5位,否则2位。 | | 1-0 | WLS[1:0] | 字长选择。00=5位;01=6位;10=7位;11=8位。 |
- FIFO控制寄存器(UFCR)控制FIFO和DMA模式。
位 名称 功能描述 7-6 RTL[1:0] 接收FIFO触发水平。00=1字节;01=4字节;10=8字节;11=14字节。 3 DMS DMA模式选择。0=模式0;1=模式1(需FEN=1)。 2 TFR 发送FIFO复位。写1清零发送FIFO。自清零位。 1 RFR 接收FIFO复��。写1清零接收FIFO。自清零位。 0 FEN FIFO使能。1=使能发送和接收FIFO。
4.2 状态与中断控制寄存器
线路状态寄存器(ULSR)提供数据传输的实时状态,是轮询方式下最重要的寄存器。
位 名称 描述 7 RFE 接收FIFO错误。1=FIFO中至少有一个字符存在帧、校验或间隔错误。 6 TEMT 发送器空。1=发送保持寄存器和发送移位寄存器均空(FIFO模式下指两者皆空)。 5 THRE 发送保持寄存器空。1=UTHR空,可写入新数据(FIFO模式下指发送FIFO空)。 4 BI 间隔中断。检测到间隔条件。 3 FE 帧错误。 2 PE 校验错误。 1 OE 溢出错。 0 DR 数据就绪。1=接收缓冲寄存器(或FIFO)中有数据可读。 排查技巧:在调试通信不通的问题时,首先读取ULSR的值。如果DR始终为0,说明根本没收到数据,检查硬件连接、波特率。如果DR为1但读出的数据是乱码,检查波特率、数据格式。如果FE、PE、OE位被置位,则对应检查线路质量、双方配置、以及CPU读取是否及时。
中断使能寄存器(UIER)与中断标识寄存器(UIIR)这两个寄存器共同管理中断。
- UIER:用于屏蔽或使能特定类型的中断源。其低4位分别控制:接收数据可用中断(ERDAI)、发送保持寄存器空中断(ETHREI)、接收线路状态中断(ERLSI,覆盖所有错误)、MODEM状态中断(EMSI)。
- UIIR (只读):当有中断发生时,读取此寄存器可以识别当前最高优先级的中断源。其低4位(IID[3:0])编码表示了中断类型(参见表12-9)。Bit 0 (IID0)是总中断挂起标志,为0表示有中断待处理。在中断服务程序中,应读取UIIR来判断具体是哪个事件触发了中断,并进行相应处理。
MODEM控制寄存器(UMCR)与状态寄存器(UMSR)用于控制和支持MODEM(调制解调器)相关的信号线,如RTS(请求发送)、CTS(清除发送)、DTR(数据终端就绪)、DSR(数据设备就绪)等。在简单的三线制(TX, RX, GND)串口中,这些信号可能不使用,但UMCR的Loop位用于控制回环模式。
4.3 寄存器访问的字节序问题
MPC8245的DUART寄存器在内存映射中是以小端字节序(Little-Endian)格式存放的。这意味着对于一个32位的寄存器地址,低地址存放的是数据的最低有效字节(LSB)。
如果你的处理器核心(如PowerPC)运行在大端模式(Big-Endian),那么通过加载/存储指令访问这些8位寄存器时,必须小心处理字节序。通常的解决方案是:
- 使用字节操作指令(如
lbz,stb)来单独访问每个8位寄存器,避免多字节访问。 - 如果使用C语言,将寄存器地址声明为
volatile uint8_t*类型,编译器会生成字节访问指令。 - 如果必须进行32位访问,则需要软件负责字节交换。
手册中特别强调:“The DUART registers in this chapter are in little-endian format. If your system is in big-endian mode, ensure that the bytes are appropriately swapped by software.” 忽略这一点会导致配置值完全错误,通信无法建立。
5. DUART初始化与驱动编写实战指南
理论最终要服务于实践。下面我们基于MPC8245参考手册的建议,梳理一个稳健的DUART通道初始化序列,并探讨驱动编写中的关键点。
5.1 标准初始化序列
以下是手册推荐的初始化步骤,适用于处理器核心访问DUART:
- 内存属性配置:如果处理器的MMU(内存管理单元)已启用,必须确保DUART寄存器所在的内存区域被设置为禁止缓存(Cache-Inhibited)和强制写穿透(Write-Through)。这是因为对设备寄存器的读写必须是即时生效的,不能被缓存,否则会导致时序错误和状态读取不准。
- 配置PIC中断向量:如果打算使用中断方式,需要在可编程中断控制器(PIC)中配置好DUART通道对应的中断向量和优先级。
- 配置DUART配置寄存器(DCR):此寄存器主要设置中断路由(是路由到本地处理器PIC还是PCI总线)以及工作模式(标准4线UART模式还是4线DUART模式)。通常,若由本地处理器控制,设置
DCR[IRQSx]=0。 - 设置数据格式与控制位:这是核心配置步骤,需按顺序设置: a.设置波特率:将ULCR的DLAB位置1。然后写入分频器锁存器UDLB和UDMB。计算分频值务必准确。 b.设置通信格式:将ULCR的DLAB位清0。然后配置WLS[1:0](字长)、PEN、EPS、SP(校验)、NSTB(停止位)。例如,常见的8N1格式(8数据位,无校验,1停止位)对应
WLS=11, PEN=0, NSTB=0。 c.配置FIFO与DMA:写入UFCR。通常先使能FIFO(FEN=1),设置合适的接收触发水平(RTL),选择DMA模式(如果需要)。也可以在此步骤复位FIFO(写TFR和RFR为1,它们会自动清零)。 d.配置MODEM控制:写入UMCR。如果使用简单的三线制,通常只需设置RTS位(如果需要硬件流控)或保持默认。若要进入回环测试,则设置Loop=1。 e.配置辅助功能寄存器(UAFR):如有特殊需求(如将波特率时钟输出给性能监视器),在此配置。 - 设置外部设备:确保连接在另一端的设备(如另一台UART、转换芯片等)已按照完全相同的参数(波特率、数据位、停止位、校验)配置好并上电。
- 使能中断:最后一步,写入UIER,使能所需的中断源(如ERDAI用于接收数据,ETHREI用于发送缓冲区空)。务必在硬件配置完成后再开启中断,避免产生混乱的中断信号。
- 启动传输:通过向UTHR写入第一个字节来启动发送过程。如果是轮询方式,则开始检查ULSR的状态位。
5.2 轮询与中断驱动模式实现
轮询模式: 适用于低波特率或对实时性要求不高的场景,或者在没有操作系统或中断系统未就绪的早期启动代码中。
// 示例:轮询方式发送一个字符串 void uart_poll_send(const char *str) { volatile uint8_t *ulsr = (uint8_t*)ULSR_ADDR; volatile uint8_t *uthr = (uint8_t*)UTHR_ADDR; while (*str != '\0') { // 等待发送保持寄存器为空(THRE=1) while (!(*ulsr & 0x20)) { ; // 空循环等待 } // 写入数据 *uthr = *str++; } } // 示例:轮询方式接收一个字节(非阻塞) int uart_poll_receive(uint8_t *data) { volatile uint8_t *ulsr = (uint8_t*)ULSR_ADDR; volatile uint8_t *urbr = (uint8_t*)URBR_ADDR; if (*ulsr & 0x01) { // 检查DR位 *data = *urbr; // 可选:检查错误位(FE, PE, OE, BI) uint8_t status = *ulsr; if (status & 0x1E) { // 如果有任何错误 // 处理错误,例如记录日志 return -1; // 返回错误 } return 1; // 成功收到数据 } return 0; // 无数据 }中断模式: 适用于高波特率或需要及时响应的场景,能有效利用CPU资源。
中断服务程序(ISR)编写要点:
- 首先读取UIIR,判断中断来源。
- 如果是接收数据可用中断(IID=0b0100),则从URBR或FIFO中读取所有可用数据,放入软件缓冲区(如环形缓冲区)。
- 如果是发送保持寄存器空中断(IID=0b0010),则从软件发送缓冲区中取出数据写入UTHR,直到缓冲区空或FIFO满,然后可能需禁用发送空中断(若缓冲区已空)。
- 如果是接收线路状态中断(IID=0b0110),务必先读取ULSR以获取错误状态并清���标志,然后再进行可能的错误恢复操作(如清空FIFO)。
- 如果是字符超时中断(IID=0b1100,FIFO模式特有),表示接收FIFO中有数据但一段时间未读,应读取URBR清空FIFO。
- 处理完成后,需要对PIC或PCI中断控制器进行相应的中断确认操作。
驱动层设计: 通常会在中断服务程序之上构建一个字符设备驱动层,提供
open,close,read,write,ioctl等接口。read和write操作在用户态和驱动内的环形缓冲区之间交换数据,而中断服务程序负责在硬件缓冲区和驱动环形缓冲区之间搬运数据。
5.3 常见问题排查与调试技巧
完全无通信,读不到任何数据
- 检查硬件:确认TX、RX线是否交叉连接,地线是否共地。用示波器或逻辑分析仪测量TX引脚是否有波形输出。
- 检查时钟与波特率:确认MPC8245的输入时钟(SDRAM_CLKn)频率是否正确。重新计算并检查分频器寄存器的值。尝试使用一个非常低的波特率(如9600)进行测试。
- 检查寄存器映射:确认访问的寄存器地址是否正确。检查MMU/内存控制器配置,确保该地址区域可访问且属性正确(非缓存)。
- 使用回环模式:在UMCR中设置Loop=1,然后进行自发自收测试。如果回环模式下能正常收发,则问题很可能出在外部线路或对方设备上。
能收到数据,但全是乱码
- 首要怀疑波特率:这是最常见的原因。双方波特率即使有微小差异,长时间传输也会导致错位。用示波器测量位宽,反推实际波特率,与配置值对比。
- 检查数据格式:确认双方的数据位长度(5/6/7/8)、停止位数量(1/1.5/2)、校验位(奇/偶/无)设置是否完全一致。
- 检查字节序:如果使用DMA或32位访问,确认字节序处理是否正确。
通信不稳定,偶尔丢数据或产生错误
- 检查FIFO和中断:如果使用中断,检查中断服务程序处理是否及时,是否因为关中断时间过长导致FIFO溢出(OE错误)。考虑增大接收FIFO触发水平或优化ISR。
- 检查硬件流控:如果使用了RTS/CTS流控,确保信号线连接正确且对方设备支持。在不使用流控时,相关引脚应妥善处理(如上拉或配置为GPIO)。
- 检查电源与噪声:用示波器观察串口信号线,看波形是否干净,上升/下降沿是否陡峭。长距离传输时考虑使用RS-232电平转换芯片或RS-485差分传输以提高抗噪性。
- 查看错误状态寄存器:定期或在中断中检查ULSR中的FE、PE、OE位,它们能提供线索。频繁的FE错误指向波特率或同步问题;PE错误可能源于线路噪声;OE错误则明确是接收端处理不过来。
发送正常,但对方收不到;或对方发送,我方收不到
- 交叉验证:这是一个经典的硬件连接问题。牢记串口通信是交叉的:A的TX应接B的RX,A的RX应接B的TX。使用万用表或通断测试仪检查线序。
- 电平兼容:确认双方的电平标准一致(如都是TTL电平0V/3.3V,或都是RS-232电平±3V~±15V)。MPC8245的DUART I/O通常是TTL/CMOS电平,直接连接RS-232设备会损坏芯片,必须使用电平转换器(如MAX3232)。
通过系统地理解协议、硬件架构和寄存器操作,并掌握这些初始化、驱动编写和调试技巧,你就能让MPC8245的DUART模块在各种嵌入式应用中稳定可靠地工作,成为系统内外部通信的坚实桥梁。