Class to be able to send SPI data with almost no overhead, useful at very high speeds.

Dependents:   MakerBotServer epaper_mbed_130411_KL25Z epaper_mbed_test epaper_mbed_test_copy1 ... more

General

BurstSPI sends SPI data without reading it back, allowing higher speeds than the regular SPI library. This is mainly useful at high frequencies and large payloads. With a small number of bytes the setting up and finishing time will remove any advantage.

The three new functions compared to regular SPI are: fastWrite, setFormat and clearRX.

fastWrite is the function to quickly write data. setFormat is only required if the SPI format might have changed, or the first time you fastWrite something and you haven't used a regular SPI write before. clearRX is required if you also want to be able read from the SPI peripheral later on.

//Send 1000 SPI packets as fast as possible
spi.setFormat();
for (int i = 0; i<1000; i++)
    spi.fastWrite(data[i]);
spi.clearRX();

Supported targets

  • KL25Z, KL46Z
  • LPC1768, LPC11u24, LPC1114, LPC1549, LPC1347
  • STML152RE

If a target is not supported the library will issue a warning, and use regular writes. This means if you for example use this library to speed up writing to an LCD display, your LCD display library will work on all targets, and if possible BurstSPI will speed up the process.

Committer:
Sissors
Date:
Thu Jul 04 19:03:58 2013 +0000
Revision:
3:7d9b64d67b22
Refactored code, added version 1 of KL25Z support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 3:7d9b64d67b22 1 #ifdef TARGET_KL25Z
Sissors 3:7d9b64d67b22 2 #include "BurstSPI.h"
Sissors 3:7d9b64d67b22 3
Sissors 3:7d9b64d67b22 4 void BurstSPI::fastWrite(int data) {
Sissors 3:7d9b64d67b22 5 //Wait until FIFO has space
Sissors 3:7d9b64d67b22 6 while(((_spi.spi->S) & SPI_S_SPTEF_MASK) == 0);
Sissors 3:7d9b64d67b22 7 //transmit data
Sissors 3:7d9b64d67b22 8 _spi.spi->D = data;
Sissors 3:7d9b64d67b22 9 }
Sissors 3:7d9b64d67b22 10
Sissors 3:7d9b64d67b22 11 void BurstSPI::clearRX( void ) {
Sissors 3:7d9b64d67b22 12 //We put in a delay here, this function shouldn't be called very often, so not a huge problem
Sissors 3:7d9b64d67b22 13 //Without delay you will rise the CS line before it is finished (been there, done that)
Sissors 3:7d9b64d67b22 14 //We use time required to transmit 20 bits (8 bits being transmitted, 8 bits in FIFO, 4 bits safety margin
Sissors 3:7d9b64d67b22 15
Sissors 3:7d9b64d67b22 16 float bytetime = 20.0/_hz;
Sissors 3:7d9b64d67b22 17 wait(bytetime);
Sissors 3:7d9b64d67b22 18
Sissors 3:7d9b64d67b22 19 //Wait until status is flagged that we can read, read:
Sissors 3:7d9b64d67b22 20 while (_spi.spi->S & SPI_S_SPRF_MASK == 0);
Sissors 3:7d9b64d67b22 21 int dummy = _spi.spi->D;
Sissors 3:7d9b64d67b22 22
Sissors 3:7d9b64d67b22 23 }
Sissors 3:7d9b64d67b22 24 #endif