From 42e31a252f3cfd81aaa5668258d3dcb837524660 Mon Sep 17 00:00:00 2001 From: dherrada Date: Fri, 12 May 2023 11:23:57 -0400 Subject: [PATCH 01/43] Update CI action versions --- .github/workflows/githubci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/githubci.yml b/.github/workflows/githubci.yml index 7faea57..8a57d75 100644 --- a/.github/workflows/githubci.yml +++ b/.github/workflows/githubci.yml @@ -7,11 +7,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v4 with: python-version: '3.x' - - uses: actions/checkout@v2 - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 with: repository: adafruit/ci-arduino path: ci From 7fd30d0bf87e75ac9117d290a8d9ee77787c7335 Mon Sep 17 00:00:00 2001 From: DeflateAwning <11021263+DeflateAwning@users.noreply.github.com> Date: Wed, 21 Jun 2023 23:25:44 -0600 Subject: [PATCH 02/43] Add explicit type casting to fix build error --- Adafruit_SPIDevice.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index 6f0069b..b61142a 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -349,10 +349,10 @@ bool Adafruit_SPIDevice::write(const uint8_t *buffer, size_t len, #if defined(ARDUINO_ARCH_ESP32) if (_spi) { if (prefix_len > 0) { - _spi->transferBytes(prefix_buffer, nullptr, prefix_len); + _spi->transferBytes((uint8_t *)prefix_buffer, nullptr, prefix_len); } if (len > 0) { - _spi->transferBytes(buffer, nullptr, len); + _spi->transferBytes((uint8_t *)buffer, nullptr, len); } } else #endif @@ -443,7 +443,7 @@ bool Adafruit_SPIDevice::write_then_read(const uint8_t *write_buffer, #if defined(ARDUINO_ARCH_ESP32) if (_spi) { if (write_len > 0) { - _spi->transferBytes(write_buffer, nullptr, write_len); + _spi->transferBytes((uint8_t *)write_buffer, nullptr, write_len); } } else #endif From 3ea940b7453bd66582ba0d6da8f8f3ea94194046 Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 15 Aug 2023 12:03:13 +0100 Subject: [PATCH 03/43] Update library.properties - bump version to 1.14.3 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index f0ef63f..08a2588 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.14.1 +version=1.14.3 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away UART, I2C and SPI interfacing From 8097aa568fa93b198d67994a7b10e02703e8f975 Mon Sep 17 00:00:00 2001 From: "Filies Olaf (IFAG DES TOC PSA)" Date: Mon, 11 Sep 2023 16:50:03 +0200 Subject: [PATCH 04/43] By adding two macros all Infineons XMC MCUs are now able to use the library --- Adafruit_SPIDevice.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 7a6c0f5..9335c85 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -22,7 +22,8 @@ typedef uint8_t SPIClass; defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \ defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \ defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \ - defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) + defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) \ + defined(ARDUINO_ARCH_XMC) typedef enum _BitOrder { SPI_BITORDER_MSBFIRST = MSBFIRST, @@ -57,6 +58,9 @@ typedef BitOrder BusIOBitOrder; // typedef uint32_t BusIO_PortMask; //#define BUSIO_USE_FAST_PINIO +#elif defined(ARDUINO_ARCH_XMC) +#undef BUSIO_USE_FAST_PINIO + #elif defined(__AVR__) || defined(TEENSYDUINO) typedef volatile uint8_t BusIO_PortReg; typedef uint8_t BusIO_PortMask; From 5162b240d7ba2d58ca2e61257de0af3b00d6ae43 Mon Sep 17 00:00:00 2001 From: "Filies Olaf (IFAG DES TOC PSA)" Date: Mon, 11 Sep 2023 17:21:18 +0200 Subject: [PATCH 05/43] Forgot the || inthe macro list --- Adafruit_SPIDevice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 9335c85..74123b9 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -22,7 +22,7 @@ typedef uint8_t SPIClass; defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \ defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \ defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \ - defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) \ + defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) || \ defined(ARDUINO_ARCH_XMC) typedef enum _BitOrder { From 1b7f5a95905c5ff580c77dd745279d5b45d0ab88 Mon Sep 17 00:00:00 2001 From: Luke Lowrey Date: Sat, 16 Sep 2023 00:30:41 +0100 Subject: [PATCH 06/43] Remove offensive term in comments Tidying up the language used - https://dictionary.cambridge.org/dictionary/english/spaz https://en.wiktionary.org/wiki/spaz --- Adafruit_I2CDevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 9b518b4..059ddfb 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -23,8 +23,8 @@ Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) { /*! * @brief Initializes and does basic address detection * @param addr_detect Whether we should attempt to detect the I2C address - * with a scan. 99% of sensors/devices don't mind but once in a while, they spaz - * on a scan! + * with a scan. 99% of sensors/devices don't mind, but once in a while they don't + * respond well to a scan! * @return True if I2C initialized and a device with the addr found */ bool Adafruit_I2CDevice::begin(bool addr_detect) { From 9108618560a57a4cf8113231b713293028f10d29 Mon Sep 17 00:00:00 2001 From: Luke Lowrey Date: Sat, 16 Sep 2023 00:59:38 +0100 Subject: [PATCH 07/43] Fix line length --- Adafruit_I2CDevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 059ddfb..57eb551 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -23,8 +23,8 @@ Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) { /*! * @brief Initializes and does basic address detection * @param addr_detect Whether we should attempt to detect the I2C address - * with a scan. 99% of sensors/devices don't mind, but once in a while they don't - * respond well to a scan! + * with a scan. 99% of sensors/devices don't mind, but once in a while they + * don't respond well to a scan! * @return True if I2C initialized and a device with the addr found */ bool Adafruit_I2CDevice::begin(bool addr_detect) { From ee0faec7ee8b34373772184d04864f04bcf56730 Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 19 Sep 2023 11:39:09 +0100 Subject: [PATCH 08/43] Update library.properties - bump version to 1.14.4 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 08a2588..854fbf5 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.14.3 +version=1.14.4 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away UART, I2C and SPI interfacing From fbba4799ad73445a0902f708be9d0d6b807d97f4 Mon Sep 17 00:00:00 2001 From: ladyada Date: Mon, 25 Sep 2023 00:53:07 -0400 Subject: [PATCH 09/43] more specific debug during scan --- Adafruit_I2CDevice.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 9b518b4..8c25441 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -67,14 +67,18 @@ bool Adafruit_I2CDevice::detected(void) { // A basic scanner, see if it ACK's _wire->beginTransmission(_addr); +#ifdef DEBUG_SERIAL + DEBUG_SERIAL.print(F("Address 0x")); + DEBUG_SERIAL.print(_addr); +#endif if (_wire->endTransmission() == 0) { #ifdef DEBUG_SERIAL - DEBUG_SERIAL.println(F("Detected")); + DEBUG_SERIAL.println(F(" Detected")); #endif return true; } #ifdef DEBUG_SERIAL - DEBUG_SERIAL.println(F("Not detected")); + DEBUG_SERIAL.println(F(" Not detected")); #endif return false; } From a9498c8f62edb78e3507bdfdeaaf1ca801ceddbe Mon Sep 17 00:00:00 2001 From: ladyada Date: Mon, 9 Oct 2023 12:13:50 -0400 Subject: [PATCH 10/43] kick! --- library.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library.properties b/library.properties index 854fbf5..3227709 100644 --- a/library.properties +++ b/library.properties @@ -2,8 +2,8 @@ name=Adafruit BusIO version=1.14.4 author=Adafruit maintainer=Adafruit -sentence=This is a library for abstracting away UART, I2C and SPI interfacing -paragraph=This is a library for abstracting away UART, I2C and SPI interfacing +sentence=This is a library for abstracting away I2C and SPI interfacing +paragraph=This is a library for abstracting away I2C and SPI interfacing category=Signal Input/Output url=https://github.com/adafruit/Adafruit_BusIO -architectures=* +architectures=* \ No newline at end of file From 4d276155d7ec73de6445c2f2955dbe49bcad7f88 Mon Sep 17 00:00:00 2001 From: ladyada Date: Mon, 9 Oct 2023 12:15:35 -0400 Subject: [PATCH 11/43] klzng --- Adafruit_I2CDevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 5b7bd60..92c1731 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -68,8 +68,8 @@ bool Adafruit_I2CDevice::detected(void) { // A basic scanner, see if it ACK's _wire->beginTransmission(_addr); #ifdef DEBUG_SERIAL - DEBUG_SERIAL.print(F("Address 0x")); - DEBUG_SERIAL.print(_addr); + DEBUG_SERIAL.print(F("Address 0x")); + DEBUG_SERIAL.print(_addr); #endif if (_wire->endTransmission() == 0) { #ifdef DEBUG_SERIAL From 2708c120c6f80409775098b92ef02440ef5a1c4c Mon Sep 17 00:00:00 2001 From: caternuson Date: Mon, 9 Oct 2023 13:52:00 -0700 Subject: [PATCH 12/43] remove volatile compound assignments --- Adafruit_SPIDevice.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index b61142a..034dc08 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -183,9 +183,9 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { if ((_mosi != -1) && (lastmosi != towrite)) { #ifdef BUSIO_USE_FAST_PINIO if (towrite) - *mosiPort |= mosiPinMask; + *mosiPort = *mosiPort | mosiPinMask; else - *mosiPort &= ~mosiPinMask; + *mosiPort = *mosiPort & ~mosiPinMask; #else digitalWrite(_mosi, towrite); #endif @@ -193,7 +193,7 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { } #ifdef BUSIO_USE_FAST_PINIO - *clkPort |= clkPinMask; // Clock high + *clkPort = *clkPort | clkPinMask; // Clock high #else digitalWrite(_sck, HIGH); #endif @@ -213,14 +213,14 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { } #ifdef BUSIO_USE_FAST_PINIO - *clkPort &= ~clkPinMask; // Clock low + *clkPort = *clkPort & ~clkPinMask; // Clock low #else digitalWrite(_sck, LOW); #endif } else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3) #ifdef BUSIO_USE_FAST_PINIO - *clkPort |= clkPinMask; // Clock high + *clkPort = *clkPort | clkPinMask; // Clock high #else digitalWrite(_sck, HIGH); #endif @@ -232,16 +232,16 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { if (_mosi != -1) { #ifdef BUSIO_USE_FAST_PINIO if (send & b) - *mosiPort |= mosiPinMask; + *mosiPort = *mosiPort | mosiPinMask; else - *mosiPort &= ~mosiPinMask; + *mosiPort = *mosiPort & ~mosiPinMask; #else digitalWrite(_mosi, send & b); #endif } #ifdef BUSIO_USE_FAST_PINIO - *clkPort &= ~clkPinMask; // Clock low + *clkPort = *clkPort & ~clkPinMask; // Clock low #else digitalWrite(_sck, LOW); #endif From 9ebca64d828410356d1f5d23a65219fd66abacdd Mon Sep 17 00:00:00 2001 From: Carter Nelson Date: Tue, 10 Oct 2023 09:30:15 -0700 Subject: [PATCH 13/43] Update library.properties --- library.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 3227709..ba652bb 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=Adafruit BusIO -version=1.14.4 +version=1.14.5 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away I2C and SPI interfacing paragraph=This is a library for abstracting away I2C and SPI interfacing category=Signal Input/Output url=https://github.com/adafruit/Adafruit_BusIO -architectures=* \ No newline at end of file +architectures=* From 16e4726718e5015de7bddadd26dfc9e72579a7c6 Mon Sep 17 00:00:00 2001 From: Tamas Jozsi Date: Fri, 5 Jan 2024 17:08:23 +0100 Subject: [PATCH 14/43] Add compatibility with Silicon Labs Arduino boards --- Adafruit_SPIDevice.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 74123b9..498c583 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -23,7 +23,7 @@ typedef uint8_t SPIClass; defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \ defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \ defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) || \ - defined(ARDUINO_ARCH_XMC) + defined(ARDUINO_ARCH_XMC) || defined(ARDUINO_SILABS) typedef enum _BitOrder { SPI_BITORDER_MSBFIRST = MSBFIRST, @@ -73,7 +73,8 @@ typedef uint32_t BusIO_PortMask; #define BUSIO_USE_FAST_PINIO #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ - !defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) + !defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) && \ + !defined(ARDUINO_SILABS) typedef volatile uint32_t BusIO_PortReg; typedef uint32_t BusIO_PortMask; #if !defined(__ASR6501__) && !defined(__ASR6502__) From fc25cd496702d45cf63b86b3b87b870e761a126b Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 16 Jan 2024 19:08:05 +0000 Subject: [PATCH 15/43] Update library.properties - bump version to 1.15.0 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index ba652bb..5a130f9 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.14.5 +version=1.15.0 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away I2C and SPI interfacing From d5aa1a353ec505fc6dc10ac8d672bf8d3a3878f1 Mon Sep 17 00:00:00 2001 From: mecparts <2958269+mecparts@users.noreply.github.com> Date: Sun, 11 Feb 2024 13:28:45 -0700 Subject: [PATCH 16/43] Add compatibility with Arduino R4 boards --- Adafruit_SPIDevice.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 498c583..46624c0 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -74,7 +74,8 @@ typedef uint32_t BusIO_PortMask; #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ !defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) && \ - !defined(ARDUINO_SILABS) + !defined(ARDUINO_SILABS) && \ + !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) typedef volatile uint32_t BusIO_PortReg; typedef uint32_t BusIO_PortMask; #if !defined(__ASR6501__) && !defined(__ASR6502__) From 5f170d8e4ffba5d83d70d5b6f56c08de0f8af260 Mon Sep 17 00:00:00 2001 From: mecparts <2958269+mecparts@users.noreply.github.com> Date: Sun, 11 Feb 2024 14:16:08 -0700 Subject: [PATCH 17/43] Amended code formatting --- Adafruit_SPIDevice.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 46624c0..d327bcb 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -74,8 +74,8 @@ typedef uint32_t BusIO_PortMask; #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ !defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) && \ - !defined(ARDUINO_SILABS) && \ - !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) + !defined(ARDUINO_SILABS) && !defined(ARDUINO_UNOR4_MINIMA) && \ + !defined(ARDUINO_UNOR4_WIFI) typedef volatile uint32_t BusIO_PortReg; typedef uint32_t BusIO_PortMask; #if !defined(__ASR6501__) && !defined(__ASR6502__) From e1aa388418ef4d2a326a58dd62620fb954799ccf Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 16 Apr 2024 18:44:56 +0100 Subject: [PATCH 18/43] Update library.properties - bump version to 1.16.0 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 5a130f9..6e571fb 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.15.0 +version=1.16.0 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away I2C and SPI interfacing From 95e8f814992a9b0078eb45f09b27a2d0a7ac4d5e Mon Sep 17 00:00:00 2001 From: Tamas Jozsi Date: Fri, 5 Apr 2024 15:38:17 +0200 Subject: [PATCH 19/43] Fix compatibility with Silicon Labs boards The Silicon Labs core moved to use ArduinoCore-API which has a native 'BitOrder' definition --- Adafruit_SPIDevice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index d327bcb..1d1f953 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -23,7 +23,7 @@ typedef uint8_t SPIClass; defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \ defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \ defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) || \ - defined(ARDUINO_ARCH_XMC) || defined(ARDUINO_SILABS) + defined(ARDUINO_ARCH_XMC) typedef enum _BitOrder { SPI_BITORDER_MSBFIRST = MSBFIRST, From 15fbda592d1b237b0a92cfb91841adb01a34efd9 Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 21 May 2024 12:15:23 +0100 Subject: [PATCH 20/43] Update library.properties - bump version to 1.16.1 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 6e571fb..06d91e8 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.16.0 +version=1.16.1 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away I2C and SPI interfacing From 18df8eaf8b07422a6de9027bba3866a40619fda5 Mon Sep 17 00:00:00 2001 From: John Boiles Date: Wed, 31 Jul 2024 17:09:25 -0700 Subject: [PATCH 21/43] For ESP-IDF builds use arduino-esp32 instead of arduino dependency --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 880b1aa..ff6496c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,6 @@ cmake_minimum_required(VERSION 3.5) idf_component_register(SRCS "Adafruit_I2CDevice.cpp" "Adafruit_BusIO_Register.cpp" "Adafruit_SPIDevice.cpp" INCLUDE_DIRS "." - REQUIRES arduino) + REQUIRES arduino-esp32) project(Adafruit_BusIO) From 9af8ab9607bbed9b7bf7304df7e2f86aaf1ee695 Mon Sep 17 00:00:00 2001 From: caternuson Date: Thu, 24 Oct 2024 14:25:57 -0700 Subject: [PATCH 22/43] giga i2c hack fix --- Adafruit_I2CDevice.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 92c1731..5ac1d7b 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -70,6 +70,9 @@ bool Adafruit_I2CDevice::detected(void) { #ifdef DEBUG_SERIAL DEBUG_SERIAL.print(F("Address 0x")); DEBUG_SERIAL.print(_addr); +#endif +#ifdef ARDUINO_ARCH_MBED + _wire->write(0); // forces a write request instead of a read #endif if (_wire->endTransmission() == 0) { #ifdef DEBUG_SERIAL From 31148fe857022168869b9fb1942521007f5b14ea Mon Sep 17 00:00:00 2001 From: caternuson Date: Thu, 24 Oct 2024 14:37:54 -0700 Subject: [PATCH 23/43] clangerdified --- Adafruit_I2CDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 5ac1d7b..bf62aa8 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -72,7 +72,7 @@ bool Adafruit_I2CDevice::detected(void) { DEBUG_SERIAL.print(_addr); #endif #ifdef ARDUINO_ARCH_MBED - _wire->write(0); // forces a write request instead of a read + _wire->write(0); // forces a write request instead of a read #endif if (_wire->endTransmission() == 0) { #ifdef DEBUG_SERIAL From ddf66b491e0a9ccb0b6ddd405c2864fecc6fe87f Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 29 Oct 2024 21:57:16 +0000 Subject: [PATCH 24/43] Update library.properties - bump version to 1.16.2 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 06d91e8..b2673fe 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.16.1 +version=1.16.2 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away I2C and SPI interfacing From 9eeac1d1812a7570672dcb2b2183ab70c628ca06 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 13 Dec 2024 15:48:40 +0100 Subject: [PATCH 25/43] Avoid fast pins IO on RTOS based boards Better fix than https://github.com/arduino/ArduinoCore-zephyr/pull/6/commits/80943e663f931f9d11c2c5efa67527996d5d5067 --- Adafruit_SPIDevice.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 1d1f953..54b967b 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -58,6 +58,11 @@ typedef BitOrder BusIOBitOrder; // typedef uint32_t BusIO_PortMask; //#define BUSIO_USE_FAST_PINIO +#elif defined(__MBED__) || defined(__ZEPHYR__) +// Boards based on RTOS cores like mbed or Zephyr are not going to expose the +// low level registers needed for fast pin manipulation +#undef BUSIO_USE_FAST_PINIO + #elif defined(ARDUINO_ARCH_XMC) #undef BUSIO_USE_FAST_PINIO @@ -73,7 +78,7 @@ typedef uint32_t BusIO_PortMask; #define BUSIO_USE_FAST_PINIO #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ - !defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040) && \ + !defined(ARDUINO_ARCH_RP2040) && \ !defined(ARDUINO_SILABS) && !defined(ARDUINO_UNOR4_MINIMA) && \ !defined(ARDUINO_UNOR4_WIFI) typedef volatile uint32_t BusIO_PortReg; From c99c8564a2914684aa85aaef56024ca5b3f51e48 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 16 Dec 2024 09:41:55 +0100 Subject: [PATCH 26/43] fixup: clang-format fix --- Adafruit_SPIDevice.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 54b967b..fad0fbd 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -78,9 +78,8 @@ typedef uint32_t BusIO_PortMask; #define BUSIO_USE_FAST_PINIO #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ - !defined(ARDUINO_ARCH_RP2040) && \ - !defined(ARDUINO_SILABS) && !defined(ARDUINO_UNOR4_MINIMA) && \ - !defined(ARDUINO_UNOR4_WIFI) + !defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_SILABS) && \ + !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) typedef volatile uint32_t BusIO_PortReg; typedef uint32_t BusIO_PortMask; #if !defined(__ASR6501__) && !defined(__ASR6502__) From 14d379e4d362eb93ec2419e5d9a86efc44d4aadd Mon Sep 17 00:00:00 2001 From: ladyada Date: Sun, 5 Jan 2025 15:12:13 -0500 Subject: [PATCH 27/43] small typo fix --- Adafruit_I2CDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 92c1731..88e9b3c 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -69,7 +69,7 @@ bool Adafruit_I2CDevice::detected(void) { _wire->beginTransmission(_addr); #ifdef DEBUG_SERIAL DEBUG_SERIAL.print(F("Address 0x")); - DEBUG_SERIAL.print(_addr); + DEBUG_SERIAL.print(_addr, HEX); #endif if (_wire->endTransmission() == 0) { #ifdef DEBUG_SERIAL From 9eda3f46413c46bc95b0facdb6c1fde23d409510 Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 7 Jan 2025 16:23:28 +0000 Subject: [PATCH 28/43] Update library.properties - bump version to 1.16.3 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index b2673fe..27e536a 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.16.2 +version=1.16.3 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away I2C and SPI interfacing From c43db9d7c2c48cfd3e4923732682a79f991e596a Mon Sep 17 00:00:00 2001 From: ladyada Date: Tue, 7 Jan 2025 22:03:15 -0500 Subject: [PATCH 29/43] still need to doxy/clang --- Adafruit_BusIO_Register.cpp | 103 +++++++++++++++++++++--------------- Adafruit_BusIO_Register.h | 6 +++ Adafruit_GenericDevice.cpp | 45 ++++++++++++++++ Adafruit_GenericDevice.h | 37 +++++++++++++ 4 files changed, 148 insertions(+), 43 deletions(-) create mode 100644 Adafruit_GenericDevice.cpp create mode 100644 Adafruit_GenericDevice.h diff --git a/Adafruit_BusIO_Register.cpp b/Adafruit_BusIO_Register.cpp index a28193f..6099431 100644 --- a/Adafruit_BusIO_Register.cpp +++ b/Adafruit_BusIO_Register.cpp @@ -88,6 +88,29 @@ Adafruit_BusIO_Register::Adafruit_BusIO_Register( _width = width; } +/*! +* @brief Create a register we access over a GenericDevice +* @param genericdevice Generic device to use +* @param reg_addr Register address we will read/write +* @param width Width of the register in bytes (1-4) +* @param byteorder Byte order of register data (LSBFIRST or MSBFIRST) +* @param address_width Width of the register address in bytes (1 or 2) +*/ +Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, + uint16_t reg_addr, + uint8_t width, + uint8_t byteorder, + uint8_t address_width) { + _i2cdevice = nullptr; + _spidevice = nullptr; + _genericdevice = genericdevice; + _addrwidth = address_width; + _address = reg_addr; + _byteorder = byteorder; + _width = width; +} + + /*! * @brief Write a buffer of data to the register location * @param buffer Pointer to data to write @@ -96,17 +119,14 @@ Adafruit_BusIO_Register::Adafruit_BusIO_Register( * uncheckable) */ 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) { return _i2cdevice->write(buffer, len, true, addrbuffer, _addrwidth); } if (_spidevice) { if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { // very special case! - // pass the special opcode address which we set as the high byte of the // regaddr addrbuffer[0] = @@ -116,7 +136,6 @@ bool Adafruit_BusIO_Register::write(uint8_t *buffer, uint8_t len) { // the address appears to be a byte longer return _spidevice->write(buffer, len, addrbuffer, _addrwidth + 1); } - if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { addrbuffer[0] &= ~0x80; } @@ -129,6 +148,9 @@ bool Adafruit_BusIO_Register::write(uint8_t *buffer, uint8_t len) { } return _spidevice->write(buffer, len, addrbuffer, _addrwidth); } + if (_genericdevice) { + return _genericdevice->writeRegister(addrbuffer, _addrwidth, buffer, len); + } return false; } @@ -191,48 +213,43 @@ uint32_t Adafruit_BusIO_Register::read(void) { */ uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; } -/*! - * @brief Read a buffer of data from the register location - * @param buffer Pointer to data to read into - * @param len Number of bytes to read - * @return True on successful write (only really useful for I2C as SPI is - * uncheckable) - */ bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) { - uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), - (uint8_t)(_address >> 8)}; - - if (_i2cdevice) { - return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len); - } - if (_spidevice) { - if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { - // very special case! - - // pass the special opcode address which we set as the high byte of the - // regaddr - addrbuffer[0] = - (uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read - // the 'actual' reg addr is the second byte then - addrbuffer[1] = (uint8_t)(_address & 0xFF); - // the address appears to be a byte longer - return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer, - len); - } - if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { - addrbuffer[0] |= 0x80; - } - if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { - addrbuffer[0] &= ~0x80; - } - if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { - addrbuffer[0] |= 0x80 | 0x40; - } - return _spidevice->write_then_read(addrbuffer, _addrwidth, 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); + } + if (_spidevice) { + if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { + // very special case! + // pass the special opcode address which we set as the high byte of the + // regaddr + addrbuffer[0] = + (uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read + // the 'actual' reg addr is the second byte then + addrbuffer[1] = (uint8_t)(_address & 0xFF); + // the address appears to be a byte longer + return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer, + len); + } + if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { + addrbuffer[0] |= 0x80; + } + if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { + addrbuffer[0] &= ~0x80; + } + if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { + addrbuffer[0] |= 0x80 | 0x40; + } + return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len); + } + if (_genericdevice) { + return _genericdevice->readRegister(addrbuffer, _addrwidth, buffer, len); + } + return false; } + /*! * @brief Read 2 bytes of data from the register location * @param value Pointer to uint16_t variable to read into diff --git a/Adafruit_BusIO_Register.h b/Adafruit_BusIO_Register.h index c6d58de..cd7f18a 100644 --- a/Adafruit_BusIO_Register.h +++ b/Adafruit_BusIO_Register.h @@ -8,6 +8,7 @@ #include #include +#include typedef enum _Adafruit_BusIO_SPIRegType { ADDRBIT8_HIGH_TOREAD = 0, @@ -57,6 +58,10 @@ public: uint8_t width = 1, uint8_t byteorder = LSBFIRST, uint8_t address_width = 1); + Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, uint16_t reg_addr, + uint8_t width = 1, uint8_t byteorder = LSBFIRST, + uint8_t address_width = 1); + bool read(uint8_t *buffer, uint8_t len); bool read(uint8_t *value); bool read(uint16_t *value); @@ -77,6 +82,7 @@ public: private: Adafruit_I2CDevice *_i2cdevice; Adafruit_SPIDevice *_spidevice; + Adafruit_GenericDevice *_genericdevice; Adafruit_BusIO_SPIRegType _spiregtype; uint16_t _address; uint8_t _width, _addrwidth, _byteorder; diff --git a/Adafruit_GenericDevice.cpp b/Adafruit_GenericDevice.cpp new file mode 100644 index 0000000..d41ec88 --- /dev/null +++ b/Adafruit_GenericDevice.cpp @@ -0,0 +1,45 @@ +#include "Adafruit_GenericDevice.h" + +Adafruit_GenericDevice::Adafruit_GenericDevice(busio_genericdevice_read_t read_func, + busio_genericdevice_write_t write_func, + busio_genericdevice_readreg_t readreg_func, + busio_genericdevice_writereg_t writereg_func) { + _read_func = read_func; + _write_func = write_func; + _readreg_func = readreg_func; + _writereg_func = writereg_func; + _begun = false; +} + +bool Adafruit_GenericDevice::begin(void) { + _begun = true; + return true; +} + +bool Adafruit_GenericDevice::write(const uint8_t *buffer, size_t len) { + if (!_begun) + return false; + + return _write_func(buffer, len); +} + +bool Adafruit_GenericDevice::read(uint8_t *buffer, size_t len) { + if (!_begun) + return false; + + return _read_func(buffer, len); +} + +bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz) { + if (!_begun || !_readreg_func) + return false; + + return _readreg_func(addr_buf, addrsiz, buf, bufsiz); +} + +bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz) { + if (!_begun || !_writereg_func) + return false; + + return _writereg_func(addr_buf, addrsiz, buf, bufsiz); +} diff --git a/Adafruit_GenericDevice.h b/Adafruit_GenericDevice.h new file mode 100644 index 0000000..ef84110 --- /dev/null +++ b/Adafruit_GenericDevice.h @@ -0,0 +1,37 @@ +#ifndef ADAFRUIT_GENERICDEVICE_H +#define ADAFRUIT_GENERICDEVICE_H + +#include + +typedef bool (*busio_genericdevice_read_t)(uint8_t *buffer, size_t len); +typedef bool (*busio_genericdevice_write_t)(const uint8_t *buffer, size_t len); +typedef bool (*busio_genericdevice_readreg_t)(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz); +typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz); + +/*! + * @brief Class for communicating with a device via generic read/write functions + */ +class Adafruit_GenericDevice { +public: + Adafruit_GenericDevice(busio_genericdevice_read_t read_func, + busio_genericdevice_write_t write_func, + busio_genericdevice_readreg_t readreg_func = nullptr, + busio_genericdevice_writereg_t writereg_func = nullptr); + + bool begin(void); + + bool read(uint8_t *buffer, size_t len); + bool write(const uint8_t *buffer, size_t len); + bool readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz); + bool writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz); + +protected: + busio_genericdevice_read_t _read_func; + busio_genericdevice_write_t _write_func; + busio_genericdevice_readreg_t _readreg_func; + busio_genericdevice_writereg_t _writereg_func; + + bool _begun; +}; + +#endif // ADAFRUIT_GENERICDEVICE_H From 66448b37ecdebf48cdcb292c5398a83a9956121e Mon Sep 17 00:00:00 2001 From: ladyada Date: Tue, 7 Jan 2025 22:08:13 -0500 Subject: [PATCH 30/43] clang --- Adafruit_BusIO_Register.cpp | 104 +++++++++++++++++------------------- Adafruit_BusIO_Register.h | 7 +-- Adafruit_GenericDevice.cpp | 50 +++++++++-------- Adafruit_GenericDevice.h | 30 +++++++---- 4 files changed, 100 insertions(+), 91 deletions(-) diff --git a/Adafruit_BusIO_Register.cpp b/Adafruit_BusIO_Register.cpp index 6099431..86d13a9 100644 --- a/Adafruit_BusIO_Register.cpp +++ b/Adafruit_BusIO_Register.cpp @@ -89,28 +89,25 @@ Adafruit_BusIO_Register::Adafruit_BusIO_Register( } /*! -* @brief Create a register we access over a GenericDevice -* @param genericdevice Generic device to use -* @param reg_addr Register address we will read/write -* @param width Width of the register in bytes (1-4) -* @param byteorder Byte order of register data (LSBFIRST or MSBFIRST) -* @param address_width Width of the register address in bytes (1 or 2) -*/ -Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, - uint16_t reg_addr, - uint8_t width, - uint8_t byteorder, - uint8_t address_width) { - _i2cdevice = nullptr; - _spidevice = nullptr; - _genericdevice = genericdevice; - _addrwidth = address_width; - _address = reg_addr; - _byteorder = byteorder; - _width = width; + * @brief Create a register we access over a GenericDevice + * @param genericdevice Generic device to use + * @param reg_addr Register address we will read/write + * @param width Width of the register in bytes (1-4) + * @param byteorder Byte order of register data (LSBFIRST or MSBFIRST) + * @param address_width Width of the register address in bytes (1 or 2) + */ +Adafruit_BusIO_Register::Adafruit_BusIO_Register( + Adafruit_GenericDevice *genericdevice, uint16_t reg_addr, uint8_t width, + uint8_t byteorder, uint8_t address_width) { + _i2cdevice = nullptr; + _spidevice = nullptr; + _genericdevice = genericdevice; + _addrwidth = address_width; + _address = reg_addr; + _byteorder = byteorder; + _width = width; } - /*! * @brief Write a buffer of data to the register location * @param buffer Pointer to data to write @@ -214,42 +211,41 @@ uint32_t Adafruit_BusIO_Register::read(void) { uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; } bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) { - uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), - (uint8_t)(_address >> 8)}; - if (_i2cdevice) { - return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len); - } - if (_spidevice) { - if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { - // very special case! - // pass the special opcode address which we set as the high byte of the - // regaddr - addrbuffer[0] = - (uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read - // the 'actual' reg addr is the second byte then - addrbuffer[1] = (uint8_t)(_address & 0xFF); - // the address appears to be a byte longer - return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer, - len); - } - if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { - addrbuffer[0] |= 0x80; - } - if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { - addrbuffer[0] &= ~0x80; - } - if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { - addrbuffer[0] |= 0x80 | 0x40; - } - return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len); - } - if (_genericdevice) { - return _genericdevice->readRegister(addrbuffer, _addrwidth, 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); + } + if (_spidevice) { + if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { + // very special case! + // pass the special opcode address which we set as the high byte of the + // regaddr + addrbuffer[0] = + (uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read + // the 'actual' reg addr is the second byte then + addrbuffer[1] = (uint8_t)(_address & 0xFF); + // the address appears to be a byte longer + return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer, + len); + } + if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { + addrbuffer[0] |= 0x80; + } + if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { + addrbuffer[0] &= ~0x80; + } + if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { + addrbuffer[0] |= 0x80 | 0x40; + } + return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len); + } + if (_genericdevice) { + return _genericdevice->readRegister(addrbuffer, _addrwidth, buffer, len); + } + return false; } - /*! * @brief Read 2 bytes of data from the register location * @param value Pointer to uint16_t variable to read into diff --git a/Adafruit_BusIO_Register.h b/Adafruit_BusIO_Register.h index cd7f18a..ee7a57e 100644 --- a/Adafruit_BusIO_Register.h +++ b/Adafruit_BusIO_Register.h @@ -6,9 +6,9 @@ #if !defined(SPI_INTERFACES_COUNT) || \ (defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0)) +#include #include #include -#include typedef enum _Adafruit_BusIO_SPIRegType { ADDRBIT8_HIGH_TOREAD = 0, @@ -58,8 +58,9 @@ public: uint8_t width = 1, uint8_t byteorder = LSBFIRST, uint8_t address_width = 1); - Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, uint16_t reg_addr, - uint8_t width = 1, uint8_t byteorder = LSBFIRST, + Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, + uint16_t reg_addr, uint8_t width = 1, + uint8_t byteorder = LSBFIRST, uint8_t address_width = 1); bool read(uint8_t *buffer, uint8_t len); diff --git a/Adafruit_GenericDevice.cpp b/Adafruit_GenericDevice.cpp index d41ec88..917d96f 100644 --- a/Adafruit_GenericDevice.cpp +++ b/Adafruit_GenericDevice.cpp @@ -1,45 +1,49 @@ #include "Adafruit_GenericDevice.h" -Adafruit_GenericDevice::Adafruit_GenericDevice(busio_genericdevice_read_t read_func, - busio_genericdevice_write_t write_func, - busio_genericdevice_readreg_t readreg_func, - busio_genericdevice_writereg_t writereg_func) { - _read_func = read_func; - _write_func = write_func; - _readreg_func = readreg_func; - _writereg_func = writereg_func; - _begun = false; +Adafruit_GenericDevice::Adafruit_GenericDevice( + busio_genericdevice_read_t read_func, + busio_genericdevice_write_t write_func, + busio_genericdevice_readreg_t readreg_func, + busio_genericdevice_writereg_t writereg_func) { + _read_func = read_func; + _write_func = write_func; + _readreg_func = readreg_func; + _writereg_func = writereg_func; + _begun = false; } bool Adafruit_GenericDevice::begin(void) { - _begun = true; - return true; + _begun = true; + return true; } bool Adafruit_GenericDevice::write(const uint8_t *buffer, size_t len) { - if (!_begun) - return false; - - return _write_func(buffer, len); + if (!_begun) + return false; + + return _write_func(buffer, len); } bool Adafruit_GenericDevice::read(uint8_t *buffer, size_t len) { - if (!_begun) - return false; - - return _read_func(buffer, len); + if (!_begun) + return false; + + return _read_func(buffer, len); } -bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz) { +bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz, + uint8_t *buf, uint16_t bufsiz) { if (!_begun || !_readreg_func) return false; - + return _readreg_func(addr_buf, addrsiz, buf, bufsiz); } -bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz) { +bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz, + const uint8_t *buf, + uint16_t bufsiz) { if (!_begun || !_writereg_func) return false; - + return _writereg_func(addr_buf, addrsiz, buf, bufsiz); } diff --git a/Adafruit_GenericDevice.h b/Adafruit_GenericDevice.h index ef84110..3cb8c5d 100644 --- a/Adafruit_GenericDevice.h +++ b/Adafruit_GenericDevice.h @@ -5,32 +5,40 @@ typedef bool (*busio_genericdevice_read_t)(uint8_t *buffer, size_t len); typedef bool (*busio_genericdevice_write_t)(const uint8_t *buffer, size_t len); -typedef bool (*busio_genericdevice_readreg_t)(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz); -typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz); +typedef bool (*busio_genericdevice_readreg_t)(uint8_t *addr_buf, + uint8_t addrsiz, uint8_t *buf, + uint16_t bufsiz); +typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf, + uint8_t addrsiz, + const uint8_t *buf, + uint16_t bufsiz); /*! * @brief Class for communicating with a device via generic read/write functions */ class Adafruit_GenericDevice { public: - Adafruit_GenericDevice(busio_genericdevice_read_t read_func, - busio_genericdevice_write_t write_func, - busio_genericdevice_readreg_t readreg_func = nullptr, - busio_genericdevice_writereg_t writereg_func = nullptr); - + Adafruit_GenericDevice( + busio_genericdevice_read_t read_func, + busio_genericdevice_write_t write_func, + busio_genericdevice_readreg_t readreg_func = nullptr, + busio_genericdevice_writereg_t writereg_func = nullptr); + bool begin(void); - + bool read(uint8_t *buffer, size_t len); bool write(const uint8_t *buffer, size_t len); - bool readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz); - bool writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz); + bool readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, + uint16_t bufsiz); + bool writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, + uint16_t bufsiz); protected: busio_genericdevice_read_t _read_func; busio_genericdevice_write_t _write_func; busio_genericdevice_readreg_t _readreg_func; busio_genericdevice_writereg_t _writereg_func; - + bool _begun; }; From c602ea03e00188d86f97b1315d00053b413373ba Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 09:29:49 -0500 Subject: [PATCH 31/43] doxyclanged! --- Adafruit_BusIO_Register.cpp | 6 ++++++ Adafruit_GenericDevice.cpp | 31 +++++++++++++++++++++++++++---- Adafruit_GenericDevice.h | 7 ++++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Adafruit_BusIO_Register.cpp b/Adafruit_BusIO_Register.cpp index 86d13a9..f3e8187 100644 --- a/Adafruit_BusIO_Register.cpp +++ b/Adafruit_BusIO_Register.cpp @@ -210,6 +210,12 @@ uint32_t Adafruit_BusIO_Register::read(void) { */ uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; } +/*! + @brief Read a number of bytes from a register into a buffer + @param buffer Buffer to read data into + @param len Number of bytes to read into the buffer + @return true on successful read, otherwise false +*/ bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) { uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), (uint8_t)(_address >> 8)}; diff --git a/Adafruit_GenericDevice.cpp b/Adafruit_GenericDevice.cpp index 917d96f..b0d8824 100644 --- a/Adafruit_GenericDevice.cpp +++ b/Adafruit_GenericDevice.cpp @@ -1,5 +1,10 @@ #include "Adafruit_GenericDevice.h" +/*! @brief Create a Generic device with the provided read/write functions + @param read_func Function pointer for reading raw data + @param write_func Function pointer for writing raw data + @param readreg_func Function pointer for reading registers (optional) + @param writereg_func Function pointer for writing registers (optional) */ Adafruit_GenericDevice::Adafruit_GenericDevice( busio_genericdevice_read_t read_func, busio_genericdevice_write_t write_func, @@ -12,38 +17,56 @@ Adafruit_GenericDevice::Adafruit_GenericDevice( _begun = false; } +/*! @brief Initializes the device + @return true if initialization was successful, otherwise false */ bool Adafruit_GenericDevice::begin(void) { _begun = true; return true; } +/*! @brief Write a buffer of data + @param buffer Pointer to buffer of data to write + @param len Number of bytes to write + @return true if write was successful, otherwise false */ bool Adafruit_GenericDevice::write(const uint8_t *buffer, size_t len) { if (!_begun) return false; - return _write_func(buffer, len); } +/*! @brief Read data into a buffer + @param buffer Pointer to buffer to read data into + @param len Number of bytes to read + @return true if read was successful, otherwise false */ bool Adafruit_GenericDevice::read(uint8_t *buffer, size_t len) { if (!_begun) return false; - return _read_func(buffer, len); } +/*! @brief Read from a register location + @param addr_buf Buffer containing register address + @param addrsiz Size of register address in bytes + @param buf Buffer to store read data + @param bufsiz Size of data to read in bytes + @return true if read was successful, otherwise false */ bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz) { if (!_begun || !_readreg_func) return false; - return _readreg_func(addr_buf, addrsiz, buf, bufsiz); } +/*! @brief Write to a register location + @param addr_buf Buffer containing register address + @param addrsiz Size of register address in bytes + @param buf Buffer containing data to write + @param bufsiz Size of data to write in bytes + @return true if write was successful, otherwise false */ bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz) { if (!_begun || !_writereg_func) return false; - return _writereg_func(addr_buf, addrsiz, buf, bufsiz); } diff --git a/Adafruit_GenericDevice.h b/Adafruit_GenericDevice.h index 3cb8c5d..7dd032f 100644 --- a/Adafruit_GenericDevice.h +++ b/Adafruit_GenericDevice.h @@ -34,12 +34,17 @@ public: uint16_t bufsiz); protected: + /*! @brief Function pointer for reading raw data from the device */ busio_genericdevice_read_t _read_func; + /*! @brief Function pointer for writing raw data to the device */ busio_genericdevice_write_t _write_func; + /*! @brief Function pointer for reading a 'register' from the device */ busio_genericdevice_readreg_t _readreg_func; + /*! @brief Function pointer for writing a 'register' to the device */ busio_genericdevice_writereg_t _writereg_func; - bool _begun; + bool _begun; ///< whether we have initialized yet (in case the function needs + ///< to do something) }; #endif // ADAFRUIT_GENERICDEVICE_H From 70ad31700abc20027e92756ff0b837c2700e5a07 Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 09:30:58 -0500 Subject: [PATCH 32/43] some tests for uart mode --- .../genericdevice_uartregtest.ino | 237 ++++++++++++++++++ .../genericdevice_uarttest.ino | 67 +++++ 2 files changed, 304 insertions(+) create mode 100644 examples/genericdevice_uartregtest/genericdevice_uartregtest.ino create mode 100644 examples/genericdevice_uarttest/genericdevice_uarttest.ino diff --git a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino new file mode 100644 index 0000000..b64389d --- /dev/null +++ b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino @@ -0,0 +1,237 @@ +#include "Adafruit_BusIO_Register.h" +#include "Adafruit_GenericDevice.h" + +// Debugging macros +//#define DEBUG_SERIAL Serial + +#ifdef DEBUG_SERIAL +#define DEBUG_PRINT(x) DEBUG_SERIAL.print(x) +#define DEBUG_PRINTLN(x) DEBUG_SERIAL.println(x) +#define DEBUG_PRINT_HEX(x) \ + do { \ + if (x < 0x10) \ + DEBUG_SERIAL.print('0'); \ + DEBUG_SERIAL.print(x, HEX); \ + DEBUG_SERIAL.print(' '); \ + } while (0) +#else +#define DEBUG_PRINT(x) +#define DEBUG_PRINTLN(x) +#define DEBUG_PRINT_HEX(x) +#endif + +// Add IOIN register definition +#define TMC2209_IOIN 0x06 + +class TMC2209_UART { +private: + static TMC2209_UART *_instance; + Stream *_uart_stream; + uint8_t _addr; + + static bool uart_read_impl(uint8_t *buffer, size_t len) { + return _instance->uart_read_fn(buffer, len); + } + + static bool uart_write_impl(const uint8_t *buffer, size_t len) { + return _instance->uart_write_fn(buffer, len); + } + + static bool uart_readreg_impl(uint8_t *addr_buf, uint8_t addrsiz, + uint8_t *data, uint16_t datalen) { + return _instance->uart_readreg_fn(addr_buf, addrsiz, data, datalen); + } + + static bool uart_writereg_impl(uint8_t *addr_buf, uint8_t addrsiz, + const uint8_t *data, uint16_t datalen) { + return _instance->uart_writereg_fn(addr_buf, addrsiz, data, datalen); + } + + bool uart_read_fn(uint8_t *buffer, size_t len) { + uint16_t timeout = 100; + while (_uart_stream->available() < len && timeout--) { + delay(1); + } + if (timeout == 0) { + DEBUG_PRINTLN("Read timeout!"); + return false; + } + + DEBUG_PRINT("Reading: "); + for (size_t i = 0; i < len; i++) { + buffer[i] = _uart_stream->read(); + DEBUG_PRINT_HEX(buffer[i]); + } + DEBUG_PRINTLN(""); + + return true; + } + + bool uart_write_fn(const uint8_t *buffer, size_t len) { + DEBUG_PRINT("Writing: "); + for (size_t i = 0; i < len; i++) { + DEBUG_PRINT_HEX(buffer[i]); + } + DEBUG_PRINTLN(""); + + _uart_stream->write(buffer, len); + return true; + } + + bool uart_readreg_fn(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *data, + uint16_t datalen) { + while (_uart_stream->available()) + _uart_stream->read(); + + uint8_t packet[4] = {0x05, uint8_t(_addr << 1), addr_buf[0], 0x00}; + + packet[3] = calcCRC(packet, 3); + if (!uart_write_impl(packet, 4)) + return false; + + // Read back echo + uint8_t echo[4]; + if (!uart_read_impl(echo, 4)) + return false; + + // Verify echo + for (uint8_t i = 0; i < 4; i++) { + if (echo[i] != packet[i]) { + DEBUG_PRINTLN("Echo mismatch"); + return false; + } + } + + uint8_t response[8]; // sync + 0xFF + reg + 4 data bytes + CRC + if (!uart_read_impl(response, 8)) + return false; + + // Verify response + if (response[0] != 0x05) { + DEBUG_PRINTLN("Invalid sync byte"); + return false; + } + + // Verify 0xFF address byte + if (response[1] != 0xFF) { + DEBUG_PRINTLN("Invalid reply address"); + return false; + } + + // Verify register address matches our request + if (response[2] != addr_buf[0]) { + DEBUG_PRINTLN("Register mismatch"); + return false; + } + + // Verify CRC + uint8_t crc = calcCRC(response, 7); // Calculate CRC of all but last byte + if (crc != response[7]) { + DEBUG_PRINTLN("CRC mismatch"); + return false; + } + + // Copy the data bytes + memcpy(data, &response[3], 4); + + return true; + } + + bool uart_writereg_fn(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *data, + uint16_t datalen) { + while (_uart_stream->available()) + _uart_stream->read(); + + uint8_t packet[8] = {0x05, + uint8_t(_addr << 1), + uint8_t(addr_buf[0] | 0x80), + data[0], + data[1], + data[2], + data[3], + 0x00}; + + packet[7] = calcCRC(packet, 7); + if (!uart_write_impl(packet, 8)) + return false; + + // Read and verify echo + uint8_t echo[8]; + if (!uart_read_impl(echo, 8)) + return false; + + // Verify echo matches what we sent + for (uint8_t i = 0; i < 8; i++) { + if (echo[i] != packet[i]) { + DEBUG_PRINTLN("Write echo mismatch"); + return false; + } + } + + return true; + } + + static uint8_t calcCRC(uint8_t *data, uint8_t length) { + uint8_t crc = 0; + for (uint8_t i = 0; i < length; i++) { + uint8_t currentByte = data[i]; + for (uint8_t j = 0; j < 8; j++) { + if ((crc >> 7) ^ (currentByte & 0x01)) { + crc = (crc << 1) ^ 0x07; + } else { + crc = crc << 1; + } + currentByte = currentByte >> 1; + } + } + return crc; + } + +public: + TMC2209_UART(Stream *serial, uint8_t addr) + : _uart_stream(serial), _addr(addr) { + _instance = this; + } + + Adafruit_GenericDevice *createDevice() { + return new Adafruit_GenericDevice(uart_read_impl, uart_write_impl, + uart_readreg_impl, uart_writereg_impl); + } +}; + +TMC2209_UART *TMC2209_UART::_instance = nullptr; + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + delay(100); + Serial.println("TMC2209 Generic Device register read/write test!"); + + Serial2.begin(115200); + + TMC2209_UART uart(&Serial2, 0); + Adafruit_GenericDevice *device = uart.createDevice(); + device->begin(); + + // Create register object for IOIN + Adafruit_BusIO_Register ioin_reg(device, + TMC2209_IOIN, // device and register address + 4, // width = 4 bytes + MSBFIRST, // byte order + 1); // address width = 1 byte + Serial.print("IOIN = 0x"); + Serial.println(ioin_reg.read(), HEX); + + // Create RegisterBits for VERSION field (bits 28:24) + Adafruit_BusIO_RegisterBits version_bits( + &ioin_reg, 8, 24); // 8 bits wide, starting at bit 24 + + Serial.println("Reading VERSION..."); + uint8_t version = version_bits.read(); + + Serial.print("VERSION = 0x"); + Serial.println(version, HEX); +} + +void loop() { delay(1000); } diff --git a/examples/genericdevice_uarttest/genericdevice_uarttest.ino b/examples/genericdevice_uarttest/genericdevice_uarttest.ino new file mode 100644 index 0000000..d943291 --- /dev/null +++ b/examples/genericdevice_uarttest/genericdevice_uarttest.ino @@ -0,0 +1,67 @@ +#include "Adafruit_GenericDevice.h" + +Stream *uart_stream; // Will hold the pointer to our Stream object + +Adafruit_GenericDevice *create_uart_device(Stream *serial_port) { + uart_stream = serial_port; // Store the Stream pointer + + auto uart_write = [](const uint8_t *buffer, size_t len) -> bool { + uart_stream->write(buffer, len); + return true; + }; + + auto uart_read = [](uint8_t *buffer, size_t len) -> bool { + uint16_t timeout = 100; + while (uart_stream->available() < len && timeout--) { + delay(1); + } + if (timeout == 0) { + return false; + } + for (size_t i = 0; i < len; i++) { + buffer[i] = uart_stream->read(); + } + return true; + }; + + return new Adafruit_GenericDevice(uart_read, uart_write); +} + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + delay(100); + + Serial.println("Generic Device test!"); + + Serial2.begin(115200); + + Adafruit_GenericDevice *device = create_uart_device(&Serial2); + device->begin(); + + uint8_t write_buf[4] = {0x5, 0x0, 0x0, 0x48}; + uint8_t read_buf[8]; + + Serial.println("Writing data..."); + if (!device->write(write_buf, 4)) { + Serial.println("Write failed!"); + return; + } + + Serial.println("Reading response..."); + if (!device->read(read_buf, 8)) { + Serial.println("Read failed!"); + return; + } + + Serial.print("Got response: "); + for (int i = 0; i < 8; i++) { + Serial.print("0x"); + Serial.print(read_buf[i], HEX); + Serial.print(" "); + } + Serial.println(); +} + +void loop() { delay(1000); } From fcc8dfaf6378c5b930078c92fda8bf19ff7e82d4 Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 09:31:54 -0500 Subject: [PATCH 33/43] bump --- README.md | 2 +- library.properties | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1cc06a1..59712ff 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Adafruit Bus IO Library [![Build Status](https://github.com/adafruit/Adafruit_BusIO/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_BusIO/actions) -This is a helper library to abstract away I2C & SPI transactions and registers +This is a helper library to abstract away I2C, SPI, and 'generic transport' (e.g. UART) transactions and registers Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! diff --git a/library.properties b/library.properties index b2673fe..bdff9e1 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=Adafruit BusIO -version=1.16.2 +version=1.17.0 author=Adafruit maintainer=Adafruit -sentence=This is a library for abstracting away I2C and SPI interfacing -paragraph=This is a library for abstracting away I2C and SPI interfacing +sentence=This is a library for abstracting away UART, I2C and SPI interfacing +paragraph=This is a library for abstracting away UART, I2C and SPI interfacing category=Signal Input/Output url=https://github.com/adafruit/Adafruit_BusIO architectures=* From c0237922d3c883c8ba0dc7e2fc6ad30d0464203a Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 09:35:51 -0500 Subject: [PATCH 34/43] add claude credits! --- Adafruit_GenericDevice.cpp | 6 ++++++ .../genericdevice_uartregtest.ino | 9 +++++++++ .../genericdevice_uarttest/genericdevice_uarttest.ino | 8 ++++++++ 3 files changed, 23 insertions(+) diff --git a/Adafruit_GenericDevice.cpp b/Adafruit_GenericDevice.cpp index b0d8824..2fab4f0 100644 --- a/Adafruit_GenericDevice.cpp +++ b/Adafruit_GenericDevice.cpp @@ -1,3 +1,9 @@ +/* + Written with help by Claude! + https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c (at this time + chats are not shareable :( +*/ + #include "Adafruit_GenericDevice.h" /*! @brief Create a Generic device with the provided read/write functions diff --git a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino index b64389d..5e40c7f 100644 --- a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino +++ b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino @@ -1,3 +1,12 @@ +/* + Advanced example of using bstracted transport for reading and writing + register data from a UART-based device such as a TMC2209 + + Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c + (at this time chats are not shareable :( +*/ + + #include "Adafruit_BusIO_Register.h" #include "Adafruit_GenericDevice.h" diff --git a/examples/genericdevice_uarttest/genericdevice_uarttest.ino b/examples/genericdevice_uarttest/genericdevice_uarttest.ino index d943291..192081e 100644 --- a/examples/genericdevice_uarttest/genericdevice_uarttest.ino +++ b/examples/genericdevice_uarttest/genericdevice_uarttest.ino @@ -1,3 +1,11 @@ +/* + Abstracted transport for reading and writing data from a UART-based + device such as a TMC2209 + + Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c + (at this time chats are not shareable :( +*/ + #include "Adafruit_GenericDevice.h" Stream *uart_stream; // Will hold the pointer to our Stream object From 2663ca269f9cbffda79b7f5786ea34e5dbad18ed Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 10:15:09 -0500 Subject: [PATCH 35/43] woops fix serial --- .../genericdevice_uartregtest.ino | 492 +++++++++--------- .../genericdevice_uarttest.ino | 150 +++--- 2 files changed, 321 insertions(+), 321 deletions(-) diff --git a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino index 5e40c7f..d9f3fab 100644 --- a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino +++ b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino @@ -1,246 +1,246 @@ -/* - Advanced example of using bstracted transport for reading and writing - register data from a UART-based device such as a TMC2209 - - Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c - (at this time chats are not shareable :( -*/ - - -#include "Adafruit_BusIO_Register.h" -#include "Adafruit_GenericDevice.h" - -// Debugging macros -//#define DEBUG_SERIAL Serial - -#ifdef DEBUG_SERIAL -#define DEBUG_PRINT(x) DEBUG_SERIAL.print(x) -#define DEBUG_PRINTLN(x) DEBUG_SERIAL.println(x) -#define DEBUG_PRINT_HEX(x) \ - do { \ - if (x < 0x10) \ - DEBUG_SERIAL.print('0'); \ - DEBUG_SERIAL.print(x, HEX); \ - DEBUG_SERIAL.print(' '); \ - } while (0) -#else -#define DEBUG_PRINT(x) -#define DEBUG_PRINTLN(x) -#define DEBUG_PRINT_HEX(x) -#endif - -// Add IOIN register definition -#define TMC2209_IOIN 0x06 - -class TMC2209_UART { -private: - static TMC2209_UART *_instance; - Stream *_uart_stream; - uint8_t _addr; - - static bool uart_read_impl(uint8_t *buffer, size_t len) { - return _instance->uart_read_fn(buffer, len); - } - - static bool uart_write_impl(const uint8_t *buffer, size_t len) { - return _instance->uart_write_fn(buffer, len); - } - - static bool uart_readreg_impl(uint8_t *addr_buf, uint8_t addrsiz, - uint8_t *data, uint16_t datalen) { - return _instance->uart_readreg_fn(addr_buf, addrsiz, data, datalen); - } - - static bool uart_writereg_impl(uint8_t *addr_buf, uint8_t addrsiz, - const uint8_t *data, uint16_t datalen) { - return _instance->uart_writereg_fn(addr_buf, addrsiz, data, datalen); - } - - bool uart_read_fn(uint8_t *buffer, size_t len) { - uint16_t timeout = 100; - while (_uart_stream->available() < len && timeout--) { - delay(1); - } - if (timeout == 0) { - DEBUG_PRINTLN("Read timeout!"); - return false; - } - - DEBUG_PRINT("Reading: "); - for (size_t i = 0; i < len; i++) { - buffer[i] = _uart_stream->read(); - DEBUG_PRINT_HEX(buffer[i]); - } - DEBUG_PRINTLN(""); - - return true; - } - - bool uart_write_fn(const uint8_t *buffer, size_t len) { - DEBUG_PRINT("Writing: "); - for (size_t i = 0; i < len; i++) { - DEBUG_PRINT_HEX(buffer[i]); - } - DEBUG_PRINTLN(""); - - _uart_stream->write(buffer, len); - return true; - } - - bool uart_readreg_fn(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *data, - uint16_t datalen) { - while (_uart_stream->available()) - _uart_stream->read(); - - uint8_t packet[4] = {0x05, uint8_t(_addr << 1), addr_buf[0], 0x00}; - - packet[3] = calcCRC(packet, 3); - if (!uart_write_impl(packet, 4)) - return false; - - // Read back echo - uint8_t echo[4]; - if (!uart_read_impl(echo, 4)) - return false; - - // Verify echo - for (uint8_t i = 0; i < 4; i++) { - if (echo[i] != packet[i]) { - DEBUG_PRINTLN("Echo mismatch"); - return false; - } - } - - uint8_t response[8]; // sync + 0xFF + reg + 4 data bytes + CRC - if (!uart_read_impl(response, 8)) - return false; - - // Verify response - if (response[0] != 0x05) { - DEBUG_PRINTLN("Invalid sync byte"); - return false; - } - - // Verify 0xFF address byte - if (response[1] != 0xFF) { - DEBUG_PRINTLN("Invalid reply address"); - return false; - } - - // Verify register address matches our request - if (response[2] != addr_buf[0]) { - DEBUG_PRINTLN("Register mismatch"); - return false; - } - - // Verify CRC - uint8_t crc = calcCRC(response, 7); // Calculate CRC of all but last byte - if (crc != response[7]) { - DEBUG_PRINTLN("CRC mismatch"); - return false; - } - - // Copy the data bytes - memcpy(data, &response[3], 4); - - return true; - } - - bool uart_writereg_fn(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *data, - uint16_t datalen) { - while (_uart_stream->available()) - _uart_stream->read(); - - uint8_t packet[8] = {0x05, - uint8_t(_addr << 1), - uint8_t(addr_buf[0] | 0x80), - data[0], - data[1], - data[2], - data[3], - 0x00}; - - packet[7] = calcCRC(packet, 7); - if (!uart_write_impl(packet, 8)) - return false; - - // Read and verify echo - uint8_t echo[8]; - if (!uart_read_impl(echo, 8)) - return false; - - // Verify echo matches what we sent - for (uint8_t i = 0; i < 8; i++) { - if (echo[i] != packet[i]) { - DEBUG_PRINTLN("Write echo mismatch"); - return false; - } - } - - return true; - } - - static uint8_t calcCRC(uint8_t *data, uint8_t length) { - uint8_t crc = 0; - for (uint8_t i = 0; i < length; i++) { - uint8_t currentByte = data[i]; - for (uint8_t j = 0; j < 8; j++) { - if ((crc >> 7) ^ (currentByte & 0x01)) { - crc = (crc << 1) ^ 0x07; - } else { - crc = crc << 1; - } - currentByte = currentByte >> 1; - } - } - return crc; - } - -public: - TMC2209_UART(Stream *serial, uint8_t addr) - : _uart_stream(serial), _addr(addr) { - _instance = this; - } - - Adafruit_GenericDevice *createDevice() { - return new Adafruit_GenericDevice(uart_read_impl, uart_write_impl, - uart_readreg_impl, uart_writereg_impl); - } -}; - -TMC2209_UART *TMC2209_UART::_instance = nullptr; - -void setup() { - Serial.begin(115200); - while (!Serial) - ; - delay(100); - Serial.println("TMC2209 Generic Device register read/write test!"); - - Serial2.begin(115200); - - TMC2209_UART uart(&Serial2, 0); - Adafruit_GenericDevice *device = uart.createDevice(); - device->begin(); - - // Create register object for IOIN - Adafruit_BusIO_Register ioin_reg(device, - TMC2209_IOIN, // device and register address - 4, // width = 4 bytes - MSBFIRST, // byte order - 1); // address width = 1 byte - Serial.print("IOIN = 0x"); - Serial.println(ioin_reg.read(), HEX); - - // Create RegisterBits for VERSION field (bits 28:24) - Adafruit_BusIO_RegisterBits version_bits( - &ioin_reg, 8, 24); // 8 bits wide, starting at bit 24 - - Serial.println("Reading VERSION..."); - uint8_t version = version_bits.read(); - - Serial.print("VERSION = 0x"); - Serial.println(version, HEX); -} - -void loop() { delay(1000); } +/* + Advanced example of using bstracted transport for reading and writing + register data from a UART-based device such as a TMC2209 + + Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c + (at this time chats are not shareable :( +*/ + + +#include "Adafruit_BusIO_Register.h" +#include "Adafruit_GenericDevice.h" + +// Debugging macros +//#define DEBUG_SERIAL Serial + +#ifdef DEBUG_SERIAL +#define DEBUG_PRINT(x) DEBUG_SERIAL.print(x) +#define DEBUG_PRINTLN(x) DEBUG_SERIAL.println(x) +#define DEBUG_PRINT_HEX(x) \ + do { \ + if (x < 0x10) \ + DEBUG_SERIAL.print('0'); \ + DEBUG_SERIAL.print(x, HEX); \ + DEBUG_SERIAL.print(' '); \ + } while (0) +#else +#define DEBUG_PRINT(x) +#define DEBUG_PRINTLN(x) +#define DEBUG_PRINT_HEX(x) +#endif + +// Add IOIN register definition +#define TMC2209_IOIN 0x06 + +class TMC2209_UART { +private: + static TMC2209_UART *_instance; + Stream *_uart_stream; + uint8_t _addr; + + static bool uart_read_impl(uint8_t *buffer, size_t len) { + return _instance->uart_read_fn(buffer, len); + } + + static bool uart_write_impl(const uint8_t *buffer, size_t len) { + return _instance->uart_write_fn(buffer, len); + } + + static bool uart_readreg_impl(uint8_t *addr_buf, uint8_t addrsiz, + uint8_t *data, uint16_t datalen) { + return _instance->uart_readreg_fn(addr_buf, addrsiz, data, datalen); + } + + static bool uart_writereg_impl(uint8_t *addr_buf, uint8_t addrsiz, + const uint8_t *data, uint16_t datalen) { + return _instance->uart_writereg_fn(addr_buf, addrsiz, data, datalen); + } + + bool uart_read_fn(uint8_t *buffer, size_t len) { + uint16_t timeout = 100; + while (_uart_stream->available() < len && timeout--) { + delay(1); + } + if (timeout == 0) { + DEBUG_PRINTLN("Read timeout!"); + return false; + } + + DEBUG_PRINT("Reading: "); + for (size_t i = 0; i < len; i++) { + buffer[i] = _uart_stream->read(); + DEBUG_PRINT_HEX(buffer[i]); + } + DEBUG_PRINTLN(""); + + return true; + } + + bool uart_write_fn(const uint8_t *buffer, size_t len) { + DEBUG_PRINT("Writing: "); + for (size_t i = 0; i < len; i++) { + DEBUG_PRINT_HEX(buffer[i]); + } + DEBUG_PRINTLN(""); + + _uart_stream->write(buffer, len); + return true; + } + + bool uart_readreg_fn(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *data, + uint16_t datalen) { + while (_uart_stream->available()) + _uart_stream->read(); + + uint8_t packet[4] = {0x05, uint8_t(_addr << 1), addr_buf[0], 0x00}; + + packet[3] = calcCRC(packet, 3); + if (!uart_write_impl(packet, 4)) + return false; + + // Read back echo + uint8_t echo[4]; + if (!uart_read_impl(echo, 4)) + return false; + + // Verify echo + for (uint8_t i = 0; i < 4; i++) { + if (echo[i] != packet[i]) { + DEBUG_PRINTLN("Echo mismatch"); + return false; + } + } + + uint8_t response[8]; // sync + 0xFF + reg + 4 data bytes + CRC + if (!uart_read_impl(response, 8)) + return false; + + // Verify response + if (response[0] != 0x05) { + DEBUG_PRINTLN("Invalid sync byte"); + return false; + } + + // Verify 0xFF address byte + if (response[1] != 0xFF) { + DEBUG_PRINTLN("Invalid reply address"); + return false; + } + + // Verify register address matches our request + if (response[2] != addr_buf[0]) { + DEBUG_PRINTLN("Register mismatch"); + return false; + } + + // Verify CRC + uint8_t crc = calcCRC(response, 7); // Calculate CRC of all but last byte + if (crc != response[7]) { + DEBUG_PRINTLN("CRC mismatch"); + return false; + } + + // Copy the data bytes + memcpy(data, &response[3], 4); + + return true; + } + + bool uart_writereg_fn(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *data, + uint16_t datalen) { + while (_uart_stream->available()) + _uart_stream->read(); + + uint8_t packet[8] = {0x05, + uint8_t(_addr << 1), + uint8_t(addr_buf[0] | 0x80), + data[0], + data[1], + data[2], + data[3], + 0x00}; + + packet[7] = calcCRC(packet, 7); + if (!uart_write_impl(packet, 8)) + return false; + + // Read and verify echo + uint8_t echo[8]; + if (!uart_read_impl(echo, 8)) + return false; + + // Verify echo matches what we sent + for (uint8_t i = 0; i < 8; i++) { + if (echo[i] != packet[i]) { + DEBUG_PRINTLN("Write echo mismatch"); + return false; + } + } + + return true; + } + + static uint8_t calcCRC(uint8_t *data, uint8_t length) { + uint8_t crc = 0; + for (uint8_t i = 0; i < length; i++) { + uint8_t currentByte = data[i]; + for (uint8_t j = 0; j < 8; j++) { + if ((crc >> 7) ^ (currentByte & 0x01)) { + crc = (crc << 1) ^ 0x07; + } else { + crc = crc << 1; + } + currentByte = currentByte >> 1; + } + } + return crc; + } + +public: + TMC2209_UART(Stream *serial, uint8_t addr) + : _uart_stream(serial), _addr(addr) { + _instance = this; + } + + Adafruit_GenericDevice *createDevice() { + return new Adafruit_GenericDevice(uart_read_impl, uart_write_impl, + uart_readreg_impl, uart_writereg_impl); + } +}; + +TMC2209_UART *TMC2209_UART::_instance = nullptr; + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + delay(100); + Serial.println("TMC2209 Generic Device register read/write test!"); + + Serial1.begin(115200); + + TMC2209_UART uart(&Serial1, 0); + Adafruit_GenericDevice *device = uart.createDevice(); + device->begin(); + + // Create register object for IOIN + Adafruit_BusIO_Register ioin_reg(device, + TMC2209_IOIN, // device and register address + 4, // width = 4 bytes + MSBFIRST, // byte order + 1); // address width = 1 byte + Serial.print("IOIN = 0x"); + Serial.println(ioin_reg.read(), HEX); + + // Create RegisterBits for VERSION field (bits 28:24) + Adafruit_BusIO_RegisterBits version_bits( + &ioin_reg, 8, 24); // 8 bits wide, starting at bit 24 + + Serial.println("Reading VERSION..."); + uint8_t version = version_bits.read(); + + Serial.print("VERSION = 0x"); + Serial.println(version, HEX); +} + +void loop() { delay(1000); } diff --git a/examples/genericdevice_uarttest/genericdevice_uarttest.ino b/examples/genericdevice_uarttest/genericdevice_uarttest.ino index 192081e..bc4175c 100644 --- a/examples/genericdevice_uarttest/genericdevice_uarttest.ino +++ b/examples/genericdevice_uarttest/genericdevice_uarttest.ino @@ -1,75 +1,75 @@ -/* - Abstracted transport for reading and writing data from a UART-based - device such as a TMC2209 - - Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c - (at this time chats are not shareable :( -*/ - -#include "Adafruit_GenericDevice.h" - -Stream *uart_stream; // Will hold the pointer to our Stream object - -Adafruit_GenericDevice *create_uart_device(Stream *serial_port) { - uart_stream = serial_port; // Store the Stream pointer - - auto uart_write = [](const uint8_t *buffer, size_t len) -> bool { - uart_stream->write(buffer, len); - return true; - }; - - auto uart_read = [](uint8_t *buffer, size_t len) -> bool { - uint16_t timeout = 100; - while (uart_stream->available() < len && timeout--) { - delay(1); - } - if (timeout == 0) { - return false; - } - for (size_t i = 0; i < len; i++) { - buffer[i] = uart_stream->read(); - } - return true; - }; - - return new Adafruit_GenericDevice(uart_read, uart_write); -} - -void setup() { - Serial.begin(115200); - while (!Serial) - ; - delay(100); - - Serial.println("Generic Device test!"); - - Serial2.begin(115200); - - Adafruit_GenericDevice *device = create_uart_device(&Serial2); - device->begin(); - - uint8_t write_buf[4] = {0x5, 0x0, 0x0, 0x48}; - uint8_t read_buf[8]; - - Serial.println("Writing data..."); - if (!device->write(write_buf, 4)) { - Serial.println("Write failed!"); - return; - } - - Serial.println("Reading response..."); - if (!device->read(read_buf, 8)) { - Serial.println("Read failed!"); - return; - } - - Serial.print("Got response: "); - for (int i = 0; i < 8; i++) { - Serial.print("0x"); - Serial.print(read_buf[i], HEX); - Serial.print(" "); - } - Serial.println(); -} - -void loop() { delay(1000); } +/* + Abstracted transport for reading and writing data from a UART-based + device such as a TMC2209 + + Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c + (at this time chats are not shareable :( +*/ + +#include "Adafruit_GenericDevice.h" + +Stream *uart_stream; // Will hold the pointer to our Stream object + +Adafruit_GenericDevice *create_uart_device(Stream *serial_port) { + uart_stream = serial_port; // Store the Stream pointer + + auto uart_write = [](const uint8_t *buffer, size_t len) -> bool { + uart_stream->write(buffer, len); + return true; + }; + + auto uart_read = [](uint8_t *buffer, size_t len) -> bool { + uint16_t timeout = 100; + while (uart_stream->available() < len && timeout--) { + delay(1); + } + if (timeout == 0) { + return false; + } + for (size_t i = 0; i < len; i++) { + buffer[i] = uart_stream->read(); + } + return true; + }; + + return new Adafruit_GenericDevice(uart_read, uart_write); +} + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + delay(100); + + Serial.println("Generic Device test!"); + + Serial1.begin(115200); + + Adafruit_GenericDevice *device = create_uart_device(&Serial1); + device->begin(); + + uint8_t write_buf[4] = {0x5, 0x0, 0x0, 0x48}; + uint8_t read_buf[8]; + + Serial.println("Writing data..."); + if (!device->write(write_buf, 4)) { + Serial.println("Write failed!"); + return; + } + + Serial.println("Reading response..."); + if (!device->read(read_buf, 8)) { + Serial.println("Read failed!"); + return; + } + + Serial.print("Got response: "); + for (int i = 0; i < 8; i++) { + Serial.print("0x"); + Serial.print(read_buf[i], HEX); + Serial.print(" "); + } + Serial.println(); +} + +void loop() { delay(1000); } From 1a7e57883215809f1234c859916ec3f4659260cd Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 10:25:38 -0500 Subject: [PATCH 36/43] test skip for uart --- examples/genericdevice_uartregtest/.uno.test.skip | 0 examples/genericdevice_uarttest/.uno.test.skip | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/genericdevice_uartregtest/.uno.test.skip create mode 100644 examples/genericdevice_uarttest/.uno.test.skip diff --git a/examples/genericdevice_uartregtest/.uno.test.skip b/examples/genericdevice_uartregtest/.uno.test.skip new file mode 100644 index 0000000..e69de29 diff --git a/examples/genericdevice_uarttest/.uno.test.skip b/examples/genericdevice_uarttest/.uno.test.skip new file mode 100644 index 0000000..e69de29 From 8a32dc72c99695a77dcc479d55a575d22161b4eb Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 15:03:00 -0500 Subject: [PATCH 37/43] refactor the whole thing to get rid of static-ness. also clang examples --- Adafruit_GenericDevice.cpp | 60 ++-- Adafruit_GenericDevice.h | 23 +- .../genericdevice_uartregtest.ino | 97 +++--- .../genericdevice_uarttest.ino | 61 ++-- .../i2c_address_detect/i2c_address_detect.ino | 11 +- examples/i2c_readwrite/i2c_readwrite.ino | 26 +- examples/i2c_registers/i2c_registers.ino | 29 +- .../i2corspi_register/i2corspi_register.ino | 16 +- examples/spi_modetest/spi_modetest.ino | 24 +- examples/spi_readwrite/spi_readwrite.ino | 26 +- .../spi_register_bits/spi_register_bits.ino | 290 +++++++++++------- examples/spi_registers/spi_registers.ino | 26 +- 12 files changed, 399 insertions(+), 290 deletions(-) diff --git a/Adafruit_GenericDevice.cpp b/Adafruit_GenericDevice.cpp index 2fab4f0..7fe5a10 100644 --- a/Adafruit_GenericDevice.cpp +++ b/Adafruit_GenericDevice.cpp @@ -6,16 +6,19 @@ #include "Adafruit_GenericDevice.h" -/*! @brief Create a Generic device with the provided read/write functions - @param read_func Function pointer for reading raw data - @param write_func Function pointer for writing raw data - @param readreg_func Function pointer for reading registers (optional) - @param writereg_func Function pointer for writing registers (optional) */ +/*! + * @brief Create a Generic device with the provided read/write functions + * @param obj Pointer to object instance + * @param read_func Function pointer for reading raw data + * @param write_func Function pointer for writing raw data + * @param readreg_func Function pointer for reading registers (optional) + * @param writereg_func Function pointer for writing registers (optional) */ Adafruit_GenericDevice::Adafruit_GenericDevice( - busio_genericdevice_read_t read_func, + void *obj, busio_genericdevice_read_t read_func, busio_genericdevice_write_t write_func, busio_genericdevice_readreg_t readreg_func, busio_genericdevice_writereg_t writereg_func) { + _obj = obj; _read_func = read_func; _write_func = write_func; _readreg_func = readreg_func; @@ -23,56 +26,57 @@ Adafruit_GenericDevice::Adafruit_GenericDevice( _begun = false; } -/*! @brief Initializes the device - @return true if initialization was successful, otherwise false */ +/*! @brief Simple begin function (doesn't do much at this time) + @return true always +*/ bool Adafruit_GenericDevice::begin(void) { _begun = true; return true; } /*! @brief Write a buffer of data - @param buffer Pointer to buffer of data to write - @param len Number of bytes to write - @return true if write was successful, otherwise false */ + @param buffer Pointer to buffer of data to write + @param len Number of bytes to write + @return true if write was successful, otherwise false */ bool Adafruit_GenericDevice::write(const uint8_t *buffer, size_t len) { if (!_begun) return false; - return _write_func(buffer, len); + return _write_func(_obj, buffer, len); } /*! @brief Read data into a buffer - @param buffer Pointer to buffer to read data into - @param len Number of bytes to read - @return true if read was successful, otherwise false */ + @param buffer Pointer to buffer to read data into + @param len Number of bytes to read + @return true if read was successful, otherwise false */ bool Adafruit_GenericDevice::read(uint8_t *buffer, size_t len) { if (!_begun) return false; - return _read_func(buffer, len); + return _read_func(_obj, buffer, len); } /*! @brief Read from a register location - @param addr_buf Buffer containing register address - @param addrsiz Size of register address in bytes - @param buf Buffer to store read data - @param bufsiz Size of data to read in bytes - @return true if read was successful, otherwise false */ + @param addr_buf Buffer containing register address + @param addrsiz Size of register address in bytes + @param buf Buffer to store read data + @param bufsiz Size of data to read in bytes + @return true if read was successful, otherwise false */ bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz) { if (!_begun || !_readreg_func) return false; - return _readreg_func(addr_buf, addrsiz, buf, bufsiz); + return _readreg_func(_obj, addr_buf, addrsiz, buf, bufsiz); } /*! @brief Write to a register location - @param addr_buf Buffer containing register address - @param addrsiz Size of register address in bytes - @param buf Buffer containing data to write - @param bufsiz Size of data to write in bytes - @return true if write was successful, otherwise false */ + @param addr_buf Buffer containing register address + @param addrsiz Size of register address in bytes + @param buf Buffer containing data to write + @param bufsiz Size of data to write in bytes + @return true if write was successful, otherwise false */ bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz) { if (!_begun || !_writereg_func) return false; - return _writereg_func(addr_buf, addrsiz, buf, bufsiz); + return _writereg_func(_obj, addr_buf, addrsiz, buf, bufsiz); } diff --git a/Adafruit_GenericDevice.h b/Adafruit_GenericDevice.h index 7dd032f..14bb8ae 100644 --- a/Adafruit_GenericDevice.h +++ b/Adafruit_GenericDevice.h @@ -3,15 +3,17 @@ #include -typedef bool (*busio_genericdevice_read_t)(uint8_t *buffer, size_t len); -typedef bool (*busio_genericdevice_write_t)(const uint8_t *buffer, size_t len); -typedef bool (*busio_genericdevice_readreg_t)(uint8_t *addr_buf, - uint8_t addrsiz, uint8_t *buf, - uint16_t bufsiz); -typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf, +typedef bool (*busio_genericdevice_read_t)(void *obj, uint8_t *buffer, + size_t len); +typedef bool (*busio_genericdevice_write_t)(void *obj, const uint8_t *buffer, + size_t len); +typedef bool (*busio_genericdevice_readreg_t)(void *obj, uint8_t *addr_buf, + uint8_t addrsiz, uint8_t *data, + uint16_t datalen); +typedef bool (*busio_genericdevice_writereg_t)(void *obj, uint8_t *addr_buf, uint8_t addrsiz, - const uint8_t *buf, - uint16_t bufsiz); + const uint8_t *data, + uint16_t datalen); /*! * @brief Class for communicating with a device via generic read/write functions @@ -19,7 +21,7 @@ typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf, class Adafruit_GenericDevice { public: Adafruit_GenericDevice( - busio_genericdevice_read_t read_func, + void *obj, busio_genericdevice_read_t read_func, busio_genericdevice_write_t write_func, busio_genericdevice_readreg_t readreg_func = nullptr, busio_genericdevice_writereg_t writereg_func = nullptr); @@ -45,6 +47,9 @@ protected: bool _begun; ///< whether we have initialized yet (in case the function needs ///< to do something) + +private: + void *_obj; ///< Pointer to object instance }; #endif // ADAFRUIT_GENERICDEVICE_H diff --git a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino index d9f3fab..59af308 100644 --- a/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino +++ b/examples/genericdevice_uartregtest/genericdevice_uartregtest.ino @@ -1,17 +1,17 @@ /* - Advanced example of using bstracted transport for reading and writing + Advanced example of using bstracted transport for reading and writing register data from a UART-based device such as a TMC2209 - Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c - (at this time chats are not shareable :( + Written with help by Claude! + https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c (at this time + chats are not shareable :( */ - #include "Adafruit_BusIO_Register.h" #include "Adafruit_GenericDevice.h" // Debugging macros -//#define DEBUG_SERIAL Serial +#define DEBUG_SERIAL Serial #ifdef DEBUG_SERIAL #define DEBUG_PRINT(x) DEBUG_SERIAL.print(x) @@ -29,36 +29,17 @@ #define DEBUG_PRINT_HEX(x) #endif -// Add IOIN register definition #define TMC2209_IOIN 0x06 class TMC2209_UART { private: - static TMC2209_UART *_instance; Stream *_uart_stream; uint8_t _addr; - static bool uart_read_impl(uint8_t *buffer, size_t len) { - return _instance->uart_read_fn(buffer, len); - } - - static bool uart_write_impl(const uint8_t *buffer, size_t len) { - return _instance->uart_write_fn(buffer, len); - } - - static bool uart_readreg_impl(uint8_t *addr_buf, uint8_t addrsiz, - uint8_t *data, uint16_t datalen) { - return _instance->uart_readreg_fn(addr_buf, addrsiz, data, datalen); - } - - static bool uart_writereg_impl(uint8_t *addr_buf, uint8_t addrsiz, - const uint8_t *data, uint16_t datalen) { - return _instance->uart_writereg_fn(addr_buf, addrsiz, data, datalen); - } - - bool uart_read_fn(uint8_t *buffer, size_t len) { + static bool uart_read(void *thiz, uint8_t *buffer, size_t len) { + TMC2209_UART *dev = (TMC2209_UART *)thiz; uint16_t timeout = 100; - while (_uart_stream->available() < len && timeout--) { + while (dev->_uart_stream->available() < len && timeout--) { delay(1); } if (timeout == 0) { @@ -68,7 +49,7 @@ private: DEBUG_PRINT("Reading: "); for (size_t i = 0; i < len; i++) { - buffer[i] = _uart_stream->read(); + buffer[i] = dev->_uart_stream->read(); DEBUG_PRINT_HEX(buffer[i]); } DEBUG_PRINTLN(""); @@ -76,31 +57,33 @@ private: return true; } - bool uart_write_fn(const uint8_t *buffer, size_t len) { + static bool uart_write(void *thiz, const uint8_t *buffer, size_t len) { + TMC2209_UART *dev = (TMC2209_UART *)thiz; DEBUG_PRINT("Writing: "); for (size_t i = 0; i < len; i++) { DEBUG_PRINT_HEX(buffer[i]); } DEBUG_PRINTLN(""); - _uart_stream->write(buffer, len); + dev->_uart_stream->write(buffer, len); return true; } - bool uart_readreg_fn(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *data, - uint16_t datalen) { - while (_uart_stream->available()) - _uart_stream->read(); + static bool uart_readreg(void *thiz, uint8_t *addr_buf, uint8_t addrsiz, + uint8_t *data, uint16_t datalen) { + TMC2209_UART *dev = (TMC2209_UART *)thiz; + while (dev->_uart_stream->available()) + dev->_uart_stream->read(); - uint8_t packet[4] = {0x05, uint8_t(_addr << 1), addr_buf[0], 0x00}; + uint8_t packet[4] = {0x05, uint8_t(dev->_addr << 1), addr_buf[0], 0x00}; packet[3] = calcCRC(packet, 3); - if (!uart_write_impl(packet, 4)) + if (!uart_write(thiz, packet, 4)) return false; // Read back echo uint8_t echo[4]; - if (!uart_read_impl(echo, 4)) + if (!uart_read(thiz, echo, 4)) return false; // Verify echo @@ -112,7 +95,7 @@ private: } uint8_t response[8]; // sync + 0xFF + reg + 4 data bytes + CRC - if (!uart_read_impl(response, 8)) + if (!uart_read(thiz, response, 8)) return false; // Verify response @@ -121,38 +104,34 @@ private: return false; } - // Verify 0xFF address byte if (response[1] != 0xFF) { DEBUG_PRINTLN("Invalid reply address"); return false; } - // Verify register address matches our request if (response[2] != addr_buf[0]) { DEBUG_PRINTLN("Register mismatch"); return false; } - // Verify CRC - uint8_t crc = calcCRC(response, 7); // Calculate CRC of all but last byte + uint8_t crc = calcCRC(response, 7); if (crc != response[7]) { DEBUG_PRINTLN("CRC mismatch"); return false; } - // Copy the data bytes memcpy(data, &response[3], 4); - return true; } - bool uart_writereg_fn(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *data, - uint16_t datalen) { - while (_uart_stream->available()) - _uart_stream->read(); + static bool uart_writereg(void *thiz, uint8_t *addr_buf, uint8_t addrsiz, + const uint8_t *data, uint16_t datalen) { + TMC2209_UART *dev = (TMC2209_UART *)thiz; + while (dev->_uart_stream->available()) + dev->_uart_stream->read(); uint8_t packet[8] = {0x05, - uint8_t(_addr << 1), + uint8_t(dev->_addr << 1), uint8_t(addr_buf[0] | 0x80), data[0], data[1], @@ -161,15 +140,13 @@ private: 0x00}; packet[7] = calcCRC(packet, 7); - if (!uart_write_impl(packet, 8)) + if (!uart_write(thiz, packet, 8)) return false; - // Read and verify echo uint8_t echo[8]; - if (!uart_read_impl(echo, 8)) + if (!uart_read(thiz, echo, 8)) return false; - // Verify echo matches what we sent for (uint8_t i = 0; i < 8; i++) { if (echo[i] != packet[i]) { DEBUG_PRINTLN("Write echo mismatch"); @@ -198,18 +175,14 @@ private: public: TMC2209_UART(Stream *serial, uint8_t addr) - : _uart_stream(serial), _addr(addr) { - _instance = this; - } + : _uart_stream(serial), _addr(addr) {} Adafruit_GenericDevice *createDevice() { - return new Adafruit_GenericDevice(uart_read_impl, uart_write_impl, - uart_readreg_impl, uart_writereg_impl); + return new Adafruit_GenericDevice(this, uart_read, uart_write, uart_readreg, + uart_writereg); } }; -TMC2209_UART *TMC2209_UART::_instance = nullptr; - void setup() { Serial.begin(115200); while (!Serial) @@ -232,7 +205,7 @@ void setup() { Serial.print("IOIN = 0x"); Serial.println(ioin_reg.read(), HEX); - // Create RegisterBits for VERSION field (bits 28:24) + // Create RegisterBits for VERSION field (bits 31:24) Adafruit_BusIO_RegisterBits version_bits( &ioin_reg, 8, 24); // 8 bits wide, starting at bit 24 @@ -243,4 +216,4 @@ void setup() { Serial.println(version, HEX); } -void loop() { delay(1000); } +void loop() { delay(1000); } \ No newline at end of file diff --git a/examples/genericdevice_uarttest/genericdevice_uarttest.ino b/examples/genericdevice_uarttest/genericdevice_uarttest.ino index bc4175c..6a11dbf 100644 --- a/examples/genericdevice_uarttest/genericdevice_uarttest.ino +++ b/examples/genericdevice_uarttest/genericdevice_uarttest.ino @@ -1,39 +1,57 @@ -/* - Abstracted transport for reading and writing data from a UART-based +/* + Abstracted transport for reading and writing data from a UART-based device such as a TMC2209 - Written with help by Claude! https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c - (at this time chats are not shareable :( + Written with help by Claude! + https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c (at this time + chats are not shareable :( */ #include "Adafruit_GenericDevice.h" -Stream *uart_stream; // Will hold the pointer to our Stream object +/** + * Basic UART device class that demonstrates using GenericDevice with a Stream + * interface. This example shows how to wrap a Stream (like HardwareSerial or + * SoftwareSerial) with read/write callbacks that can be used by BusIO's + * register functions. + */ +class UARTDevice { +public: + UARTDevice(Stream *serial) : _serial(serial) {} -Adafruit_GenericDevice *create_uart_device(Stream *serial_port) { - uart_stream = serial_port; // Store the Stream pointer - - auto uart_write = [](const uint8_t *buffer, size_t len) -> bool { - uart_stream->write(buffer, len); + // Static callback for writing data to UART + // Called by GenericDevice when data needs to be sent + static bool uart_write(void *thiz, const uint8_t *buffer, size_t len) { + UARTDevice *dev = (UARTDevice *)thiz; + dev->_serial->write(buffer, len); return true; - }; + } - auto uart_read = [](uint8_t *buffer, size_t len) -> bool { + // Static callback for reading data from UART + // Includes timeout and will return false if not enough data available + static bool uart_read(void *thiz, uint8_t *buffer, size_t len) { + UARTDevice *dev = (UARTDevice *)thiz; uint16_t timeout = 100; - while (uart_stream->available() < len && timeout--) { + while (dev->_serial->available() < len && timeout--) { delay(1); } if (timeout == 0) { return false; } for (size_t i = 0; i < len; i++) { - buffer[i] = uart_stream->read(); + buffer[i] = dev->_serial->read(); } return true; - }; + } - return new Adafruit_GenericDevice(uart_read, uart_write); -} + // Create a GenericDevice instance using our callbacks + Adafruit_GenericDevice *createDevice() { + return new Adafruit_GenericDevice(this, uart_read, uart_write); + } + +private: + Stream *_serial; // Underlying Stream instance (HardwareSerial, etc) +}; void setup() { Serial.begin(115200); @@ -43,11 +61,15 @@ void setup() { Serial.println("Generic Device test!"); + // Initialize UART for device communication Serial1.begin(115200); - Adafruit_GenericDevice *device = create_uart_device(&Serial1); + // Create UART wrapper and BusIO device + UARTDevice uart(&Serial1); + Adafruit_GenericDevice *device = uart.createDevice(); device->begin(); + // Test write/read cycle uint8_t write_buf[4] = {0x5, 0x0, 0x0, 0x48}; uint8_t read_buf[8]; @@ -63,6 +85,7 @@ void setup() { return; } + // Print response bytes Serial.print("Got response: "); for (int i = 0; i < 8; i++) { Serial.print("0x"); @@ -72,4 +95,4 @@ void setup() { Serial.println(); } -void loop() { delay(1000); } +void loop() { delay(1000); } \ No newline at end of file diff --git a/examples/i2c_address_detect/i2c_address_detect.ino b/examples/i2c_address_detect/i2c_address_detect.ino index b150525..f2e6ba7 100644 --- a/examples/i2c_address_detect/i2c_address_detect.ino +++ b/examples/i2c_address_detect/i2c_address_detect.ino @@ -3,19 +3,20 @@ Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(0x10); void setup() { - while (!Serial) { delay(10); } + while (!Serial) { + delay(10); + } Serial.begin(115200); Serial.println("I2C address detection test"); if (!i2c_dev.begin()) { Serial.print("Did not find device at 0x"); Serial.println(i2c_dev.address(), HEX); - while (1); + while (1) + ; } Serial.print("Device found on address 0x"); Serial.println(i2c_dev.address(), HEX); } -void loop() { - -} +void loop() {} diff --git a/examples/i2c_readwrite/i2c_readwrite.ino b/examples/i2c_readwrite/i2c_readwrite.ino index 909cf31..4ac2626 100644 --- a/examples/i2c_readwrite/i2c_readwrite.ino +++ b/examples/i2c_readwrite/i2c_readwrite.ino @@ -3,16 +3,18 @@ #define I2C_ADDRESS 0x60 Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS); - void setup() { - while (!Serial) { delay(10); } + while (!Serial) { + delay(10); + } Serial.begin(115200); Serial.println("I2C device read and write test"); if (!i2c_dev.begin()) { Serial.print("Did not find device at 0x"); Serial.println(i2c_dev.address(), HEX); - while (1); + while (1) + ; } Serial.print("Device found on address 0x"); Serial.println(i2c_dev.address(), HEX); @@ -21,21 +23,23 @@ void setup() { // Try to read 32 bytes i2c_dev.read(buffer, 32); Serial.print("Read: "); - for (uint8_t i=0; i<32; i++) { - Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + for (uint8_t i = 0; i < 32; i++) { + Serial.print("0x"); + Serial.print(buffer[i], HEX); + Serial.print(", "); } Serial.println(); // read a register by writing first, then reading - buffer[0] = 0x0C; // we'll reuse the same buffer + buffer[0] = 0x0C; // we'll reuse the same buffer i2c_dev.write_then_read(buffer, 1, buffer, 2, false); Serial.print("Write then Read: "); - for (uint8_t i=0; i<2; i++) { - Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + for (uint8_t i = 0; i < 2; i++) { + Serial.print("0x"); + Serial.print(buffer[i], HEX); + Serial.print(", "); } Serial.println(); } -void loop() { - -} +void loop() {} diff --git a/examples/i2c_registers/i2c_registers.ino b/examples/i2c_registers/i2c_registers.ino index 41a3043..2d44c83 100644 --- a/examples/i2c_registers/i2c_registers.ino +++ b/examples/i2c_registers/i2c_registers.ino @@ -1,38 +1,43 @@ -#include #include +#include #define I2C_ADDRESS 0x60 Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS); - void setup() { - while (!Serial) { delay(10); } + while (!Serial) { + delay(10); + } Serial.begin(115200); Serial.println("I2C device register test"); if (!i2c_dev.begin()) { Serial.print("Did not find device at 0x"); Serial.println(i2c_dev.address(), HEX); - while (1); + while (1) + ; } Serial.print("Device found on address 0x"); Serial.println(i2c_dev.address(), HEX); - Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&i2c_dev, 0x0C, 2, LSBFIRST); + Adafruit_BusIO_Register id_reg = + Adafruit_BusIO_Register(&i2c_dev, 0x0C, 2, LSBFIRST); uint16_t id; id_reg.read(&id); - Serial.print("ID register = 0x"); Serial.println(id, HEX); + Serial.print("ID register = 0x"); + Serial.println(id, HEX); - Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register(&i2c_dev, 0x01, 2, LSBFIRST); + Adafruit_BusIO_Register thresh_reg = + Adafruit_BusIO_Register(&i2c_dev, 0x01, 2, LSBFIRST); uint16_t thresh; thresh_reg.read(&thresh); - Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX); + 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); + Serial.print("Post threshold register = 0x"); + Serial.println(thresh_reg.read(), HEX); } -void loop() { - -} \ No newline at end of file +void loop() {} \ No newline at end of file diff --git a/examples/i2corspi_register/i2corspi_register.ino b/examples/i2corspi_register/i2corspi_register.ino index 992a2e0..be04606 100644 --- a/examples/i2corspi_register/i2corspi_register.ino +++ b/examples/i2corspi_register/i2corspi_register.ino @@ -9,7 +9,9 @@ Adafruit_SPIDevice *spi_dev = NULL; // new Adafruit_SPIDevice(SPIDEVICE_CS); Adafruit_I2CDevice *i2c_dev = new Adafruit_I2CDevice(I2C_ADDRESS); void setup() { - while (!Serial) { delay(10); } + while (!Serial) { + delay(10); + } Serial.begin(115200); Serial.println("I2C or SPI device register test"); @@ -27,12 +29,12 @@ void setup() { } } - Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, 0x0F); - uint8_t id=0; + Adafruit_BusIO_Register id_reg = + Adafruit_BusIO_Register(i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, 0x0F); + uint8_t id = 0; id_reg.read(&id); - Serial.print("ID register = 0x"); Serial.println(id, HEX); + Serial.print("ID register = 0x"); + Serial.println(id, HEX); } -void loop() { - -} +void loop() {} diff --git a/examples/spi_modetest/spi_modetest.ino b/examples/spi_modetest/spi_modetest.ino index 10168c5..ebf14f9 100644 --- a/examples/spi_modetest/spi_modetest.ino +++ b/examples/spi_modetest/spi_modetest.ino @@ -1,28 +1,34 @@ #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); - +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); } + 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); + 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); + 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("/"); + Serial.print(i, HEX); Serial.print(", "); delay(25); } diff --git a/examples/spi_readwrite/spi_readwrite.ino b/examples/spi_readwrite/spi_readwrite.ino index 6f2c063..4b9ecf1 100644 --- a/examples/spi_readwrite/spi_readwrite.ino +++ b/examples/spi_readwrite/spi_readwrite.ino @@ -3,15 +3,17 @@ #define SPIDEVICE_CS 10 Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS); - void setup() { - while (!Serial) { delay(10); } + while (!Serial) { + delay(10); + } Serial.begin(115200); Serial.println("SPI device read and write test"); if (!spi_dev.begin()) { Serial.println("Could not initialize SPI device"); - while (1); + while (1) + ; } uint8_t buffer[32]; @@ -19,21 +21,23 @@ void setup() { // Try to read 32 bytes spi_dev.read(buffer, 32); Serial.print("Read: "); - for (uint8_t i=0; i<32; i++) { - Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + for (uint8_t i = 0; i < 32; i++) { + Serial.print("0x"); + Serial.print(buffer[i], HEX); + Serial.print(", "); } Serial.println(); // read a register by writing first, then reading - buffer[0] = 0x8F; // we'll reuse the same buffer + buffer[0] = 0x8F; // we'll reuse the same buffer spi_dev.write_then_read(buffer, 1, buffer, 2, false); Serial.print("Write then Read: "); - for (uint8_t i=0; i<2; i++) { - Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", "); + for (uint8_t i = 0; i < 2; i++) { + Serial.print("0x"); + Serial.print(buffer[i], HEX); + Serial.print(", "); } Serial.println(); } -void loop() { - -} +void loop() {} diff --git a/examples/spi_register_bits/spi_register_bits.ino b/examples/spi_register_bits/spi_register_bits.ino index e70a17b..d11b440 100644 --- a/examples/spi_register_bits/spi_register_bits.ino +++ b/examples/spi_register_bits/spi_register_bits.ino @@ -1,163 +1,233 @@ -/*************************************************** +/*************************************************** - This is an example for how to use Adafruit_BusIO_RegisterBits from Adafruit_BusIO library. + This is an example for how to use Adafruit_BusIO_RegisterBits from + Adafruit_BusIO library. Designed specifically to work with the Adafruit RTD Sensor ----> https://www.adafruit.com/products/3328 uisng a MAX31865 RTD-to-Digital Converter ----> https://datasheets.maximintegrated.com/en/ds/MAX31865.pdf - This sensor uses SPI to communicate, 4 pins are required to + This sensor uses SPI to communicate, 4 pins are required to interface. A fifth pin helps to detect when a new conversion is ready. - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing products from Adafruit! - Example written (2020/3) by Andreas Hardtung/AnHard. + Example written (2020/3) by Andreas Hardtung/AnHard. BSD license, all text above must be included in any redistribution ****************************************************/ #include #include -#define MAX31865_SPI_SPEED (5000000) +#define MAX31865_SPI_SPEED (5000000) #define MAX31865_SPI_BITORDER (SPI_BITORDER_MSBFIRST) -#define MAX31865_SPI_MODE (SPI_MODE1) +#define MAX31865_SPI_MODE (SPI_MODE1) -#define MAX31865_SPI_CS (10) -#define MAX31865_READY_PIN (2) +#define MAX31865_SPI_CS (10) +#define MAX31865_READY_PIN (2) +Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( + MAX31865_SPI_CS, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, + MAX31865_SPI_MODE, &SPI); // Hardware SPI +// Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, 13, 12, 11, +// MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE); // Software +// SPI -Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE, &SPI); // Hardware SPI -// Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice( MAX31865_SPI_CS, 13, 12, 11, MAX31865_SPI_SPEED, MAX31865_SPI_BITORDER, MAX31865_SPI_MODE); // Software SPI +// MAX31865 chip related +// ********************************************************************************************* +Adafruit_BusIO_Register config_reg = + Adafruit_BusIO_Register(&spi_dev, 0x00, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST); +Adafruit_BusIO_RegisterBits bias_bit = + Adafruit_BusIO_RegisterBits(&config_reg, 1, 7); +Adafruit_BusIO_RegisterBits auto_bit = + Adafruit_BusIO_RegisterBits(&config_reg, 1, 6); +Adafruit_BusIO_RegisterBits oneS_bit = + Adafruit_BusIO_RegisterBits(&config_reg, 1, 5); +Adafruit_BusIO_RegisterBits wire_bit = + Adafruit_BusIO_RegisterBits(&config_reg, 1, 4); +Adafruit_BusIO_RegisterBits faultT_bits = + Adafruit_BusIO_RegisterBits(&config_reg, 2, 2); +Adafruit_BusIO_RegisterBits faultR_bit = + Adafruit_BusIO_RegisterBits(&config_reg, 1, 1); +Adafruit_BusIO_RegisterBits fi50hz_bit = + Adafruit_BusIO_RegisterBits(&config_reg, 1, 0); -// MAX31865 chip related ********************************************************************************************* -Adafruit_BusIO_Register config_reg = Adafruit_BusIO_Register(&spi_dev, 0x00, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST); -Adafruit_BusIO_RegisterBits bias_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 7); -Adafruit_BusIO_RegisterBits auto_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 6); -Adafruit_BusIO_RegisterBits oneS_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 5); -Adafruit_BusIO_RegisterBits wire_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 4); -Adafruit_BusIO_RegisterBits faultT_bits = Adafruit_BusIO_RegisterBits(&config_reg, 2, 2); -Adafruit_BusIO_RegisterBits faultR_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 1); -Adafruit_BusIO_RegisterBits fi50hz_bit = Adafruit_BusIO_RegisterBits(&config_reg, 1, 0); +Adafruit_BusIO_Register rRatio_reg = + Adafruit_BusIO_Register(&spi_dev, 0x01, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); +Adafruit_BusIO_RegisterBits rRatio_bits = + Adafruit_BusIO_RegisterBits(&rRatio_reg, 15, 1); +Adafruit_BusIO_RegisterBits fault_bit = + Adafruit_BusIO_RegisterBits(&rRatio_reg, 1, 0); -Adafruit_BusIO_Register rRatio_reg = Adafruit_BusIO_Register(&spi_dev, 0x01, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); -Adafruit_BusIO_RegisterBits rRatio_bits = Adafruit_BusIO_RegisterBits(&rRatio_reg, 15, 1); -Adafruit_BusIO_RegisterBits fault_bit = Adafruit_BusIO_RegisterBits(&rRatio_reg, 1, 0); +Adafruit_BusIO_Register maxRratio_reg = + Adafruit_BusIO_Register(&spi_dev, 0x03, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); +Adafruit_BusIO_RegisterBits maxRratio_bits = + Adafruit_BusIO_RegisterBits(&maxRratio_reg, 15, 1); -Adafruit_BusIO_Register maxRratio_reg = Adafruit_BusIO_Register(&spi_dev, 0x03, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); -Adafruit_BusIO_RegisterBits maxRratio_bits = Adafruit_BusIO_RegisterBits(&maxRratio_reg, 15, 1); +Adafruit_BusIO_Register minRratio_reg = + Adafruit_BusIO_Register(&spi_dev, 0x05, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); +Adafruit_BusIO_RegisterBits minRratio_bits = + Adafruit_BusIO_RegisterBits(&minRratio_reg, 15, 1); -Adafruit_BusIO_Register minRratio_reg = Adafruit_BusIO_Register(&spi_dev, 0x05, ADDRBIT8_HIGH_TOWRITE, 2, MSBFIRST); -Adafruit_BusIO_RegisterBits minRratio_bits = Adafruit_BusIO_RegisterBits(&minRratio_reg, 15, 1); - -Adafruit_BusIO_Register fault_reg = Adafruit_BusIO_Register(&spi_dev, 0x07, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST); -Adafruit_BusIO_RegisterBits range_high_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 7); -Adafruit_BusIO_RegisterBits range_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 6); -Adafruit_BusIO_RegisterBits refin_high_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 5); -Adafruit_BusIO_RegisterBits refin_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 4); -Adafruit_BusIO_RegisterBits rtdin_low_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 3); -Adafruit_BusIO_RegisterBits voltage_fault_bit = Adafruit_BusIO_RegisterBits(&fault_reg, 1, 2); +Adafruit_BusIO_Register fault_reg = + Adafruit_BusIO_Register(&spi_dev, 0x07, ADDRBIT8_HIGH_TOWRITE, 1, MSBFIRST); +Adafruit_BusIO_RegisterBits range_high_fault_bit = + Adafruit_BusIO_RegisterBits(&fault_reg, 1, 7); +Adafruit_BusIO_RegisterBits range_low_fault_bit = + Adafruit_BusIO_RegisterBits(&fault_reg, 1, 6); +Adafruit_BusIO_RegisterBits refin_high_fault_bit = + Adafruit_BusIO_RegisterBits(&fault_reg, 1, 5); +Adafruit_BusIO_RegisterBits refin_low_fault_bit = + Adafruit_BusIO_RegisterBits(&fault_reg, 1, 4); +Adafruit_BusIO_RegisterBits rtdin_low_fault_bit = + Adafruit_BusIO_RegisterBits(&fault_reg, 1, 3); +Adafruit_BusIO_RegisterBits voltage_fault_bit = + Adafruit_BusIO_RegisterBits(&fault_reg, 1, 2); // Print the details of the configuration register. -void printConfig( void ) { - Serial.print("BIAS: "); if (bias_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); - Serial.print(", AUTO: "); if (auto_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); - Serial.print(", ONES: "); if (oneS_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); - Serial.print(", WIRE: "); if (wire_bit.read() ) Serial.print("3"); else Serial.print("2/4"); - Serial.print(", FAULTCLEAR: "); if (faultR_bit.read() ) Serial.print("ON"); else Serial.print("OFF"); - Serial.print(", "); if (fi50hz_bit.read() ) Serial.print("50HZ"); else Serial.print("60HZ"); +void printConfig(void) { + Serial.print("BIAS: "); + if (bias_bit.read()) + Serial.print("ON"); + else + Serial.print("OFF"); + Serial.print(", AUTO: "); + if (auto_bit.read()) + Serial.print("ON"); + else + Serial.print("OFF"); + Serial.print(", ONES: "); + if (oneS_bit.read()) + Serial.print("ON"); + else + Serial.print("OFF"); + Serial.print(", WIRE: "); + if (wire_bit.read()) + Serial.print("3"); + else + Serial.print("2/4"); + Serial.print(", FAULTCLEAR: "); + if (faultR_bit.read()) + Serial.print("ON"); + else + Serial.print("OFF"); + Serial.print(", "); + if (fi50hz_bit.read()) + Serial.print("50HZ"); + else + Serial.print("60HZ"); Serial.println(); } // Check and print faults. Then clear them. -void checkFaults( void ) { +void checkFaults(void) { if (fault_bit.read()) { - Serial.print("MAX: "); Serial.println(maxRratio_bits.read()); - Serial.print("VAL: "); Serial.println( rRatio_bits.read()); - Serial.print("MIN: "); Serial.println(minRratio_bits.read()); + Serial.print("MAX: "); + Serial.println(maxRratio_bits.read()); + Serial.print("VAL: "); + Serial.println(rRatio_bits.read()); + Serial.print("MIN: "); + Serial.println(minRratio_bits.read()); - if (range_high_fault_bit.read() ) Serial.println("Range high fault"); - if ( range_low_fault_bit.read() ) Serial.println("Range low fault"); - if (refin_high_fault_bit.read() ) Serial.println("REFIN high fault"); - if ( refin_low_fault_bit.read() ) Serial.println("REFIN low fault"); - if ( rtdin_low_fault_bit.read() ) Serial.println("RTDIN low fault"); - if ( voltage_fault_bit.read() ) Serial.println("Voltage fault"); + if (range_high_fault_bit.read()) + Serial.println("Range high fault"); + if (range_low_fault_bit.read()) + Serial.println("Range low fault"); + if (refin_high_fault_bit.read()) + Serial.println("REFIN high fault"); + if (refin_low_fault_bit.read()) + Serial.println("REFIN low fault"); + if (rtdin_low_fault_bit.read()) + Serial.println("RTDIN low fault"); + if (voltage_fault_bit.read()) + Serial.println("Voltage fault"); faultR_bit.write(1); // clear fault } } void setup() { - #if (MAX31865_1_READY_PIN != -1) - pinMode(MAX31865_READY_PIN ,INPUT_PULLUP); - #endif +#if (MAX31865_1_READY_PIN != -1) + pinMode(MAX31865_READY_PIN, INPUT_PULLUP); +#endif - while (!Serial) { delay(10); } + while (!Serial) { + delay(10); + } Serial.begin(115200); Serial.println("SPI Adafruit_BusIO_RegisterBits test on MAX31865"); if (!spi_dev.begin()) { Serial.println("Could not initialize SPI device"); - while (1); + while (1) + ; } - // Set up for automode 50Hz. We don't care about selfheating. We want the highest possible sampling rate. + // Set up for automode 50Hz. We don't care about selfheating. We want the + // highest possible sampling rate. auto_bit.write(0); // Don't switch filtermode while auto_mode is on. fi50hz_bit.write(1); // Set filter to 50Hz mode. faultR_bit.write(1); // Clear faults. - bias_bit.write(1); // In automode we want to have the bias current always on. - delay(5); // Wait until bias current settles down. - // 10.5 time constants of the input RC network is required. - // 10ms worst case for 10kω reference resistor and a 0.1µF capacitor across the RTD inputs. - // Adafruit Module has 0.1µF and only 430/4300ω So here 0.43/4.3ms - auto_bit.write(1); // Now we can set automode. Automatically starting first conversion. + bias_bit.write(1); // In automode we want to have the bias current always on. + delay(5); // Wait until bias current settles down. + // 10.5 time constants of the input RC network is required. + // 10ms worst case for 10kω reference resistor and a 0.1µF capacitor + // across the RTD inputs. Adafruit Module has 0.1µF and only + // 430/4300ω So here 0.43/4.3ms + auto_bit.write( + 1); // Now we can set automode. Automatically starting first conversion. - // Test the READY_PIN - #if (defined( MAX31865_READY_PIN ) && (MAX31865_READY_PIN != -1)) - int i = 0; - while (digitalRead(MAX31865_READY_PIN) && i++ <= 100) { delay(1); } - if (i >= 100) { - Serial.print("ERROR: Max31865 Pin detection does not work. PIN:"); - Serial.println(MAX31865_READY_PIN); - } - #else - delay(100); - #endif +// Test the READY_PIN +#if (defined(MAX31865_READY_PIN) && (MAX31865_READY_PIN != -1)) + int i = 0; + while (digitalRead(MAX31865_READY_PIN) && i++ <= 100) { + delay(1); + } + if (i >= 100) { + Serial.print("ERROR: Max31865 Pin detection does not work. PIN:"); + Serial.println(MAX31865_READY_PIN); + } +#else + delay(100); +#endif // Set ratio range. - // Setting the temperatures would need some more calculation - not related to Adafruit_BusIO_RegisterBits. + // Setting the temperatures would need some more calculation - not related to + // Adafruit_BusIO_RegisterBits. uint16_t ratio = rRatio_bits.read(); - maxRratio_bits.write( (ratio < 0x8fffu-1000u) ? ratio + 1000u : 0x8fffu ); - minRratio_bits.write( (ratio > 1000u) ? ratio - 1000u : 0u ); + maxRratio_bits.write((ratio < 0x8fffu - 1000u) ? ratio + 1000u : 0x8fffu); + minRratio_bits.write((ratio > 1000u) ? ratio - 1000u : 0u); printConfig(); checkFaults(); } void loop() { - #if (defined( MAX31865_READY_PIN ) && (MAX31865_1_READY_PIN != -1)) - // Is conversion ready? - if (!digitalRead(MAX31865_READY_PIN)) - #else - // Warant conversion is ready. - delay(21); // 21ms for 50Hz-mode. 19ms in 60Hz-mode. - #endif - { - // Read ratio, calculate temperature, scale, filter and print. - Serial.println( rRatio2C( rRatio_bits.read() ) * 100.0f, 0); // Temperature scaled by 100 - // Check, print, clear faults. - checkFaults(); - } +#if (defined(MAX31865_READY_PIN) && (MAX31865_1_READY_PIN != -1)) + // Is conversion ready? + if (!digitalRead(MAX31865_READY_PIN)) +#else + // Warant conversion is ready. + delay(21); // 21ms for 50Hz-mode. 19ms in 60Hz-mode. +#endif + { + // Read ratio, calculate temperature, scale, filter and print. + Serial.println(rRatio2C(rRatio_bits.read()) * 100.0f, + 0); // Temperature scaled by 100 + // Check, print, clear faults. + checkFaults(); + } // Do something else. - //delay(15000); + // delay(15000); } - -// Module/Sensor related. Here Adafruit PT100 module with a 2_Wire PT100 Class C ***************************** +// Module/Sensor related. Here Adafruit PT100 module with a 2_Wire PT100 Class C +// ***************************** float rRatio2C(uint16_t ratio) { // A simple linear conversion. const float R0 = 100.0f; @@ -165,28 +235,34 @@ float rRatio2C(uint16_t ratio) { const float alphaPT = 0.003850f; const float ADCmax = (1u << 15) - 1.0f; const float rscale = Rref / ADCmax; - // Measured temperature in boiling water 101.08°C with factor a = 1 and b = 0. Rref and MAX at about 22±2°C. - // Measured temperature in ice/water bath 0.76°C with factor a = 1 and b = 0. Rref and MAX at about 22±2°C. - //const float a = 1.0f / (alphaPT * R0); - const float a = (100.0f/101.08f) / (alphaPT * R0); - //const float b = 0.0f; // 101.08 - const float b = -0.76f; // 100.32 > 101.08 + // Measured temperature in boiling water 101.08°C with factor a = 1 and b = 0. + // Rref and MAX at about 22±2°C. Measured temperature in ice/water bath 0.76°C + // with factor a = 1 and b = 0. Rref and MAX at about 22±2°C. + // const float a = 1.0f / (alphaPT * R0); + const float a = (100.0f / 101.08f) / (alphaPT * R0); + // const float b = 0.0f; // 101.08 + const float b = -0.76f; // 100.32 > 101.08 - return filterRing( ((ratio * rscale) - R0) * a + b ); + return filterRing(((ratio * rscale) - R0) * a + b); } -// General purpose ********************************************************************************************* +// General purpose +// ********************************************************************************************* #define RINGLENGTH 250 -float filterRing( float newVal ) { - static float ring[RINGLENGTH] = { 0.0 }; +float filterRing(float newVal) { + static float ring[RINGLENGTH] = {0.0}; static uint8_t ringIndex = 0; static bool ringFull = false; - if ( ringIndex == RINGLENGTH ) { ringFull = true; ringIndex = 0; } + if (ringIndex == RINGLENGTH) { + ringFull = true; + ringIndex = 0; + } ring[ringIndex] = newVal; uint8_t loopEnd = (ringFull) ? RINGLENGTH : ringIndex + 1; float ringSum = 0.0f; - for (uint8_t i = 0; i < loopEnd; i++) ringSum += ring[i]; + for (uint8_t i = 0; i < loopEnd; i++) + ringSum += ring[i]; ringIndex++; return ringSum / loopEnd; } diff --git a/examples/spi_registers/spi_registers.ino b/examples/spi_registers/spi_registers.ino index 091a353..af6069b 100644 --- a/examples/spi_registers/spi_registers.ino +++ b/examples/spi_registers/spi_registers.ino @@ -5,30 +5,36 @@ Adafruit_SPIDevice spi_dev = Adafruit_SPIDevice(SPIDEVICE_CS); void setup() { - while (!Serial) { delay(10); } + 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); + while (1) + ; } - Adafruit_BusIO_Register id_reg = Adafruit_BusIO_Register(&spi_dev, 0x0F, ADDRBIT8_HIGH_TOREAD); + Adafruit_BusIO_Register id_reg = + Adafruit_BusIO_Register(&spi_dev, 0x0F, ADDRBIT8_HIGH_TOREAD); uint8_t id = 0; id_reg.read(&id); - Serial.print("ID register = 0x"); Serial.println(id, HEX); + 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); + Adafruit_BusIO_Register thresh_reg = Adafruit_BusIO_Register( + &spi_dev, 0x0C, ADDRBIT8_HIGH_TOREAD, 2, LSBFIRST); uint16_t thresh = 0; thresh_reg.read(&thresh); - Serial.print("Initial threshold register = 0x"); Serial.println(thresh, HEX); + 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); + Serial.print("Post threshold register = 0x"); + Serial.println(thresh_reg.read(), HEX); } -void loop() { - -} +void loop() {} From 186ea352113565615c67e9cc11469ebfbf6587df Mon Sep 17 00:00:00 2001 From: ladyada Date: Wed, 8 Jan 2025 15:05:13 -0500 Subject: [PATCH 38/43] reclang --- Adafruit_I2CDevice.cpp | 2 +- Adafruit_SPIDevice.cpp | 2 +- Adafruit_SPIDevice.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index 08da1ea..2633cf1 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -1,6 +1,6 @@ #include "Adafruit_I2CDevice.h" -//#define DEBUG_SERIAL Serial +// #define DEBUG_SERIAL Serial /*! * @brief Create an I2C device at a given address diff --git a/Adafruit_SPIDevice.cpp b/Adafruit_SPIDevice.cpp index 034dc08..dc3672b 100644 --- a/Adafruit_SPIDevice.cpp +++ b/Adafruit_SPIDevice.cpp @@ -1,6 +1,6 @@ #include "Adafruit_SPIDevice.h" -//#define DEBUG_SERIAL Serial +// #define DEBUG_SERIAL Serial /*! * @brief Create an SPI device with the given CS pin and settings diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index fad0fbd..d0d5ae1 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -56,7 +56,7 @@ typedef BitOrder BusIOBitOrder; // ports set and clear registers which are atomic. // typedef volatile uint32_t BusIO_PortReg; // typedef uint32_t BusIO_PortMask; -//#define BUSIO_USE_FAST_PINIO +// #define BUSIO_USE_FAST_PINIO #elif defined(__MBED__) || defined(__ZEPHYR__) // Boards based on RTOS cores like mbed or Zephyr are not going to expose the From 276c7b3ad8b8040a1919c0f50051293dfedcef81 Mon Sep 17 00:00:00 2001 From: Makoto Schoppert Date: Fri, 31 Jan 2025 22:43:45 -0500 Subject: [PATCH 39/43] Update CMakeLists.txt Missing source file "Adafruit_GenericDevice.cpp" --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff6496c..3fcb0b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.5) -idf_component_register(SRCS "Adafruit_I2CDevice.cpp" "Adafruit_BusIO_Register.cpp" "Adafruit_SPIDevice.cpp" +idf_component_register(SRCS "Adafruit_I2CDevice.cpp" "Adafruit_BusIO_Register.cpp" "Adafruit_SPIDevice.cpp" "Adafruit_GenericDevice.cpp" INCLUDE_DIRS "." REQUIRES arduino-esp32) From 18a22e98ac65dc3a01255c51a22cc0444cde36d0 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sat, 26 Apr 2025 09:34:15 -0500 Subject: [PATCH 40/43] Add PORTDUINO check to Adafruit_SPIDevice.h The PORTDUINO target on ARMv7 was triggering the defined(__arm__) code block, and failing compilation as a result. Quick fix to check for PORTDUINO. --- Adafruit_SPIDevice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index d0d5ae1..25b681b 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -79,7 +79,7 @@ typedef uint32_t BusIO_PortMask; #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ !defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_SILABS) && \ - !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) + !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) && !defined(PORTDUINO) typedef volatile uint32_t BusIO_PortReg; typedef uint32_t BusIO_PortMask; #if !defined(__ASR6501__) && !defined(__ASR6502__) From fcd9217179e21b27b5823bf1894d720e79ea2981 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sat, 26 Apr 2025 09:47:42 -0500 Subject: [PATCH 41/43] fix for clang-format in Adafruit_SPIDevice.h --- Adafruit_SPIDevice.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adafruit_SPIDevice.h b/Adafruit_SPIDevice.h index 25b681b..4b86288 100644 --- a/Adafruit_SPIDevice.h +++ b/Adafruit_SPIDevice.h @@ -79,7 +79,8 @@ typedef uint32_t BusIO_PortMask; #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \ !defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_SILABS) && \ - !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) && !defined(PORTDUINO) + !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) && \ + !defined(PORTDUINO) typedef volatile uint32_t BusIO_PortReg; typedef uint32_t BusIO_PortMask; #if !defined(__ASR6501__) && !defined(__ASR6502__) From a09a91d13ecf321befb148e12304777db1633c7a Mon Sep 17 00:00:00 2001 From: Tyeth Gundry Date: Tue, 29 Apr 2025 13:04:24 +0100 Subject: [PATCH 42/43] Update library.properties - bump version to 1.17.1 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index bdff9e1..4f283cb 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.17.0 +version=1.17.1 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away UART, I2C and SPI interfacing From d8a04619f0b5d5e85ffe4655f22e9f86b96f7d4a Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 18 Jun 2025 16:01:02 -0400 Subject: [PATCH 43/43] Add - end() for GenericDevice --- Adafruit_GenericDevice.cpp | 8 ++++++++ Adafruit_GenericDevice.h | 1 + library.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Adafruit_GenericDevice.cpp b/Adafruit_GenericDevice.cpp index 7fe5a10..37f9cfd 100644 --- a/Adafruit_GenericDevice.cpp +++ b/Adafruit_GenericDevice.cpp @@ -34,6 +34,14 @@ bool Adafruit_GenericDevice::begin(void) { return true; } +/*! +@brief Marks the GenericDevice as no longer in use. +@note: Since this is a GenericDevice, if you are using this with a Serial +object, this does NOT disable serial communication or release the RX/TX pins. +That must be done manually by calling Serial.end(). +*/ +void Adafruit_GenericDevice::end(void) { _begun = false; } + /*! @brief Write a buffer of data @param buffer Pointer to buffer of data to write @param len Number of bytes to write diff --git a/Adafruit_GenericDevice.h b/Adafruit_GenericDevice.h index 14bb8ae..d5cb326 100644 --- a/Adafruit_GenericDevice.h +++ b/Adafruit_GenericDevice.h @@ -27,6 +27,7 @@ public: busio_genericdevice_writereg_t writereg_func = nullptr); bool begin(void); + void end(void); bool read(uint8_t *buffer, size_t len); bool write(const uint8_t *buffer, size_t len); diff --git a/library.properties b/library.properties index 4f283cb..0dd66ed 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit BusIO -version=1.17.1 +version=1.17.2 author=Adafruit maintainer=Adafruit sentence=This is a library for abstracting away UART, I2C and SPI interfacing