Cypress PSoC5 UART半双工模式下调用UART_LoadTxConfig()后发送数据异常
CY8C5888LTI-LP097半双工UART仅传输4字节问题排查
硬件与配置说明
使用CY8C5888LTI-LP097芯片内置UART组件,配置为:
- 半双工(Half-Duplex)模式
- 波特率9600 Bd
- 8位数据位
- 偶校验
原始代码
uint8 transmitData(char* message, char len) { //CyGlobalIntDisable; UART_1_LoadTxConfig(); for(int i= 0; i<len;i++) { UART_1_PutChar(message[i]); } while((UART_1_ReadTxStatus()& UART_1_TX_STS_COMPLETE)!=UART_1_TX_STS_COMPLETE); UART_1_LoadRxConfig(); //CYGlobalIntEnable; return 0; } int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ UART_1_Start(); UART_1_LoadTxConfig(); char message[] = {0x12, 0x13,0x14, 0x02, 0x00, 0x39,0x07,0xFF,0xFA,0x50}; for(;;) { transmitData(message,10); CyDelay(50); } }
问题现象
运行代码后仅能传输message中的4字节数据,逻辑分析仪显示输出为{0x50,0x13,0x14,0x02},随后进入50ms延迟。
- 仅使用TX模式时传输完全正常
- 芯片启动后的首次传输也会出现该问题
- 将50ms延迟移至
transmitData()调用前可临时解决问题,推测与UART_LoadTxConfig()的模式初始化耗时有关
官方文档说明
Description: Loads the transmitter configuration in half duplex mode. After calling this function, the UART
is ready to transmit data.
文档同时要求确保之前的事务已完成,原代码中已通过PutChar()(阻塞函数)和等待TX_STS_COMPLETE状态确认发送完成。
问题分析与修正建议
核心问题
半双工模式下,UART_LoadTxConfig()的硬件初始化并非即时完成,文档描述的"ready"是软件层面的状态,实际硬件需要极短时间完成寄存器同步和总线状态切换,此时直接写入发送数据会导致前序字节丢失或移位。此外,重复加载Tx配置会干扰UART的内部状态,导致发送缓冲区数据错乱。
修正后的代码
uint8 transmitData(char* message, char len) { // 等待接收FIFO为空,确保Rx模式下无未处理数据 while((UART_1_ReadRxStatus() & UART_1_RX_STS_FIFO_NOTEMPTY) != 0); UART_1_LoadTxConfig(); // 给硬件留足模式切换时间,10μs足够覆盖9600波特率的一个字节周期 CyDelayUs(10); for(int i = 0; i < len; i++) { UART_1_PutChar(message[i]); } // 等待所有字节发送完成(包括停止位) while((UART_1_ReadTxStatus() & UART_1_TX_STS_COMPLETE) != UART_1_TX_STS_COMPLETE); // 切换到Rx前确保总线空闲 CyDelayUs(10); UART_1_LoadRxConfig(); return 0; } int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ UART_1_Start(); UART_1_LoadTxConfig(); char message[] = {0x12, 0x13,0x14, 0x02, 0x00, 0x39,0x07,0xFF,0xFA,0x50}; // 启动后延迟100ms,确保UART硬件完全初始化 CyDelay(100); for(;;) { transmitData(message,10); CyDelay(50); } }
关键修改点
- 在
UART_1_LoadTxConfig()后添加10μs延迟,让硬件完成模式切换和寄存器配置 - 初始启动后增加100ms延迟,避免首次传输时硬件未完全就绪
- 切换到Rx模式前再次确认总线空闲,防止干扰后续接收操作
- 移除不必要的重复配置加载逻辑,减少状态冲突
内容的提问来源于stack exchange,提问作者melyodafu
相关产品推荐
相关产品推荐

