You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

关键修改点

  1. 在UART_1_LoadTxConfig()后添加10μs延迟,让硬件完成模式切换和寄存器配置
  2. 初始启动后增加100ms延迟,避免首次传输时硬件未完全就绪
  3. 切换到Rx模式前再次确认总线空闲,防止干扰后续接收操作
  4. 移除不必要的重复配置加载逻辑,减少状态冲突

内容的提问来源于stack exchange,提问作者melyodafu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:41:24