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的波形,上升下降斜率均较高); 图1 图2 SP3232出来的波形如下图:发送0x0A后 放大后如下图: 4、更近一步现象发现: 采用单字节收发的模式进行测试,发现在数值为奇数时,都无法接受到正确的报文,而数值为偶数时则一般没有问题。 5、STM32与GD32检测机制分析:
图3
- 对于起始位的检测描述则ST写的比较清晰,如图4所示,但GD并未提及(但网上找到一些资料说GD需要检测到连续16个0才能认为是有效的起始位)
图4 6、起始位检测机制: 6.1、ST起始位检测机制 stm32对串口的数据识别主要包含两部分,起始位的识别和数据位的识别。 起始位识别: 不管是16 倍还是 8 倍过采样,起始位检测序列相同。都是按照16倍的方式判断,就是起始位不受16 倍或 8 倍过采样配置的影响,在 USART 中,识别出特定序列的采样时会检测起始位。此序列如下: 1110X0X0X0000 起始位识别图,如下: 如果下降沿序列不完整,起始位检测将中止,接收器将返回空闲状态(无标志位置 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是不同的,具体如下: 过采样16 过采样8 其实过程都一样,就是通过采集中间的3次来判断这个bit的高低,下面的对照表: 但是要注意,当串口的电平延时不标准的时候(比如低电平时间短),会导致采集的这三次不在bit的中间,这就是容错性的问题关键了。 6.2、GD起始位检测机制 需要明确GD对起始位置的检测原理,若真如网传的是连续检测16个0,再联系实测波形及奇数出现乱码的现象,则可对上述产生乱码的现象解释。 经与原厂工程师确认,GDF32F4xx串口起始位检测机制为:连续检测16个0---20231229与GD技术支持确认 7、分析结论: 造成数据乱码的问题:在于GD串口对起始位的检测机制不合理造成,同样将GD32F407换成STM32F407后问题解决。
|