1. 项目概述与核心价值在嵌入式系统开发尤其是工业控制、电机驱动和自动化设备领域微控制器MCU与外部世界如传感器、上位机、其他控制器的可靠通信是项目成败的关键。串行通信接口SCI作为通用异步收发传输器UART在德州仪器TIC2000系列DSP/微控制器上的具体实现扮演着这个“通信桥梁”的核心角色。它不像SPI或I²C那样需要额外的时钟线仅凭TX发送和RX接收两根线就能完成全双工数据交换这种简洁性使其在调试、配置和长距离通信中经久不衰。然而仅仅让SCI“跑起来”发送几个字节与构建一个在复杂电磁环境下依然稳定、高效、能处理各种异常情况的工业级通信链路完全是两回事。后者要求开发者深入理解协议底层、硬件机制和所有可配置的“开关”。TMS320F28002x作为C2000家族中面向实时控制的高性能成员其SCI模块绝非一个简单的UART外设它集成了FIFO缓冲、自动波特率检测、灵活的Break信号检测以及精细的中断控制等增强特性。掌握这些特性意味着你能让系统在高速数据流中游刃有余在总线冲突时从容应对甚至在未知波特率下自动“握手”成功。本文将从一个资深嵌入式工程师的视角不仅带你重温SCI/UART的基础原理更会深入TMS320F28002x SCI模块的“五脏六腑”。我们将重点拆解两个在数据手册中看似复杂、实则至关重要的高级功能Break信号检测机制与波特率计算及自动检测并辅以FIFO配置和关键寄存器详解。我的目标不是复述数据手册而是结合我多年在电机控制和工业通信中踩过的坑、总结的经验为你呈现一套可直接用于项目实践的配置心法与避坑指南。无论你是正在评估F28002x用于新项目还是正在调试一个棘手的通信故障这篇文章都能提供切实的帮助。2. SCI核心原理与TMS320F28002x模块架构2.1 异步串行通信基础再探在深入寄存器之前我们必须统一认知基础。SCI/UART通信的本质是位同步和帧同步。双方没有共享时钟线因此约定一个相同的波特率Baud Rate即每秒传输的符号数来实现位同步。一个符号通常就是一个比特位。帧同步则依靠特定的数据格式每个数据包帧以1个低电平的起始位开始然后是5-9个数据位通常为8位可选的奇偶校验位以及1个或2个高电平的停止位。这里有一个关键细节常被忽略停止位不仅是帧结束标志更是为接收方提供的“休息时间”和同步缓冲。在标准模式下接收器会在每个位的中间点采样。停止位的高电平状态确保了在下一个起始位的下降沿到来之前线路有明确的状态变化便于检测起始。当使用2个停止位时这个“休息时间”更长容错性更好尤其适合在噪声环境或较低波特率下使用。TMS320F28002x的SCI模块完全遵循此模型并通过其波特率发生器从低速外设时钟LSPCLK分频产生内部串行时钟。其数据帧格式可通过寄存器灵活配置这是所有应用的基础。2.2 TMS320F28002x SCI模块增强特性总览相较于基础UARTF28002x的SCI模块提供了几个显著提升可靠性和效率的增强特性理解它们是你进行高级应用的前提16级深度FIFO发送和接收方向均配备了16级FIFO缓冲区。这允许CPU一次性写入最多16个字节到发送FIFO或从接收FIFO读取最多16个字节而不是每个字节都触发一次中断。这极大地降低了CPU中断负载对于高波特率通信或主循环任务繁重的系统如电机FOC控制至关重要。可编程中断触发水平你可以自由设置接收FIFO在存有多少个数据时产生中断RXFFIL以及发送FIFO在少于或等于多少个数据时产生中断TXFFIL。这让你能在“实时性”和“CPU效率”之间做精细权衡。例如在接收实时控制命令时可以设置为1每收到1个字节就中断而在接收大量数据日志时可以设置为8或16攒够一批再处理。自动波特率检测Auto-Baud这是一个硬件功能模块可以通过检测主机发送的特定字符‘A’或‘a’的波形自动计算并匹配对方的波特率。这在设备需要与不同波特率的主机配对或从Bootloader跳转到应用程序时特别有用无需预先固化波特率。灵活的Break信号检测Break检测是处理总线异常或作为特殊协议帧头的重要手段。F28002x提供了两种检测方法适应不同场景后文会详细剖析。可编程发送延迟FFTXDLY在FIFO模式下可以设置数据从FIFO传输到发送移位寄存器之间的延迟以波特率时钟周期为单位。这可以模拟流量控制防止某些慢速接收设备溢出实现简单的“软流控”。这些特性都通过一组精心设计的寄存器进行控制。接下来我们将聚焦于两个关键且容易混淆的实战难点Break检测和波特率。3. 深度解析Break信号检测的两种方法与实战配置Break信号在串行通信中是一个有意为之的“错误”状态。它通过将数据线RX强制拉低并保持远超过一个完整数据帧的时间来向总线上所有设备宣告一个特殊事件例如复位从机、切换通信模式、或作为多机通信中的广播帧头。3.1 方法一硬件BRKDT标志位检测标准方法这是最直接的方法。SCI接收器硬件持续监控RX引脚。当检测到RX线在缺失第一个停止位后持续保持低电平超过9.625个位时间时SCIRXST.BRKDT位会被硬件自动置1。关键理解9.625这个数字从何而来一个标准的8N1帧8数据位无校验1停止位包含1起始位 8数据位 1停止位 10位。要触发BRKDT需要在完整的这一帧之后RX线继续保持低电平。硬件设计上在停止位本应出现高电平的时刻如果检测到低电平即“缺失第一个停止位”计时器启动。如果低电平持续累计达到9.625个位时间则判定为Break。 因此要可靠产生一个能被BRKDT识别的Break信号发送方需要拉低RX线至少10位完整一帧 9.625位 19.625个位时间。如果启用了校验位PARITY或地址位ADDR/IDLE MODE帧长度增加所需的总低电平时间也相应增加8位数据 奇偶校验 1811 11位 总计需20.625位时间。8位数据 地址位 1811 11位 总计需20.625位时间。8位数据 奇偶校验 地址位 18111 12位总计需21.625位时间。配置与使用步骤使能中断如果需要Break触发中断需设置SCICTL2.RXBKINTENA 1。这样当BRKDT置位时会触发RX中断。中断服务程序ISR处理在RX中断服务程序中首先检查SCIRXST.BRKDT位是否为1。interrupt void sciaRxIsr(void) { if (SciaRegs.SCIRXST.bit.BRKDT 1) { // 检测到Break信号 handleBreakCondition(); // 重要清除Break状态必须通过软件复位SCI或系统复位 SciaRegs.SCICTL1.bit.SWRESET 0; // 先置0 SciaRegs.SCICTL1.bit.SWRESET 1; // 再置1重新使能SCI // 注意SWRESET会复位许多状态位请谨慎操作并重新配置必要寄存器 } // ... 处理正常数接收 }清除Break状态这是关键一步BRKDT标志不能通过读SCIRXBUF来清除。唯一的方法是触发一次SCI的软件复位SWRESET或硬件复位。SWRESET会复位SCI的状态机和操作标志但不会改变配置寄存器如波特率、数据格式。执行SWRESET后必须重新使能SCI将SWRESET写回1。实操心得在实际硬件中如果SCI-RX引脚悬空或受到强噪声干扰可能会意外触发Break检测。一个有效的硬件预防措施是在RX引脚上添加一个上拉电阻如4.7kΩ至10kΩ确保线路在空闲时处于确定的高电平状态增强抗噪能力。3.2 方法二软件组合标志检测兼容性方法某些旧的通信协议或设备可能发送的Break序列长度不足19.625位例如标准的10或11位低电平。此时硬件BRKDT可能无法触发。我们可以利用帧错误FE、奇偶校验错误PE和接收数据为0x00这三个条件的组合在软件中判断Break。检测逻辑如下Break序列长度所需条件判断逻辑11位低电平需使能奇偶校验(FE 1) (PE 1) (SCIRXBUF.SAR 0x00)假设配置为奇校验10位低电平需禁用奇偶校验(FE 1) (SCIRXBUF.SAR 0x00)原理剖析发送方持续发送低电平0。对于接收方这会被解读为一连串的0数据位。对于一个8位数据均为0的帧如果使能了奇校验由于0的个数为8偶数校验位应为1才能使1的总数为奇数。但发送方持续低电平校验位也是0导致校验错误PE1。停止位期望是高电平但收到的仍是低电平导致帧错误FE1。接收到的数据位全是0所以SCIRXBUF为0x00。当这三个条件同时满足就可以在软件中判定收到了一个“短Break”信号。配置与使用步骤根据协议配置SCI如果期望检测11位Break则使能奇偶校验SCICCR.PARITYENA1,SCICCR.PARITY0选择奇校验。如果检测10位Break则禁用奇偶校验。使能错误中断设置SCICTL1.RXERRINTENA 1使能接收错误中断。在错误中断中判断interrupt void sciaRxErrIsr(void) { if ((SciaRegs.SCIRXST.bit.FE 1) (SciaRegs.SCIRXST.bit.PE 1)) { // 发生了帧错误和奇偶错误 uint16_t receivedData SciaRegs.SCIRXBUF.bit.SAR; if (receivedData 0x00) { // 结合收到0x00判定为Break信号 handleShortBreakCondition(); } else { // 是普通的校验和帧错误 handleCommError(); } } // 清除错误标志可能需要读取SCIRXBUF并根据情况复位 }注意事项方法二依赖于错误标志而错误中断RXERR可能由多种原因触发FE, OE, PE, BRKDT。因此中断服务程序需要仔细检查SCIRXST寄存器以区分具体错误类型。此外在FIFO模式下每个FIFO中的数据都带有独立的FE和PE标志位SCIFFFE和SCIFFPE位于SCIRXBUF的高位这为精确诊断哪个数据出错了提供了便利。4. 波特率计算、自动检测与FIFO配置实战4.1 精确计算波特率寄存器值SCI的波特率由低速外设时钟LSPCLK和波特率选择寄存器BRR由SCIHBAUD和SCILBAUD组成共同决定。计算公式是理解配置的核心公式1已知LSPCLK和期望波特率求BRRBRR LSPCLK / (SCI_Async_Baud * 8) - 1其中BRR为16位整数值SCI_Async_Baud为目标波特率。公式2已知BRR求实际波特率SCI_Async_Baud LSPCLK / ((BRR 1) * 8)公式3特殊情况当BRR 0时波特率达到最大SCI_Async_Baud LSPCLK / 16计算实例 假设系统LSPCLK 100 MHz我们需要配置波特率为115200。计算BRR:BRR 100,000,000 / (115200 * 8) - 1 ≈ 108.5 - 1 107.5取整BRR 108(0x6C)计算实际波特率Actual_Baud 100,000,000 / ((1081)*8) 100,000,000 / 872 ≈ 114,678.9计算误差Error (114678.9 - 115200) / 115200 ≈ -0.45%这个误差在大多数异步串口通信的可接受范围内通常要求2%。你可以将SCIHBAUD写为0x00SCILBAUD写为0x6C。避坑指南数据手册中的波特率表格如9600 19200等是基于特定LSPCLK的典型值。你的LSPCLK可能不同务必根据你系统实际的时钟配置SYSCLK、PLL、外设时钟分频器计算出准确的LSPCLK值再用上述公式计算BRR。盲目套用表格值是通信失败的常见原因。4.2 自动波特率检测Auto-Baud流程详解自动波特率检测功能允许F28002x在未知主机波特率的情况下通过接收一个特定字符自动同步。其硬件逻辑会测量字符‘A’0x41二进制0100_0001或‘a’0x61二进制0110_0001的位宽从而反推出波特率。硬件限制与前提条件自动波特率检测在较高波特率通常超过100kbps下可能不可靠因为信号边沿的上升/下降时间压摆率受收发器和连接器性能影响会影响测量精度。TI官方建议在较低波特率下完成初始波特率锁定例如与Bootloader通信时然后通过软件握手切换到更高的应用波特率。主机发送的第一个字符必须是‘A’或‘a’。初始化的波特率寄存器BRR值必须设置为1或一个对应波特率低于500kbps的值以确保能正确捕获第一个字符。标准配置流程如下初始化与使能// 1. 确保SCI处于复位状态并配置基本参数数据位、停止位等但先不设置波特率 SciaRegs.SCICTL1.bit.SWRESET 0; // 配置SCICCR字符格式例如8位数据无校验1停止位 SciaRegs.SCICCR.all 0x0007; // 8位字符无循环回送无奇偶1停止位空闲线模式 // 2. 使能自动波特率检测模式 SciaRegs.SCIFFCT.bit.CDC 1; // 使能自动波特率校准检测 SciaRegs.SCIFFCT.bit.ABDCLR 1; // 写1清除ABD标志位 // 3. 初始化波特率寄存器为一个较小的值确保能捕获低速信号 SciaRegs.SCIHBAUD 0x00; SciaRegs.SCILBAUD 0x01; // 设置一个极低的波特率 // 4. 使能SCI接收器和发送器可选 SciaRegs.SCICTL1.bit.RXENA 1; SciaRegs.SCICTL1.bit.TXENA 1; // 5. 释放SCI复位 SciaRegs.SCICTL1.bit.SWRESET 1;等待检测与中断处理 主机开始以目标波特率发送字符‘A’或‘a’。F28002x的SCI硬件在成功检测并计算出波特率后会自动将计算出的BRR值更新到SCIHBAUD:SCILBAUD寄存器并设置SCIFFCT.ABD 1。如果CDC1且ABD置位会触发一个发送FIFO中断TXINT。// 在自动波特率中断服务程序中 interrupt void sciaTxIsr(void) { // 注意是TX中断 if (SciaRegs.SCIFFCT.bit.ABD 1) { // 自动波特率检测成功 // 6. 清除ABD标志并关闭CDC以防止后续重复锁定 SciaRegs.SCIFFCT.bit.ABDCLR 1; // 写1清除ABD SciaRegs.SCIFFCT.bit.CDC 0; // 禁用后续自动波特率检测 // 7. 可选读取接收缓冲区丢弃用于检测的‘A’/‘a’字符 uint16_t dummy SciaRegs.SCIRXBUF.bit.SAR; // 此时SCI已经以正确的波特率运行可以开始正常通信 baudLocked true; } // ... 清除其他TX中断标志 }4.3 FIFO功能配置与优化策略FIFO是提升吞吐量的利器但其配置有诸多细节。FIFO使能与基本操作通过设置SCIFFTX.bit.SCIFFENA 1来使能FIFO功能。使能后标准SCI的TXINT/RXINT中断源被FIFO的中断所取代。发送时数据写入SCITXBUF后会进入TX FIFO队列。当TX FIFO非空时数据会根据SCIFFCT.FFTXDLY设置的延迟自动转移到发送移位寄存器TXSHF发出。接收时数据从RXSHF移入RX FIFO。读取数据仍通过SCIRXBUF它会从RX FIFO的顶部弹出数据。关键配置项中断触发水平TXFFIL, RXFFILTXFFIL发送FIFO中断水平当发送FIFO中的数据量小于或等于此阈值时触发TX FIFO中断。默认值为0意味着发送FIFO一空就立即中断。对于需要持续发送的场景可以设置为一个中间值如8这样当CPU填充一批数据后FIFO降到8以下时产生中断CPU有更充裕的时间准备下一批数据避免FIFO完全空置导致发送停顿。RXFFIL接收FIFO中断水平当接收FIFO中的数据量大于或等于此阈值时触发RX FIFO中断。默认值为0x1F31即几乎满16级才中断。这适合批量接收。对于实时性要求高的命令解析应设置较小的值如1或4。// 配置示例使能FIFO设置发送空阈值为4接收满阈值为8 SciaRegs.SCIFFTX.bit.SCIFFENA 1; // 使能FIFO SciaRegs.SCIFFTX.bit.TXFIFORESET 1; // 释放TX FIFO复位 SciaRegs.SCIFFRX.bit.RXFIFORESET 1; // 释放RX FIFO复位 SciaRegs.SCIFFTX.bit.TXFFIL 4; // TX FIFO 4时中断 SciaRegs.SCIFFRX.bit.RXFFIL 8; // RX FIFO 8时中断 SciaRegs.SCIFFTX.bit.TXFFIENA 1; // 使能TX FIFO中断 SciaRegs.SCIFFRX.bit.RXFFIENA 1; // 使能RX FIFO中断发送延迟FFTXDLY 此功能用于在两个连续发送的帧之间插入可编程的延迟。延迟时间 FFTXDLY值 × 波特率时钟周期。当FFTXDLY0时帧与帧之间紧密相连。设置一个延迟可以减缓发送速率避免某些处理能力较慢的接收设备溢出。注意当配置为2个停止位时实际帧间延迟为FFTXDLY - 1个波特时钟。FIFO复位 在使能FIFO或需要清空FIFO时正确的操作顺序是SciaRegs.SCIFFTX.bit.TXFIFORESET 0; // 复位TX FIFO指针 SciaRegs.SCIFFRX.bit.RXFIFORESET 0; // 复位RX FIFO指针 // ... 进行其他配置 SciaRegs.SCIFFTX.bit.TXFIFORESET 1; // 使能TX FIFO SciaRegs.SCIFFRX.bit.RXFIFORESET 1; // 使能RX FIFO更彻底的复位可以使用通道复位位SciaRegs.SCIFFTX.bit.SCIRST 0;然后 1;。这会同时复位FIFO和许多状态标志。5. 关键寄存器精讲与配置代码示例数据手册列出了大量寄存器但在初期我们应聚焦于最核心的几个。以下是一个完整的SCI-A初始化函数示例它配置了波特率、FIFO并使能了接收中断和Break检测。/** * brief 初始化SCI-A模块配置为115200波特率8N1使能RX中断和FIFO * param sysClk 系统时钟频率 (Hz) * param baudRate 目标波特率 */ void InitScia(uint32_t sysClk, uint32_t baudRate) { uint16_t brr; // 步骤1: 计算BRR值 (假设LSPCLK SYSCLK / 4 需根据实际系统时钟配置调整) // 许多例程中LSPCLK默认与SYSCLK一致或为一半请查阅具体器件手册和系统初始化代码 uint32_t lspclk sysClk / 4; // 示例假设4分频 brr (lspclk / (baudRate * 8)) - 1; // 步骤2: 禁用SCI软件复位 SciaRegs.SCICTL1.bit.SWRESET 0; // 步骤3: 配置通信控制寄存器 (SCICCR) // 8位数据无奇偶校验1停止位空闲线多处理器模式禁用回环 SciaRegs.SCICCR.all 0x0007; // 步骤4: 配置波特率寄存器 SciaRegs.SCIHBAUD (brr 8) 0x00FF; // 高字节 SciaRegs.SCILBAUD brr 0x00FF; // 低字节 // 步骤5: 配置控制寄存器1 (SCICTL1) // 使能接收错误中断使能TX和RX退出睡眠模式释放软件复位 SciaRegs.SCICTL1.bit.RXERRINTENA 1; // 使能接收错误中断用于Break方法2等 SciaRegs.SCICTL1.bit.SWRESET 1; // 准备退出复位但先不使能TX/RX // 步骤6: 配置控制寄存器2 (SCICTL2) // 使能接收中断RXRDY/BRKDT和发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA 1; // 使能RX/Break中断用于Break方法1 SciaRegs.SCICTL2.bit.TXINTENA 0; // 默认禁用TX中断使用FIFO中断 // 步骤7: 配置FIFO和增强功能 SciaRegs.SCIFFTX.bit.SCIRST 0; // 复位FIFO和通道 SciaRegs.SCIFFTX.bit.SCIFFENA 1; // 使能FIFO增强功能 SciaRegs.SCIFFTX.bit.TXFIFORESET 1;// 使能TX FIFO SciaRegs.SCIFFRX.bit.RXFIFORESET 1;// 使能RX FIFO SciaRegs.SCIFFTX.bit.TXFFIL 0; // TX FIFO空时中断 SciaRegs.SCIFFRX.bit.RXFFIL 1; // RX FIFO有1个数据时中断实时性高 SciaRegs.SCIFFTX.bit.TXFFIENA 1; // 使能TX FIFO中断 SciaRegs.SCIFFRX.bit.RXFFIENA 1; // 使能RX FIFO中断 SciaRegs.SCIFFCT.bit.FFTXDLY 0; // 发送帧间无额外延迟 // 步骤8: 最后使能接收器和发送器并完全释放SCI SciaRegs.SCICTL1.bit.RXENA 1; // 使能接收器 SciaRegs.SCICTL1.bit.TXENA 1; // 使能发送器 // SWRESET已在步骤5置1SCI现已完全运行 // 步骤9: 配置GPIO复用为SCIA功能 (根据具体芯片引脚定义) // 例如: GPIO_setPinConfig(GPIO_8_SCITXDA); // GPIO_setPinConfig(GPIO_9_SCIRXDA); // 此处省略具体GPIO配置代码 // 步骤10: 使能PIE中断如果需要 // 此处省略PIE向量表配置和中断使能代码 }寄存器精讲要点SCICTL1.SWRESET这是SCI的总开关。写0复位所有状态机和工作标志如RXRDY, TXRDY, 错误标志但不改变配置寄存器SCICCR, SCIHBAUD等。任何重要的配置更改前后都应先将其置0配置完成后再置1。清除Break标志也必须通过它。SCIRXST这是诊断通信问题的“仪表盘”。RXRDY指示有新数据BRKDT、FE、OE、PE分别指示Break、帧错误、溢出错误和校验错误。RXERROR是这些错误标志的“总闸”常用于快速判断是否有任何错误发生。SCIFFTX和SCIFFRXFIFO的控制中心。除了使能和中断配置TXFFST和RXFFST位域可以实时读取发送和接收FIFO中存有多少个数据这在调试数据流时非常有用。SCIFFCT除了控制自动波特率ABD,ABDCLR,CDCFFTXDLY是调节发送节奏的微调旋钮。6. 常见问题排查与调试心得即使配置无误在实际硬件调试中仍会遇到各种问题。以下是我总结的一些典型故障场景和排查思路问题1通信完全无反应收不到任何数据。检查时钟树确认LSPCLK的频率是否与计算BRR时假设的一致。使用CCS的寄存器查看窗口或调试器表达式直接读取LSPCLK相关寄存器的值进行验证。检查引脚复用这是最常犯的错误。确认GPIO是否已正确配置为SCI功能SCITXDA, SCIRXDA而不是普通的数字IO。检查硬件连接确保TX接RXRX接TX共地。用示波器或逻辑分析仪测量TX引脚是否有波形输出。如果没有能是SCI未使能TXENA0或仍在复位状态SWRESET0。检查波特率用示波器测量发送一个字节如0x55二进制01010101的波形计算位宽反推实际波特率与预期值对比。问题2能收到数据但全是乱码或特定错误。波特率不匹配即使误差在2%以内长报文也可能出错。仔细核对双方波特率计算。确保双方使用的时钟源精度足够陶瓷谐振器误差较大温漂可能引起后期故障。数据格式不匹配检查数据位长度8位 vs 7位、停止位1 vs 2、奇偶校验无/奇/偶是否与对方设备完全一致。SCICCR寄存器的SCICHAR、PARITYENA、PARITY、STOPBITS位需仔细配置。电气电平问题如果通信距离超过1米或环境噪声大RS-232或RS-485电平转换可能是必须的。TTL电平抗干扰能力差。问题3使用FIFO后数据丢失或中断不触发。FIFO指针未复位在使能FIFO功能SCIFFENA1前或需要清空FIFO时没有正确复位FIFO指针TXFIFORESET和RXFIFORESET先写0再写1。中断触发水平设置不当RXFFIL设置过大导致数据早已到达但未触发中断如果此时主循环不及时轮询FIFO可能溢出RXFFOVF置位。同样TXFFIL设置不当可能导致发送不连续。中断标志未清除在FIFO中断服务程序中必须清除对应的中断标志。对于TX FIFO中断写TXFFINTCLR1对于RX FIFO中断写RXFFINTCLR1。特别注意如果发生了接收溢出RXFFOVF1需要同时清除RXFFINTCLR和RXFFOVRCLR否则可能阻塞后续中断。问题4Break检测功能不稳定或误触发。硬件上拉电阻如之前所述在RX引脚增加一个上拉电阻如10kΩ确保空闲时为高电平可以有效避免噪声引起的误Break检测。软件复位时机检测到BRKDT后如果没有及时通过SWRESET清除该状态SCI接收器可能会被“锁死”无法接收后续数据。确保在Break处理逻辑中执行正确的复位序列。信号质量问题使用示波器检查Break信号波形。确保低电平时间足够长19.625个位时间并且上升沿/下降沿干净无振铃。长距离传输时信号完整性可能变差。问题5自动波特率检测失败。第一个字符非‘A’/‘a’确保主机发送的第一个字符绝对是0x41或0x61。初始波特率寄存器值太大确保在启动自动波特率前BRR值设置得足够大即初始波特率足够低使得即使对方波特率很高也能正确采样到第一个字符的起始位。信号边沿速率如手册警告在高速率下100kbps由于信号压摆率限制自动波特率可能失效。坚持在较低速率如9600下完成初始锁定再通过应用层协议切换至高速率。调试SCI示波器或逻辑分析仪是你的最佳伙伴。通过观察实际的TX/RX波形可以直观地看到起始位、数据位、停止位是否规整Break信号的低电平持续时间是否足够从而将问题定位到硬件信号层或软件配置层。永远不要只依赖软件打印的日志进行通信调试。