This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: Semantics of cyg_spi_transaction_tick?
- From: Bart Veer <bartv at ecoscentric dot com>
- To: Stanislav Meduna <stano at meduna dot org>
- Cc: ecos-discuss at ecos dot sourceware dot org
- Date: Mon, 22 Jun 2009 14:21:25 +0100
- Subject: Re: [ECOS] Semantics of cyg_spi_transaction_tick?
- References: <4A3E1C9A.2060100@meduna.org>
>>>>> "Stanislav" == Stanislav Meduna <stano@meduna.org> writes:
Stanislav> Hi,
Stanislav> the docs state that
Stanislav> If the device requires additional clock ticks in the
Stanislav> middle of a transaction without being selected,
Stanislav> cyg_spi_transaction_tick can be used. This will drop
Stanislav> the device's chip select if necessary, then generate
Stanislav> the appropriate number of ticks. The arguments are
Stanislav> the same as for cyg_spi_tick.
Stanislav> This does not correspond to what the present SPI
Stanislav> drivers do; they state that they do not touch the chip
Stanislav> select.
I am not sure which existing SPI drivers you are referring to. The
documentation is correct: a tick means clock signals with no device
selected. If a device is currently selected as part of a transaction,
the chip select should be deasserted first. The tick functionality was
incorporated into the API because of MMC cards, where the protocol
requires clock ticks on the SPI bus with no data being transferred.
Stanislav> My problem is that the protocol of the dataflash device
Stanislav> I am using returns a byte specifying the number of
Stanislav> following data, that can be either zero, or can fit in
Stanislav> the specified buffer, or the user supplied a buffer of
Stanislav> insufficient length.
Stanislav> So I read the number of the present data with
Stanislav> cyg_spi_transaction_transfer(..., false);
Stanislav> and now I can have three cases
Stanislav> - no further data. I am done and need to simply
Stanislav> deassert the CS.
Stanislav> - additional data and I have place for them - I just read
Stanislav> them using
Stanislav> cyg_spi_transaction_transfer(..., true);
Stanislav> - insufficient buffer - I should tick the device to
Stanislav> throw the data away, deselect and return error to the
Stanislav> caller.
Stanislav> From what I read in the code I can throw the unused
Stanislav> data using cyg_spi_transaction_tick (which does not
Stanislav> touch the CS) and rely on cyg_spi_transaction_end to
Stanislav> deassert the CS; however, this does not correspond with
Stanislav> the documentation. Can I rely on what the code does, or
Stanislav> is it possible that another SPI driver implements it
Stanislav> another way?
In theory the correct way to handle this is to use
cyg_spi_transaction_transfer() with NULL arguments for both RX and TX
buffers. In other words you transfer data to/from the current data
device, but you do not care what data gets sent to the device and any
data coming from the device should be discarded. I do not know if all
current drivers handle this correctly.
Bart
--
Bart Veer eCos Configuration Architect
eCosCentric Limited The eCos experts http://www.ecoscentric.com/
Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571
Registered in England and Wales: Reg No 4422071.
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss