GD32串口输出错误分析
1、用法:目前公司采用GD32F407作为主控芯片,采用美信的MAX3232作为RS232的驱动芯片用于与其他第三方设备通信。2、现象:第三方设备该端口的波特率为固定值:115200,经测试,与绝大多数第三方设备均可以正常通信,但与某些品牌的第三方设备通信时会完全是乱码。而采用STM32F407作为主控芯片时该会产生乱码的第三方设备的通信则没有问题。如发送0A:[*]正常接收为:0D 0D 0A 53 4D 49 4F 53 20 6C 6F 67 69 6E 3A 20
[*]实际接收数据为:A8 48 68 2A EA 6A 20 6C 6F 67 69 6E 3A 20
3、进一步现象发现:用示波器查看了该第三方设备输出的RS232波形,如图1所示:黄色为第三方设备输出的RS232原始波形,蓝色为经美信RS232转TTL以后得波形,从图中可以很明显看出,黄色信号上升下降斜率均较低,且不一致,这导致转TTL后的电平也呈现低电平时间短,高电平时间长的现象(查看了该厂家采用的为SP3232,图2为美信MAX3232的波形,上升下降斜率均较高);https://pic1.zhimg.com/80/v2-5af96146dbd1449fc9170132fd17dfe0_720w.webp图1https://pic4.zhimg.com/80/v2-adff7cf1728c28f8c9acd450682d404f_720w.webp图2https://pic2.zhimg.com/80/v2-a82e1a2ed77c78cb98cad3c0e41415f5_720w.webpSP3232出来的波形如下图:发送0x0A后https://pic2.zhimg.com/80/v2-426fa383eb73cba576410f2bdc529fbd_720w.webp放大后如下图:https://pic3.zhimg.com/80/v2-d7b86ee6abb2d7f5359e2297f7a2cede_720w.webp4、更近一步现象发现:采用单字节收发的模式进行测试,发现在数值为奇数时,都无法接受到正确的报文,而数值为偶数时则一般没有问题。5、STM32与GD32检测机制分析:
[*]两者对数据部分的检测机制完全一致,如图3:
https://pic4.zhimg.com/80/v2-71d4b6ce7086533a9ea5dcf896d9f63b_720w.webp
图3
[*]对于起始位的检测描述则ST写的比较清晰,如图4所示,但GD并未提及(但网上找到一些资料说GD需要检测到连续16个0才能认为是有效的起始位)
https://pic1.zhimg.com/80/v2-9c7e494469877f99391bb89ee2bdb6e0_720w.webp图46、起始位检测机制:6.1、ST起始位检测机制stm32对串口的数据识别主要包含两部分,起始位的识别和数据位的识别。起始位识别:不管是16 倍还是 8 倍过采样,起始位检测序列相同。都是按照16倍的方式判断,就是起始位不受16 倍或 8 倍过采样配置的影响,在 USART 中,识别出特定序列的采样时会检测起始位。此序列如下:1110X0X0X0000起始位识别图,如下:https://pic2.zhimg.com/80/v2-e94bb778b574c262c3c66c3fcf801475_720w.webp如果下降沿序列不完整,起始位检测将中止,接收器将返回空闲状态(无标志位置 1)等待下降沿。如果 3 个采样位均为 0(针对第 3 位、第 5 位和第 7 位进行首次采样时检测到这 3 位均为 0;针对第 8 位、第 9 位和第 10 位进行第二次采样时检测到这 3 位均为 0),可确认起始位(RXNE 标志位置 1,RXNEIE=1 时生成中断)。如果满足以下任意条件时,可验证起始位(RXNE 标志位置 1,如果 RXNEIE=1 则生成中断),但同时 NF噪声标志位也会置 1:
[*]对于两次采样,有 2 位为 0(针对第 3 位、第 5 位和第 7 位进行采样;针对第 8 位、第 9 位和第 10 位采样)。
[*]如果其中一次采样时(对第 3 位、第 5 位和第 7 位进行采样或对第 8 位、第 9 位和第 10位进行采样),3 个采样位中有 2 个为0。
如果条件 a 或条件 b 都不满足,则启动检测中止,接收器返回空闲状态(无标志位置 1)。当起始位满足要求,那么就进入数据位检测:数据检测的时候,过采样16和过采样8是不同的,具体如下:过采样16https://pic3.zhimg.com/80/v2-5977b5ba88851e97b2a71086aa96d022_720w.webp过采样8https://pic4.zhimg.com/80/v2-a4a36b0be529e2186707ec6216b5d2b7_720w.webp其实过程都一样,就是通过采集中间的3次来判断这个bit的高低,下面的对照表:https://pic2.zhimg.com/80/v2-8e39e5a1b524b82e4767b530e39ac6b9_720w.webp但是要注意,当串口的电平延时不标准的时候(比如低电平时间短),会导致采集的这三次不在bit的中间,这就是容错性的问题关键了。6.2、GD起始位检测机制需要明确GD对起始位置的检测原理,若真如网传的是连续检测16个0,再联系实测波形及奇数出现乱码的现象,则可对上述产生乱码的现象解释。经与原厂工程师确认,GDF32F4xx串口起始位检测机制为:连续检测16个0---20231229与GD技术支持确认7、分析结论:造成数据乱码的问题:在于GD串口对起始位的检测机制不合理造成,同样将GD32F407换成STM32F407后问题解决。
使用逻辑分析仪或串口调试工具监视串口通信,更详细地分析波形和通信过程中的数据。 GD32F407 在与某些第三方设备通信时出现乱码,而 STM32F407 在相同条件下通信正常。问题的主要症状是 RS232 信号的波形质量和通信数据的正确性。
页:
[1]