485是通过两根差分线来传输数据,所以总线上要么是发送的数据,要么是接收的数据,所以标准两线485是属于半双工的工作模式。既然是半双工,发送的同时又接收数据,这个问题岂不是很奇怪,并且这样的实现又有什么意义。
先看下到底是基于什么场景我才想到去验证这么一个问题。标准485总线上可以同时挂载多个设备,但是只能有一个为主机,其他的都为从机。
![e9b09e096b493d82ce9d897459ff287b.png](https://i-blog.csdnimg.cn/blog_migrate/5a4dc0a429ee66548f4304b8619717b5.jpeg)
这样主机不主动发送数据,总线上一直都处于空闲状态。 而从机要发数据一定是主机先对从机进行询问,然后从机进行应答。
![1d88b87dcbfa68bcdffac4a8c3ea9d1d.png](https://i-blog.csdnimg.cn/blog_migrate/19da0b49c41f2a709751ed2ef619e3c8.jpeg)
这样的总线上就能保证永远也不会有数据冲突(也就是同时有多个设备发出来数据)。而我想要的效果就是不要标准的主从模式,而是想要多个主机同时存在。多个主机存在就有可能多个设备同时发数据,造成数据冲突。
而这个发送的同时又接收总线上的数据就是为了验证总线上数据是否冲突了,比如一个设备在发送0xFF,另一个设备同时发送了0X12。这样总线上的数据是不是就混乱了。
所以基于为了避免冲突,任何一个设备在发送之前都进行检查,比如在总线上发送0x55,同时这个设备也打开接收,如果总线上没有冲突就会收到0x55,如果冲突了接收到的数据和发送的数据就会不同。这个接收就是为了接收自己发送出去的数据进行验证。
因为手头上没有现成的485 板子,就直接拿芯片焊线插上面包板,再连接stm32的uart口,搭建出来验证的环境:
![45ac9b7e51ea3bf4208b3143ea9d6694.png](https://i-blog.csdnimg.cn/blog_migrate/56952301f0f98d3a731af0aa72edeaa4.jpeg)
芯片使用的max1483。接线示意图如下:
![ac4019955c4b86063b4ea10becb0cb51.png](https://i-blog.csdnimg.cn/blog_migrate/2945ba51c3a8551c87384e08cb2b8251.jpeg)
实现的重点就是RE DE两个控制脚。根据手册里面的描述,RE-低的时候使能RO输出(也就是AB总线上数据可以直接从RO输出)。DE为高的时候使能AB输出,这时候DI上的数据就会被转为AB差分输出。
通过DERE 同时拉高或者拉低就可以切换max1483处于发送还是接收状态。那么也可以把RE设置为低,DE设置为高来实现同时打开发送和接收。这样如果485总线空闲的时候就可以保证MCU RX接收到的还是MCU TX发送的数据。
![a8eab3bf86f035f51b00997d109e3a61.png](https://i-blog.csdnimg.cn/blog_migrate/96476ee4d7761a72037c93e2458c64bc.jpeg)
最后我也做了测试当MCU TX在发送数据,我又同时通过usb转485往AB总线上发其他数据,这时候MCU RX接收的就是乱码了。和最初设想的结果相同,so,485多主机存在就实现了第一步。