From 49704c92c736f37c1200c29b65a46d013abfac35 Mon Sep 17 00:00:00 2001 From: "Lars Erik G. Svendsen" Date: Fri, 25 Apr 2025 14:58:05 +0200 Subject: [PATCH 1/3] Added fix for SERIAL_TX_BUFFER_SIZE --- src/PD_UFP_Log.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/PD_UFP_Log.cpp b/src/PD_UFP_Log.cpp index ed1f48b..d82de38 100644 --- a/src/PD_UFP_Log.cpp +++ b/src/PD_UFP_Log.cpp @@ -228,6 +228,10 @@ int PD_UFP_Log_c::status_log_readline(char * buffer, int maxlen) return n; } +#ifndef SERIAL_TX_BUFFER_SIZE + #define SERIAL_TX_BUFFER_SIZE 64 +#endif + void PD_UFP_Log_c::print_status(HardwareSerial & serial) { // Wait for enough tx buffer in serial port to avoid blocking From 58e52b86dd94d56cc46b271a7f8dc45fdf65bb10 Mon Sep 17 00:00:00 2001 From: "Lars Erik G. Svendsen" Date: Mon, 28 Apr 2025 11:24:04 +0200 Subject: [PATCH 2/3] Added I2C bus as an input parameter to have option to not only use default I2C bus. Added I2C device address as input parameter, chip can be ordered with different addresses. --- src/FUSB302_UFP.cpp | 5 +++-- src/FUSB302_UFP.h | 6 ++++-- src/PD_UFP.cpp | 35 ++++++++++++++++++++--------------- src/PD_UFP.h | 8 +++++--- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/FUSB302_UFP.cpp b/src/FUSB302_UFP.cpp index 5f44715..c03fba7 100644 --- a/src/FUSB302_UFP.cpp +++ b/src/FUSB302_UFP.cpp @@ -16,6 +16,7 @@ */ #include +#include #include "FUSB302_UFP.h" /* Switches0 : 02h */ @@ -248,7 +249,7 @@ enum FUSB302_state_t { static inline FUSB302_ret_t reg_read(FUSB302_dev_t *dev, uint8_t address, uint8_t *data, uint8_t count) { - FUSB302_ret_t ret = dev->i2c_read(dev->i2c_address, address, data, count); + FUSB302_ret_t ret = dev->i2c_read(dev->i2c_address, address, data, count, dev->i2c_bus); if (ret != FUSB302_SUCCESS) { dev->err_msg = FUSB302_ERR_MSG("Fail to read register"); } @@ -257,7 +258,7 @@ static inline FUSB302_ret_t reg_read(FUSB302_dev_t *dev, uint8_t address, uint8_ static inline FUSB302_ret_t reg_write(FUSB302_dev_t *dev, uint8_t address, uint8_t *data, uint8_t count) { - FUSB302_ret_t ret = dev->i2c_write(dev->i2c_address, address, data, count); + FUSB302_ret_t ret = dev->i2c_write(dev->i2c_address, address, data, count, dev->i2c_bus); if (ret != FUSB302_SUCCESS) { dev->err_msg = FUSB302_ERR_MSG("Fail to write register"); } diff --git a/src/FUSB302_UFP.h b/src/FUSB302_UFP.h index 438e8cf..24787fc 100644 --- a/src/FUSB302_UFP.h +++ b/src/FUSB302_UFP.h @@ -39,10 +39,12 @@ typedef uint8_t FUSB302_event_t; typedef struct { /* setup by user */ uint8_t i2c_address; - FUSB302_ret_t (*i2c_read)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count); - FUSB302_ret_t (*i2c_write)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count); + TwoWire * i2c_bus; + FUSB302_ret_t (*i2c_read)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count, TwoWire * i2c_bus); + FUSB302_ret_t (*i2c_write)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count, TwoWire * i2c_bus); FUSB302_ret_t (*delay_ms)(uint32_t t); + /* used by this library */ const char * err_msg; uint16_t rx_header; diff --git a/src/PD_UFP.cpp b/src/PD_UFP.cpp index 050a395..a348e2d 100644 --- a/src/PD_UFP.cpp +++ b/src/PD_UFP.cpp @@ -15,7 +15,7 @@ #include #include - +#include #include "PD_UFP.h" #define t_PD_POLLING 100 @@ -42,7 +42,7 @@ enum { /////////////////////////////////////////////////////////////////////////////////////////////////// // PD_UFP_c /////////////////////////////////////////////////////////////////////////////////////////////////// -PD_UFP_c::PD_UFP_c(): +PD_UFP_c::PD_UFP_c(uint8_t i2c_address, TwoWire * i2c_bus): ready_voltage(0), ready_current(0), PPS_voltage_next(0), @@ -61,6 +61,8 @@ PD_UFP_c::PD_UFP_c(): { memset(&FUSB302, 0, sizeof(FUSB302_dev_t)); memset(&protocol, 0, sizeof(PD_protocol_t)); + _i2c_bus = i2c_bus; + _i2c_address = i2c_address; } void PD_UFP_c::init(uint8_t int_pin, enum PD_power_option_t power_option) @@ -73,10 +75,13 @@ void PD_UFP_c::init_PPS(uint8_t int_pin, uint16_t PPS_voltage, uint8_t PPS_curre this->int_pin = int_pin; // Initialize FUSB302 pinMode(int_pin, INPUT_PULLUP); // Set FUSB302 int pin input ant pull up - FUSB302.i2c_address = 0x22; + //FUSB302.i2c_address = 0x22; + FUSB302.i2c_address = _i2c_address; FUSB302.i2c_read = FUSB302_i2c_read; FUSB302.i2c_write = FUSB302_i2c_write; FUSB302.delay_ms = FUSB302_delay_ms; + //FUSB302.i2c_bus = &Wire; + FUSB302.i2c_bus = _i2c_bus; if (FUSB302_init(&FUSB302) == FUSB302_SUCCESS && FUSB302_get_ID(&FUSB302, 0, 0) == FUSB302_SUCCESS) { status_initialized = 1; } @@ -130,28 +135,28 @@ void PD_UFP_c::clock_prescale_set(uint8_t prescaler) } } -FUSB302_ret_t PD_UFP_c::FUSB302_i2c_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count) +FUSB302_ret_t PD_UFP_c::FUSB302_i2c_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count, TwoWire * i2c_bus) { - Wire.beginTransmission(dev_addr); - Wire.write(reg_addr); - Wire.endTransmission(); - Wire.requestFrom(dev_addr, count); - while (Wire.available() && count > 0) { - *data++ = Wire.read(); + i2c_bus->beginTransmission(dev_addr); + i2c_bus->write(reg_addr); + i2c_bus->endTransmission(); + i2c_bus->requestFrom(dev_addr, count); + while (i2c_bus->available() && count > 0) { + *data++ = i2c_bus->read(); count--; } return count == 0 ? FUSB302_SUCCESS : FUSB302_ERR_READ_DEVICE; } -FUSB302_ret_t PD_UFP_c::FUSB302_i2c_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count) +FUSB302_ret_t PD_UFP_c::FUSB302_i2c_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count, TwoWire * i2c_bus) { - Wire.beginTransmission(dev_addr); - Wire.write(reg_addr); + i2c_bus->beginTransmission(dev_addr); + i2c_bus->write(reg_addr); while (count > 0) { - Wire.write(*data++); + i2c_bus->write(*data++); count--; } - Wire.endTransmission(); + i2c_bus->endTransmission(); return FUSB302_SUCCESS; } diff --git a/src/PD_UFP.h b/src/PD_UFP.h index cb43268..b6b05c6 100644 --- a/src/PD_UFP.h +++ b/src/PD_UFP.h @@ -38,7 +38,7 @@ typedef uint8_t status_power_t; class PD_UFP_c { public: - PD_UFP_c(); + PD_UFP_c(uint8_t address = 0x22, TwoWire * i2c_bus = &Wire); // Init void init(uint8_t int_pin, enum PD_power_option_t power_option = PD_POWER_OPTION_MAX_5V); void init_PPS(uint8_t int_pin, uint16_t PPS_voltage, uint8_t PPS_current, enum PD_power_option_t power_option = PD_POWER_OPTION_MAX_5V); @@ -59,8 +59,10 @@ class PD_UFP_c static void clock_prescale_set(uint8_t prescaler); protected: - static FUSB302_ret_t FUSB302_i2c_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count); - static FUSB302_ret_t FUSB302_i2c_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count); + uint8_t _i2c_address; + TwoWire * _i2c_bus; + static FUSB302_ret_t FUSB302_i2c_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count, TwoWire * i2c_bus); + static FUSB302_ret_t FUSB302_i2c_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t count, TwoWire * i2c_bus); static FUSB302_ret_t FUSB302_delay_ms(uint32_t t); void handle_protocol_event(PD_protocol_event_t events); void handle_FUSB302_event(FUSB302_event_t events); From d7f06995afc8f77b8f80f21579748c062dbcdf67 Mon Sep 17 00:00:00 2001 From: "Lars Erik G. Svendsen" Date: Mon, 28 Apr 2025 11:31:23 +0200 Subject: [PATCH 3/3] Reupload --- keywords.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/keywords.txt b/keywords.txt index b0fd46e..b448dce 100644 --- a/keywords.txt +++ b/keywords.txt @@ -46,4 +46,5 @@ PD_POWER_OPTION_MAX_VOLTAGE LITERAL1 PD_POWER_OPTION_MAX_CURRENT LITERAL1 PD_POWER_OPTION_MAX_POWER LITERAL1 + ####################### END ############################ \ No newline at end of file