WIFI技术
直播中

徐胤

8年用户 1144经验值
私信 关注
[问答]

请问如何为CYW5591x串行启用具有流控制的Uart?

我们希望使用 UART 与外部 MCU 通信以获取一些数据,并且它可以与没有流控制的 UART 一起工作。但我发现在数据传输过程中会发生数据丢失,并且 UART 在接收到一些字节后会随机卡住。所以我们想增加流量控制看看能不能避免数据丢失和卡住。
我发现 cy_retarget_io_init_fc() 函数可以初始化 HCI UART 以进行流控制。
my-d™喜欢将以下引脚配置为具有流控制的 UART,但似乎不起作用。
如果有什么不正确或缺失的话,有人可以帮忙指出吗?


#定义UART_BAUD_RATE(115200)
#定义 MCU_TX BT_GPIO_3
#定义 MCU_RX BT_GPIO_2
#定义 MCU_RTS BT_GPIO_7
#定义 MCU_CTS BT_GPIO_17
/*初始化外部MCU的UART外设*/
cyhal_uart_init(&test_uart,MCU_TX,MCU_RX,MCU_CTS,MCU_RTS,NULL,&uart_config);
/*初始化波特率*/
cyhal_uart_set_baud(&test_uart,UART_BAUD_RATE,NULL);
/*启用指定的UART事件*/
cyhal_uart_enable_event(&test_uart,(cyhal_uart_event_t)(CYHAL_UART_IRQ_RX_DONE | CYHAL_UART_IRQ_TX_DONE),UART_PRIORITY,true);

回帖(1)

路过秋天

2025-7-22 17:46:15

要启用CYW5591x串口硬件流控制,请按以下步骤操作:


1. 正确定义流控制引脚


流控制需要RTS(请求发送-输出)和CTS(清除发送-输入)两个额外信号:


#define UART_BAUD_RATE   (115200)
#define MCU_TX           BT_GPIO_3   // HOST_TX -> 连接外部MCU_RX
#define MCU_RX           BT_GPIO_2   // HOST_RX -> 连接外部MCU_TX
#define MCU_RTS          BT_GPIO_4   // HOST_RTS -> 连接外部MCU_CTS (输出信号)
#define MCU_CTS          BT_GPIO_5   // HOST_CTS <- 连接外部MCU_RTS (输入信号)

2. 使用带流控制的初始化函数


调用cy_retarget_io_init_fc()而非普通初始化:


#include "cy_retarget_io.h"

cy_rslt_t result = cy_retarget_io_init_fc(
    MCU_TX,   // TX pin
    MCU_RX,   // RX pin
    MCU_CTS,  // CTS pin (输入)
    MCU_RTS,  // RTS pin (输出)
    UART_BAUD_RATE
);

if (result != CY_RSLT_SUCCESS) {
    // 错误处理
    CY_ASSERT(0);
}

3. 关键配置检查点




  1. 硬件接线



    • 确保RTS/CTS交叉连接:

      • CYW5591x_RTS ➔ 外部MCU_CTS

      • CYW5591x_CTS ➔ 外部MCU_RTS





  2. 外部MCU配置



    • 对方MCU必须也启用硬件流控制

    • 确认双方波特率均为115200




  3. 引脚映射冲突



    • 检查BT_GPIO_X未被其他功能占用(通过ModusToolbox设备配置器确认)




  4. 板级验证


    printf("UART with FC enabled!n");  // 测试串口输出功能



4. 常见问题解决




  • 流控不生效



    1. 用万用表检查RTS/CTS物理连接

    2. 用逻辑分析仪捕获流控信号波形

    3. 确认cy_retarget_io_init_fc()返回值是否为CY_RSLT_SUCCESS




  • 卡死问题仍存在



    1. 在UART中断中添加超时保护:
      cyhal_uart_set_rx_timeout(cy_retarget_io_uart_obj, 50); // 50ms超时

    2. 增加接收缓冲:
      #define RX_BUF_SIZE 256
      cyhal_uart_set_rx_buffer(cy_retarget_io_uart_obj, rx_buf, RX_BUF_SIZE);




5. 备用方案(如果仍失败)




  1. 降低波特率测试


    #define SAFE_BAUD_RATE (57600)
    cy_retarget_io_init_fc(MCU_TX, MCU_RX, MCU_CTS, MCU_RTS, SAFE_BAUD_RATE);



  2. 软件流控制(XON/XOFF)


    cyhal_uart_config_t uart_config = {
       .data_bits = 8,
       .stop_bits = 1,
       .parity = CYHAL_UART_PARITY_NONE,
       .rx_buffer = NULL,
       .rx_buffer_size = 0,
       .flow_control = CYHAL_UART_FLOW_CTRL_SOFT
    };
    cyhal_uart_init(cy_retarget_io_uart_obj, MCU_TX, MCU_RX, NC, NC, NULL, &uart_config);




重要说明:ModusToolbox版本必须≥3.0(早期版本有已知流控制问题)。通过make getlibs确保所有库为最新版。



完成上述配置后,数据丢失问题应显著改善。建议先用短数据包验证流控信号是否正常动作,再逐步增加负载测试。

举报

更多回帖

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