This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: Half Duplex RS485
On 2008-01-22, Laurie Gellatly <laurie.gellatly@netic.com> wrote:
> My project has RS485 half duplex driven by UART0 of an
> LPC2112. At present I've modified pc_serial_start_xmit and
> pc_serial_stop_xmit to change a pin state so that the same
> wires can be used for transmit and receive.
>
> This does not see to work when the FIFO is enabled.
Then you probably did it wrong. :)
I imagine that RTS is shutting off too soon. The problem is
that pc_serial_stop_xmit() is called when the driver has no
more data to send _to_ the UART. That's not when you need to
shut off RTS. You need to shut off RTS when the UART is done
sending data and both the FIFO and shift register are empty.
You're probably shutting off RTS while the UART still has data
in the tx FIFO and the tx shift register.
> Has anyone else done RS485 half duplex?
Many, many times.
> Did you modify these routines or write your own?
I usually pick a UART that supports half-duplex operation, and
then just enabled that feature in the UART. [I use a custom
eCos serial driver that supports quite a few more advanced UART
features than the standard driver (e.g. flow control,
half-duplex, inter-byte timeouts, 9-bit modes, FIFO control,
etc.).
If you don't have a proper UART, you need to enable the tx
shift register empty interrupt and use that to trigger code
that de-asserts RTS. If you're using a broken UART that
doesn't have a tx shift register empty interrupt, then you'll
have to poll for the tx shift register empty status. If you're
using a really broken UART that doesn't have a _working_
shift-register empty status[1], then you may have to start a
timer that will wake you up at the point in time where RTS
needs to be changed.
> Did you get the FIFO to work?
When there was one, yes.
[1] There are broken UARTs (including a few PC chipsets) whose
shift-register empty bit gets set _before_ the stop bit has
been sent. In that case, you may need to use some sort of
time-delay to wait until after the stop bit has been sent
to toggle RTS. On a properly implimented RS-485 bus, there
should be pull-up and pull-down resisters so that the bus
idles in the mark state (same value as a stop bit), but to
be on the safe side you should leave the bus driver on
until after the stop bit has been sent.
--
Grant Edwards grante Yow! I'm also against
at BODY-SURFING!!
visi.com
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss