From e61d6bac170412a74ac2acde79b62106604bb32b Mon Sep 17 00:00:00 2001 From: ladyada Date: Sat, 18 May 2019 19:20:13 -0400 Subject: [PATCH] yikes everyone has a differnet way of doing SPI bit order --- Adafruit_SPIDevice.cpp | 8 +++---- Adafruit_SPIDevice.h | 22 +++++++++++++------ examples/spi_modetest/spi_modetest.ino | 29 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 examples/spi_modetest/spi_modetest.ino diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index be01761..1d599bb 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -7,7 +7,7 @@ * @brief Create an SPI device with the given CS pin and settins * @param cspin The arduino pin number to use for chip select * @param freq The SPI clock frequency to use, defaults to 1MHz - * @param dataOrder The SPI data order to use for bits within each byte, defaults to SPI_MSBFIRST + * @param dataOrder The SPI data order to use for bits within each byte, defaults to SPI_BITORDER_MSBFIRST * @param dataMode The SPI mode to use, defaults to SPI_MODE0 * @param theSPI The SPI bus to use, defaults to &theSPI */ @@ -29,7 +29,7 @@ Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, uint32_t freq, BitOrder dat * @param misopin The arduino pin number to use for MISO, set to -1 if not used * @param mosipin The arduino pin number to use for MOSI, set to -1 if not used * @param freq The SPI clock frequency to use, defaults to 1MHz - * @param dataOrder The SPI data order to use for bits within each byte, defaults to SPI_MSBFIRST + * @param dataOrder The SPI data order to use for bits within each byte, defaults to SPI_BITORDER_MSBFIRST * @param dataMode The SPI mode to use, defaults to SPI_MODE0 */ Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, int8_t sckpin, int8_t misopin, int8_t mosipin, @@ -97,7 +97,7 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { uint8_t reply = 0; uint8_t send = buffer[i]; - if (_dataOrder == LSBFIRST) { + if (_dataOrder == SPI_BITORDER_LSBFIRST) { // LSB is rare, if it happens we'll just flip the bits around for them uint8_t temp = 0; for (uint8_t b=0; b<8; b++) { @@ -125,7 +125,7 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { } } - if (_dataOrder == LSBFIRST) { + if (_dataOrder == SPI_BITORDER_LSBFIRST) { // LSB is rare, if it happens we'll just flip the bits around for them uint8_t temp = 0; for (uint8_t b=0; b<8; b++) { diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 45dad8a..939efe6 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -3,14 +3,24 @@ #ifndef Adafruit_SPIDevice_h #define Adafruit_SPIDevice_h -#if defined(__AVR__) || defined(ESP32) || defined(ESP8266) // modern SPI definitions have a BitOrder enum +#if defined(__AVR__) || defined(ESP8266) // some modern SPI definitions don't have BitOrder enum typedef enum _BitOrder { - SPI_MSBFIRST = MSBFIRST, - SPI_LSBFIRST = LSBFIRST, + SPI_BITORDER_MSBFIRST = MSBFIRST, + SPI_BITORDER_LSBFIRST = LSBFIRST, } BitOrder; #endif + #if defined(ESP32) - #define MSBFIRST SPI_MSBFIRST +typedef enum _BitOrder { + SPI_BITORDER_MSBFIRST = SPI_MSBFIRST, + SPI_BITORDER_LSBFIRST = SPI_LSBFIRST, +} BitOrder; +#endif + +// Some platforms have a BitOrder enum but its named MSBFIRST/LSBFIRST +#if defined(ARDUINO_ARCH_SAMD) + #define SPI_BITORDER_MSBFIRST MSBFIRST + #define SPI_BITORDER_LSBFIRST LSBFIRST #endif ///< The class which defines how we will talk to this device over SPI @@ -18,13 +28,13 @@ class Adafruit_SPIDevice { public: Adafruit_SPIDevice(int8_t cspin, uint32_t freq=1000000, - BitOrder dataOrder=SPI_MSBFIRST, + BitOrder dataOrder=SPI_BITORDER_MSBFIRST, uint8_t dataMode=SPI_MODE0, SPIClass *theSPI=&SPI); Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi, uint32_t freq=1000000, - BitOrder dataOrder=SPI_MSBFIRST, + BitOrder dataOrder=SPI_BITORDER_MSBFIRST, uint8_t dataMode=SPI_MODE0); bool begin(void); diff --git a/examples/spi_modetest/spi_modetest.ino b/examples/spi_modetest/spi_modetest.ino new file mode 100644 index 0000000..10168c5 --- /dev/null +++ b/examples/spi_modetest/spi_modetest.ino @@ -0,0 +1,29 @@ +#include + +#define SPIDEVICE_CS 10 +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS, 100000, SPI_BITORDER_MSBFIRST, SPI_MODE1); +//Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS, 13, 12, 11, 100000, SPI_BITORDER_MSBFIRST, SPI_MODE1); + + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("SPI device mode test"); + + if (!spi_dev.begin()) { + Serial.println("Could not initialize SPI device"); + while (1); + } +} + +void loop() { + Serial.println("\n\nTransfer test"); + for (uint16_t x=0; x<=0xFF; x++) { + uint8_t i = x; + Serial.print("0x"); Serial.print(i, HEX); + spi_dev.read(&i, 1, i); + Serial.print("/"); Serial.print(i, HEX); + Serial.print(", "); + delay(25); + } +} \ No newline at end of file