Having spent quite a few (or too many) hours debugging the UART behaviour in RS485 mode I think I have an improved implementation for a driver. Its important to note that the driver only supports half duplex mode, ie only one node on the RS485 bus can transmit at any time. See commits in my fork , the main changes are:
1. The RTS pin is toggled outside of the driver code, ie in the application code therefore data direction and auto direction transceiver are supported.
2. Spurious break characters shouldn't occur in the RX FIFO.
3. Enabling of RS485 interrupts, currently only the collision detection is implemented. Further work is required to correctly handle the framing or parity error interrupts.
The uart_rs485_echo example (under examples/peripherals/) provides a simple demonstration of its use. The example receives data from the UART and echoes the same data back to the sender. After configuring and enabling the UART we can control the RTS pin using the existing uart_set_rts function to control the data direction pin of the transceiver, note this is optional and can be disabled in the code for auto direction transceivers.
The example has been tested with the following boards :
1. SparkFun Transceiver RS485 Breakout board which hosts a SP3485 transceiver.
2. XY-017 RS485 to TTL Module which is an auto direction transceiver with unmarked ICs.
With the XY-017 board, how did you handle the RTS signal between the MAX485 and the ESP32? Did you mod the board?
ReplyDelete