背景:
平台:STM32F103RBT6,带隔离的485芯片,一个脚为使能脚,高电平发送数据,低电平接收数据,软件通讯层无任何通讯协议,硬件层TTL转485。
1.第一次程序是使用轮询的方式,调用485程序,发现接收或者发送均有问题。
2.第二次使用的时候,使用中断,发送,接收,两个功能不能同时存在。
使用usb转TTL模块查看原因发现,串口可以正常使用,因此基础程序没用配错。查找了一切硬件因数发现无任何问题。
为此查看了芯片和485逻辑电平信号
原因排查
485为半工通讯和平常我们使用的全工协议不一样,通过查阅芯片手册后发现,RS485内部逻辑切换需要一定时间。
芯片从接收模式,切换到发送模式,需要经过3.5uS才能有驱动能力输出。如果换向后总线马上送出数据而不延迟,有3.5uS时间总线AB是没有驱动能力的,还是处于高阻状态,串口协议起始标志是TX由高到低跳变,如果不考虑改值,将会损失该占空比。
原因分析
主要原因是因为我切换管脚太早了,忽略芯片的使能延迟,所以接收不到数据。从而导致波特率误差变大,波特率越大损失越明显。
后续测试,波特率越小,我的软件延迟时间就可以越小
PS:补充,解决方案,就是在传输之前,传输之前提前切换,传输之后延长后切换,即前后传输数据前后都要加延迟