GD32F450的USART接收数据错误问题
概述
GD32F450芯片:使用115200波特率,422通讯时,接收数据容易出错。
复现方法:芯片GD32F450ZGT6或者GD32F450VET6
时钟配置:8M外置晶体PLL到200M,或者16M内部IRC,PLL到168M均可以复现。
串口配置:USART0、UART3、UART4、USART5、UART6均可。
串口外接422芯片:CA-IS3086,ISO3086,SIT3485均可。
测试软件:USART的ISR中接收的数据后马上发回,PC上100ms周期发送字符'a',即0x61,MCU返回的数据除了0x61,还有很多0xD8。
调整测试
去掉422芯片,直接用TTL电平,其它条件不变,115200波特率下一切正常。
降低波特率到57600,继续使用422电平,正常,422接口芯片最低波特率均在10M以上。
问题分析与解决方案
F4系列的UART判断起始位的时候,16倍过采样,需要16个点全部为0才能确认。
但是由于422接口芯片,差分转单端以后,低电平会变短,高电平变长,如果超过1/16=6.25%以后就会出错。
实测115200波特率,正常低电平为1e6/115200=8.68us,实测经过422接口芯片以后,低电平比正常短7%(高电平长6%),刚好在临界点上。
7%超过了6.25%的误差容限,会导致16个采样点至少有一个不为0,采样不到起始位,导致出错。
将过采样降低到8倍,那么误差容限为1/8=12.5%,这样,115200波特率就不会有问题了,230400还是不行。