2018-10-22 使用SN75176(RS485)通讯与STM32连接发现的问题

    项目中使用STM32 UART连接SN75176与外界实现485通讯,通过一个单独GPIO管脚控制485 传输方向(DE/RE),UART设置为波特率9600,数据位8,停止位1,校验位0。

    通讯过程中发现向串口输出一组数据后,UART中断总会接收到一个字节0x00,而上位机并未发送任何数据。

    示波器追踪信号发现当SN75176发送数据时,即DE(PIN3)有效时,R(PIN1)端为低电平,当发送完成切换为RE(PIN2)有效时,同时R(PIN1)由低电平转换为高电平。

2018-10-22 使用SN75176(RS485)通讯与STM32连接发现的问题_第1张图片

    根据UART传输协议,空闲时保持高电平,如果传输一个字节0x00,在上述设置下,波形表现为9个bit的低电平。

2018-10-22 使用SN75176(RS485)通讯与STM32连接发现的问题_第2张图片

    根据波形猜测UART将R(PIN1)端的最后一部分识别为一个字节0x00。

    解决办法:由于RS485本来就是半双工通讯,在发送时不可能有数据接收,因此需要在发送数据时关闭UART接收中断,直到发送完成,DE切换为RE有效,做一次读数操作以清除中断标志位(该数据舍弃),然后打开UART接收中断。程序示意如下:

void USART3_send(uint8_t *p,uint32_t len)

{

         uint32_t i;

         uint8_t Giveup;                                  //读数缓冲


         USART_ITConfig(USART3, USART_IT_RXNE,DISABLE);   //关闭中断

         GPIO_SetBits(GPIOB , GPIO_Pin_12);                //切换DE有效

         ……

        发送数据

        ……

         GPIO_ResetBits(GPIOB , GPIO_Pin_12);              //切换RE有效

         Giveup=USART3->DR;                            //被舍弃的读数

         Giveup=Giveup;                                 //避免编译器报警

         USART_ITConfig(USART3, USART_IT_RXNE,ENABLE);   //打开中断

}

你可能感兴趣的:(2018-10-22 使用SN75176(RS485)通讯与STM32连接发现的问题)