24-bit SPI?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From English to

Threaded View
Hi,

Anyone knows an ARM controller with a 24-bit data lenght SPI bus? Several
devices like 24-bit ADC's has a SPI bus with 24-bit lenght but I havn't seen
any ARM controllers taht support that.

Thanks,
orc



Re: 24-bit SPI?

Quoted text here. Click to load it

The usual method is to send three 8-bit transfers after each other,
holding the chip select low during the transfer.  Some SPI controllers
(don't know about ARM chips) can do this automatically, but it's still
just a series of standard 8-bit transfers.


Re: 24-bit SPI?
Quoted text here. Click to load it

Thanks. Most ARM controllers has both 8 and 16 bit SPI lenght because of
efficiency (16 bit) (which is needed in my application) so that the
controllers hasn't to put the three 8 bits together in a long var. manually
(rotating and OR-ring). An alternativ question: is there somehow a better
way to join the fractions into a 32 bit long (e.g. is the DMA controller
able to transfer the data from the SPI and access the memory in 8 bit
portions)?

Any help is highly appreciated.



Re: 24-bit SPI?

Quoted text here. Click to load it

I don't remember whether the ARM is big-endian or little-endian, but a
common way to merge bytes into a long is to use a union :
    typedef union {
        struct { unsigned char lolo, lohi, hilo, hihi; } bytes;
        unsigned long longword;
    } merger;

Anyway, if your application can't afford the time taken to calculate
"(hilo << 16) | (lohi << 8) | lolo" after reading the data, then you
really need to think about what you are trying to do here, and whether you
are going about it the right way.




Re: 24-bit SPI?
Quoted text here. Click to load it

Both. It's switchable.

-p
--
Paul Gotch
CoreSight Tools
We've slightly trimmed the long signature. Click to see the full one.
Re: 24-bit SPI?

Quoted text here. Click to load it
manually
better

If you have an exceptionally large number of components communicating via
SPI with abnormally high data rates, I could see where <<16 and <<8 could be
a performance penalty.  This is an embedded newsgroup; I would bet a good
number of people here are examining their resulting assembly code and
getting the most out of every cycle.

 -R



Re: 24-bit SPI?

Quoted text here. Click to load it

I know this is an embedded newsgroup, and I know all about examining
assembly code and counting cycles, and when it is a useful tool and when
it is not.  If it becomes essential to count the cpu cycles when
transferring SPI bytes, even at the highest SPI rates (20 MHz?), at this
stage of the design (i.e., trying to guess which chip to use), then it is
time to look closely at the design and the requirements, because you are
doing something badly wrong.


Re: 24-bit SPI?

Quoted text here. Click to load it

The problem is not the SPI but the other thing that the CPU has to do. My
application are doing a closed lock loop in and out of the SPI from an ADC
to an DAC and are doing calculations and data transfer to a PC between every
sample - that's why every clock cycle used by the SPI, rotating bits etc is
a wast of good CPU power. With a 24 bit interface everything would be nice
because it would work by itself - setting a Int flag after each samle and
not after each byte. Hope this clarified my concerns better - and again -
thanking you for your input!

Best regards
orc



Re: 24-bit SPI?

Quoted text here. Click to load it

So if you can't afford the time overhead, why use SPI in the first
place?  And even if you're going to use SPI, why do it on the main
CPU, rather than having a separate transceiver take care of it?  Or
even a dedicated micro?

--
Hans-Bernhard Broeker ( snipped-for-privacy@physik.rwth-aachen.de)
Even if all the snow were burnt, ashes would remain.

Re: 24-bit SPI?
I would think a Atmel SAM7 with DMA SPI would be sufficient for your
application, still have to perform shifts, but the DMA should relieve
the CPU from most of the overhead. What is your data rates, how many
spi devices? Usually optimal hardware doesn't exist for most projects,
you have to use what available, every project I worked on usually
involved using hardware that wasn't exactly what I wanted, but was good
enough.


Re: 24-bit SPI?
Quoted text here. Click to load it

Thanks.
I'm sampling at a rate of 8 ks/s (two 24 bit ADC and one 16 bit DAC). The
data to the PC goes via the serial port (4 bytes at at each samlple). One
ADC and the DAC is part of a control loop, so I'll have to do some math to
calculate the next DAC value between each sample. By the way: is it possible
to use the PWM output to form a digital DAC that correspond to 16 bit at
8ks/s? (This way I could put a power stage on the PWM output and form a
puredigital amplifier) - the DAC actually controls a power amp that powers a
shaker/speaker.

Thanks,
orc



Re: 24-bit SPI?
Hmm, if your data rates were a little slower (1Khz) you could use an
integrated analog microconverter solution like

http://focus.ti.com/docs/prod/folders/print/msc1211y2.html?DCMP=hpa_dc_general&HQS=NotApplicable+OT+sc03084#features

no spi rate to worry about, all parallel paths to the onboard 24 bit
A/D and 16 bit DACs.


Re: 24-bit SPI?
Sorry - didn't make myself clear - it's not the 16 bit I need - it's the
efficiency. There will be no time to switch from 16 bit mode to 8 bit mode,
so I'll use the 8 bit mode only.
Ryan is right - we embedded people needs all the power that is available and
often we are counting the clocks - but I guees that you David is also an
embedded one :-)  - thank you very much for your input!

still like to hear your ideas or a responce to the DMA thing.

Best regards
orc



Re: 24-bit SPI?
Quoted text here. Click to load it
While I've done most of my ARM programming in C,  I understand that the
ARM 7TDMI instruction set allows multiple-bit shifts to be combined
with arithmetic and logical operations in a single-cycle instruction.
Thus, there should be little or no overhead for the shift operation.
You would still have to use a few instructions to combine the data
elements, though.   However, 3 bytes on a 20MHz SPI bus is still
more than a microsecond----time for quite a few instructions on
a 66MHZ ARM with fast memory.

Another thing to consider is that many SPI devices will transfer
zeros after they are finished with their  24 bits of valid data.
You could simply add another null transfer to your 3-byte
SPI transfer and have nicely aligned long words in memory.

My own worst case was an ADC that required 18 SPI clocks to
transfer 16 bits of valid data.  Now THAT required a bit
of ingenuity!

Mark Borgerson



Site Timeline