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 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); 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