英飞凌
直播中

张丽

7年用户 1449经验值
私信 关注

PSoC5 UART半双工模式在UART_LoadTxConfig() 之后传输数据时的疑问求解

我目前正在尝试使用内置的 UART 组件传输数据 CY8C5888Lti-LP097。UART配置为半双工模式,速率为 9600 Bd,数据位为 8,偶校验。我的代码如下所示:
uint8transmitData(char* message,charlen){   //CyGlobalIntDisable;    UART_2_LoadTxConfig();   for(inti=0; iwhile((UART_2_ReadTxStatus()  UART_2_TX_STS_COMPLETE)!=UART_2_TX_STS_COMPLETE);    UART_2_LoadRxConfig();   //CYGlobalIntEnable;   返回 0;}int main(void){    CyGlobalIntEnable;/* 启用全局中断。*/        UART_1_Start();    UART_1_LoadTxConfig();    charmessage[] = {0x12, 0x13,0x14, 0x02, 0x00, 0x39,0x07,0xFF,0xFA,0x50};   for(;;)    {               transmitData(message,10);        CyDelay(50);    }}我的问题是,使用此代码只能传输 4 message 字节。 结果输出为: {0x50,0x13,0x14,0x02} ,然后是 50ms 的延迟(根据连接到输出引脚的逻辑分析仪的结果)。
仅使用 TX 模式,传输工作与预期的一样。 但我注意到,PSoC 启动后的第一次传输看起来就像上述输出一样,这可以通过移动 transmitData() 前的 50ms 延迟来解决。 因此,我认为我的问题与 UART_LoadTx()需要相当长的时间才能正确设置 TX 模式有关。 另一方面, UART_LoadTx() 函数的文档明确指出:
描述 以 半双工模式加载发射机 配置 。调用此 函数 后 ,UART 已 准备 好 传输数据。 它还指出我必须确保前一个事务已经完成,我想我已经做到了(因为 PutChar() 函数应该是阻塞的,而我在等待最后一个字节的完成)。

回帖(1)

秋风宜人

2024-6-3 16:43:38
sp; CyGlobalIntDisable(); // 禁用全局中断
UART_2_Start(); // 启动 UART 组件
UART_2_LoadTxConfig(); // 加载 UART 发送配置
UART_2_LoadRxConfig(); // 加载 UART 接收配置

char message[] = "Hello, World!";
char len = sizeof(message) - 1;

uint8 transmitData(char* message, char len){
    // 禁用全局中断
    CyGlobalIntDisable();
   
    // 加载 UART 发送配置
    UART_2_LoadTxConfig();
   
    // 循环发送数据
    for(int i = 0; i < len; i++){
        while((UART_2_ReadTxStatus() & UART_2_TX_STS_COMPLETE) != UART_2_TX_STS_COMPLETE);
        UART_2_WriteTxData(*(message + i));
    }
   
    // 加载 UART 接收配置
    UART_2_LoadRxConfig();
   
    // 启用全局中断
    CyGlobalIntEnable();
   
    return 0;
}

int main(void){
    // 初始化系统和组件
    CyGlobalIntDisable();
    CyDelay(1000); // 等待 1000ms
    CyGlobalIntEnable();
   
    // 调用发送数据函数
    transmitData(message, len);
   
    for(;;) {
        // 主循环中的其他代码
    }
}
```

这段代码首先初始化系统和组件,然后调用 `transmitData` 函数发送数据。在 `transmitData` 函数中,我们首先禁用全局中断,加载 UART 发送配置,然后循环发送数据。在发送每个字符之前,我们检查 UART 是否已经完成发送上一个字符,然后写入新的字符。发送完所有字符后,加载 UART 接收配置,最后启用全局中断。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分