简单记录一下工作中,遇到的MCU勘误。
GD32e230xx
使用单线串口实现485通讯 需要软件干预串口是处于发送还是接收状态
当前环境
- 使用USART0 PA9 端口

- 串口初始化时配置为TX RX都使能;切换发送和接收时只切换485的DE RE引脚上的电平
1 | #define RXMODE() gpio_bit_reset(GPIOA,GPIO_PIN_0) |
遇到问题
- MCU回复主机命令后,可以看到,MCU又接收到了一个字节的数据(此时主机并没有发送数据),这个字节的数据和MCU自己发送的第一个字节相同

解惑
- 在GD32e23x用户手册中写明了:
通讯冲突由软件处理 
- 推理:
MCU初始化串口时同时开启了TX 和 RX,在MCU回包时RX没有关闭,导致MCU把TX的数据认为时RX的数据,由于RX的缓冲区RDATA只有一个深度,仅在被MCU读出后才能接收新的数据,因此当MCU发送完所有数据后,MCU判断到有新的串口数据。
解决方案
- MCU串口初始化时进开启RX
- MCU在回包时打开TX,关闭RX
- MCU在回包结束后关闭TX,打开RX
1 | #define RXMODE() \ |