CH32V208W USART RTS信号不能配置为RS485模式控制功能

1、当前使用参考代码为 USART_HardwareFlowControl中的示例,当量进行了修改

    while(1){


        int i;

        for(i=0;i<10;i++){

            USART_SendData(USART1, 0x55+i);

            while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

        }

        USART_SendData(USART1, 0x55);

        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

        Delay_Ms(10);

    }

2、测试发现,RTS信号只能在发送之前保持一下短暂的高信号,平时为低电压,与使用意图不一至。 并不能配出真正的RS485模式。(也就是平时静态是RTS为低电平,当存在数据发送时一直处理高电平,再等待发送结束后恢复为低电平)

image.png

3、疑问

   1)、V208是否并不支持RS485模式的流控控制方式?

   2)、如果要实际这个功能是否就意味着只能对发送缓冲区进行监测,来实现,而不能完全基于硬件来实现这个方案?

   3)、当前RM资料中没有解释,也没有相应的说明,望给于解答。


使用GPIO控制模式会差一个字节,如果改成TC来判断效果一样并且很容易发送一帧后就卡住了。

有什么办法判断最后一个字节是移位发送正常结束了。


void USART2_data_send(uint32_t uart_index,uint8_t *data,uint32_t dataLen){

    int TxCnt1;

    TxCnt1=0;


    GPIO_SetBits(GPIOA, GPIO_Pin_1); //RTS


    while(TxCnt1 < dataLen)

    {

        USART_SendData(USART2, data[TxCnt1++]);

        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) /* waiting for sending finish */

        {

        }

    }


    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

    GPIO_ResetBits(GPIOA, GPIO_Pin_1);

}



补充上面2楼的图片,对USART 状态寄存器(USARTx_STATR)进行查讯,使用TC信号的结果与测量到的情况一至,怀疑情况是,上面寄存器指示的是缓冲区的空,而并不是真的移位寄存器中也已经发送完成。

1727052659195364.png


image.png


您好,关于485通信,建议使用GPIO拉高拉低表示发送或者接收模式,RTS只在接收寄存器满时设置为高电平。通过IO配置发送接收可参考一下下图配置例程

image.png


你们这个TC的寄存器不能反应移位寄存器中的内容是否为空,对不对?我看了ST RM的资料,都很明确的表示,TC信号是正常的。从时序图上看是可以通过这个信号来做为发送的结束。


您好,TC为发送完成标志,可以反应移位寄存器为空的,你可以按照我回复截图程序测试一下,你在3楼贴的2楼测试程序的图,你可以将对TXE标志位的判断按照我贴的代码全部改为TC试一下,我这边测试是没问题的,如下图

image.png


只有登录才能回复,可以选择微信账号登录