[En-Nut-Discussion] GPIO on the ethernut board 3.1
uprinz2 at netscape.net
Fri May 7 19:18:06 CEST 2010
Am 07.05.2010 02:23, schrieb Eric Haver:
> Hello List,
> You can go without double access, on the AT91SAM7 anyway: From the
> detailed manual:
> 27.4.5 Synchronous Data Output
>>> Controlling all parallel busses using several PIOs requires two
>>> successive write operations in the PIO_SODR and PIO_CODR
>>> registers. This may lead to unexpected transient values. The PIO
>>> controller offers a direct control of PIO outputs by single write
>>> access to PIO_ODSR (Output Data Status Register). Only bits
>>> unmasked by PIO_OWSR (Output Write Status Register) are written.
>>> The mask bits in the PIO_OWSR are set by writing to PIO_OWER
>>> (Output Write Enable Register) and cleared by writing to PIO_OWDR
>>> (Output Write Disable Register). After reset, the synchronous
>>> data output is disabled on all the I/O lines as PIO_OWSR resets
>>> at 0x0.
Thank you for the hint, that was new to me too.
But the discussion started cause of the time needed for doing 2 cycles.
In this case the time needed is only shiftet.
For every access you need to do a setup of the pins to write and another
cycle for writing the pins again. This is especially needed if you have
connected several periphals to one GPIO port. So for the mentioned
display this means:
Set PIO_OWSR to data-bit-mask
Set PIO_ODSR to data-bits
This respect to the LCD driver it doesn't make sense to discuss if an
access needs 2 cycles or 4, as doing it with less cycles only results in
a longer wait loop afterwards.
With the GPIO connected display it is also no problem to have the above
mentioned spikes as the data is fetched from the display on Enable
signal, what is done in a separate cycle after setting up all data GPIOs.
There is only one condition in that you can use the above trick. If
you're using the databus for one or more periphals in exactly the same
way it may work, but this will result in lots of problems if you like to
keep Nut/OS flexible.
I thought about speed optimization of the driver too by bundling Enable
and databus, as you can set them together, but then release Enable
first. But the #if #else #endif orgy was far to large. Without the
conditions we would have lost the option to have Enable, RS and R/W on
On the other hand, for fast periphals it is interesting to know the
above trick, here one could argue that speed is needed.
Best regards, Ulrich
More information about the En-Nut-Discussion