diff --git a/Adafruit_BusIO_Register.cpp b/Adafruit_BusIO_Register.cpp index 0be1387..c042cda 100644 --- a/Adafruit_BusIO_Register.cpp +++ b/Adafruit_BusIO_Register.cpp @@ -1,6 +1,7 @@ #include -Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, uint16_t reg_addr, uint8_t width, uint8_t bitorder, uint8_t address_width) { +Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, uint16_t reg_addr, + uint8_t width, uint8_t bitorder, uint8_t address_width) { _i2cdevice = i2cdevice; _spidevice = NULL; _addrwidth = address_width; @@ -9,23 +10,32 @@ Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, _width = width; } -/* -Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, uint16_t reg_addr, uint8_t width, uint8_t bitorder, uint8_t address_width) { +Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, uint16_t reg_addr, + Adafruit_BusIO_SPIRegType type, + uint8_t width, uint8_t bitorder, uint8_t address_width) { _spidevice = spidevice; + _spiregtype = type; _i2cdevice = NULL; _addrwidth = address_width; _address = reg_addr; _bitorder = bitorder; _width = width; } -*/ bool Adafruit_BusIO_Register::write(uint8_t *buffer, uint8_t len) { + uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), (uint8_t)(_address>>8)}; - if (_i2cdevice && ! _i2cdevice->write(buffer, len, true, addrbuffer, _addrwidth)) { - return false; + + if (_i2cdevice) { + return _i2cdevice->write(buffer, len, true, addrbuffer, _addrwidth); } - return true; + if (_spidevice) { + if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { + addrbuffer[0] &= ~0x80; + } + return _spidevice->write( buffer, len, addrbuffer, _addrwidth); + } + return false; } bool Adafruit_BusIO_Register::write(uint32_t value, uint8_t numbytes) { @@ -69,11 +79,18 @@ uint32_t Adafruit_BusIO_Register::read(void) { bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) { - _buffer[0] = _address; - if (_i2cdevice && ! _i2cdevice->write_then_read(_buffer, 1, buffer, len)) { - return false; + uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), (uint8_t)(_address>>8)}; + + if (_i2cdevice) { + return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len); } - return true; + if (_spidevice) { + if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { + addrbuffer[0] |= 0x80; + } + return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len); + } + return false; } bool Adafruit_BusIO_Register::read(uint16_t *value) { diff --git a/Adafruit_BusIO_Register.h b/Adafruit_BusIO_Register.h index 84e2d5b..3255e7b 100644 --- a/Adafruit_BusIO_Register.h +++ b/Adafruit_BusIO_Register.h @@ -6,13 +6,19 @@ #ifndef Adafruit_BusIO_Register_h #define Adafruit_BusIO_Register_h +typedef enum _Adafruit_BusIO_SPIRegType { + ADDRBIT8_HIGH_TOREAD = 0, +} Adafruit_BusIO_SPIRegType; class Adafruit_BusIO_Register { public: Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, uint16_t reg_addr, - uint8_t width=1, uint8_t bitorder=LSBFIRST, - uint8_t address_width=1); - + uint8_t width=1, uint8_t bitorder=LSBFIRST, + uint8_t address_width=1); + Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, uint16_t reg_addr, + Adafruit_BusIO_SPIRegType type, + uint8_t width=1, uint8_t bitorder=LSBFIRST, + uint8_t address_width=1); bool read(uint8_t *buffer, uint8_t len); bool read(uint8_t *value); bool read(uint16_t *value); @@ -29,6 +35,7 @@ class Adafruit_BusIO_Register { private: Adafruit_I2CDevice *_i2cdevice; Adafruit_SPIDevice *_spidevice; + Adafruit_BusIO_SPIRegType _spiregtype; uint16_t _address; uint8_t _width, _addrwidth, _bitorder; uint8_t _buffer[4]; // we wont support anything larger than uint32 for non-buffered read diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index fc4819e..16572b4 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -1,7 +1,7 @@ #include #include -//#define DEBUG_SERIAL Serial +#define DEBUG_SERIAL Serial Adafruit_SPIDevice::Adafruit_SPIDevice(int8_t cspin, uint32_t freq, BitOrder dataOrder, uint8_t dataMode, SPIClass *theSPI) { _cs = cspin; @@ -19,8 +19,38 @@ bool Adafruit_SPIDevice::begin(void) { } bool Adafruit_SPIDevice::write(uint8_t *buffer, size_t len, uint8_t *prefix_buffer, size_t prefix_len) { + _spi->beginTransaction(*_spiSetting); + digitalWrite(_cs, LOW); + // do the writing + for (int i=0; itransfer(prefix_buffer[i]); + } + for (int i=0; itransfer(buffer[i]); + } + digitalWrite(_cs, HIGH); + _spi->endTransaction(); +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Wrote: ")); + if ((prefix_len != 0) && (prefix_buffer != NULL)) { + for (uint16_t i=0; iendTransaction(); +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Read: ")); + for (uint16_t i=0; itransfer(write_buffer[i]); } + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Wrote: ")); + for (uint16_t i=0; itransfer(sendvalue); } + +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("\tSPIDevice Read: ")); + for (uint16_t i=0; iendTransaction(); diff --git a/examples/spi_registers/spi_registers.ino b/examples/spi_registers/spi_registers.ino new file mode 100644 index 0000000..e24f1aa --- /dev/null +++ b/examples/spi_registers/spi_registers.ino @@ -0,0 +1,34 @@ +#include +#include + +#define SPIDEVICE_CS 10 +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS); + +void setup() { + while (!Serial) { delay(10); } + Serial.begin(115200); + Serial.println("SPI device register test"); + + if (!spi_dev.begin()) { + Serial.println("Could not initialize SPI device"); + while (1); + } + + Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&spi_dev, 0x0F, ADDRBIT8_HIGH_TOREAD); + uint8_t id; + id_reg.read(&id); + Serial.print("ID register = 0x"); Serial.println(id, HEX); + + Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register(&spi_dev, 0x0C, ADDRBIT8_HIGH_TOREAD, 2, LSBFIRST); + uint16_t thresh; + thresh_reg.read(&thresh); + Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX); + + thresh_reg.write(~thresh); + + Serial.print("Post threshold register = 0x"); Serial.println(thresh_reg.read(), HEX); +} + +void loop() { + +} \ No newline at end of file