11#include " TCAL9539.h"
22#include < Wire.h>
33
4- #define WIRE Wire
5-
6-
74static constexpr uint8_t REG_INPUT0 = 0x0 ;
85static constexpr uint8_t REG_INPUT1 = 0x1 ;
96static constexpr uint8_t REG_OUTPUT0 = 0x2 ;
@@ -13,24 +10,42 @@ static constexpr uint8_t POLARITY_INVERSION1 = 0x5;
1310static constexpr uint8_t REG_CONFIG0 = 0x6 ;
1411static constexpr uint8_t REG_CONFIG1 = 0x7 ;
1512
16- bool TCAL9539Init (){
17- uint8_t addrs[] = {GPIO0_ADDRESS, GPIO1_ADDRESS, GPIO2_ADDRESS};
13+ TwoWire& tcal_get_wire_by_id (int index) {
14+ if (I2C_BUS_Map[index] == 0 ) {
15+ return Wire;
16+ } else {
17+ return Wire1;
18+ }
19+ }
1820
19- for (uint8_t addr : addrs){
20- Serial.print (" Testing " );
21- Serial.println (addr);
22- WIRE.beginTransmission (addr);
23- WIRE.write (REG_OUTPUT0);
24- if (!WIRE.endTransmission ()){
25- Serial.println (" Failed at endTransmission" );
21+ bool TCAL9539Init (int reset_pin){
22+ pinMode (reset_pin, OUTPUT);
23+ digitalWrite (reset_pin, HIGH);
24+ delay (1 );
25+ digitalWrite (reset_pin, LOW);
26+ delay (1 );
27+ digitalWrite (reset_pin, HIGH);
28+
29+ uint8_t addrs[] = {GPIO0_ADDRESS, GPIO1_ADDRESS, GPIO2_ADDRESS};
30+
31+ for (int i = 0 ; i < std::size (addrs); i++){
32+ TwoWire& wire = tcal_get_wire_by_id (i);
33+ uint8_t addr = addrs[i];
34+
35+ wire.beginTransmission (addr);
36+ wire.write (REG_OUTPUT0);
37+ if (wire.endTransmission () != 0 ){
38+ Serial.print (" Failed at endTransmission " );
39+ Serial.println (addr);
2640 return false ;
2741 }
28- int ct = WIRE .requestFrom (addr, 1 );
42+ int ct = wire .requestFrom (addr, 1 );
2943 if (ct != 1 ){
30- Serial.println (" Failed at requestFrom" );
44+ Serial.print (" Failed at requestFrom " );
45+ Serial.println (addr);
3146 return false ;
3247 }
33- int v = WIRE .read ();
48+ int v = wire .read ();
3449 // REG_OUTPUT0 is set all ones on power up
3550 if (v != 0xff ){
3651 Serial.println (" Failed at REG_OUTPUT0" );
@@ -44,10 +59,14 @@ static uint8_t pin_state[3][2] = {{0xff,0xff},{0xff,0xff},{0xff,0xff}};
4459static uint8_t pin_config[3 ][2 ] = {{0xff ,0xff },{0xff ,0xff },{0xff ,0xff }};
4560
4661GpioError gpioDigitalWrite (GpioAddress addr, int mode){
62+
63+
4764 if (!addr.is_valid ) {
4865 return GpioError::InvalidPinError;
4966 }
5067
68+ TwoWire& wire = tcal_get_wire_by_id (addr.gpio_id );
69+
5170 uint8_t current_state = pin_state[addr.gpio_id ][addr.port_idx ];
5271 if (mode == HIGH){
5372 current_state |= (1 << addr.pin_offset );
@@ -57,14 +76,15 @@ GpioError gpioDigitalWrite(GpioAddress addr, int mode){
5776 return GpioError::InvalidModeError;
5877 }
5978
60- WIRE .beginTransmission (addr.gpio_address );
61- WIRE .write (REG_OUTPUT0 + addr.port_idx );
62- WIRE .write (current_state);
79+ wire .beginTransmission (addr.gpio_address );
80+ wire .write (REG_OUTPUT0 + addr.port_idx );
81+ wire .write (current_state);
6382 pin_state[addr.gpio_id ][addr.port_idx ] = current_state;
64- if (!WIRE.endTransmission (true )){
83+ int err = 0 ;
84+ err = wire.endTransmission (true );
85+ if (err != 0 ){
6586 return GpioError::I2CError;
6687 }
67-
6888 return GpioError::NoError;
6989}
7090
@@ -73,18 +93,19 @@ GpioReadResult gpioDigitalRead(GpioAddress addr){
7393 return GpioReadResult{.value =LOW,.error =GpioError::InvalidPinError};
7494 }
7595
76- WIRE.beginTransmission (addr.gpio_address );
77- WIRE.write (REG_INPUT0 + addr.port_idx );
78- if (!WIRE.endTransmission (true )){
96+ TwoWire& wire = tcal_get_wire_by_id (addr.gpio_id );
97+
98+ wire.beginTransmission (addr.gpio_address );
99+ wire.write (REG_INPUT0 + addr.port_idx );
100+ if (wire.endTransmission (true ) != 0 ){
79101 return GpioReadResult{.value =LOW,.error =GpioError::I2CError};
80102 }
81- int ct = WIRE .requestFrom (addr.gpio_address , 1 );
103+ int ct = wire .requestFrom (addr.gpio_address , 1 );
82104 if (ct != 1 ){
83105 return GpioReadResult{.value =LOW,.error =GpioError::I2CError};
84106 }
85-
86- uint8_t val = WIRE.read ();
87107
108+ uint8_t val = wire.read ();
88109 return GpioReadResult{.value =(val & (1 << addr.pin_offset )) != 0 ,.error =GpioError::NoError};
89110}
90111
@@ -93,6 +114,8 @@ GpioError gpioPinMode(GpioAddress addr, int mode){
93114 return GpioError::NoError;
94115 }
95116
117+ TwoWire& wire = tcal_get_wire_by_id (addr.gpio_id );
118+
96119 uint8_t current_state = pin_config[addr.gpio_id ][addr.port_idx ];
97120
98121 if (mode == INPUT){
@@ -102,20 +125,20 @@ GpioError gpioPinMode(GpioAddress addr, int mode){
102125 } else {
103126 return GpioError::InvalidModeError;
104127 }
128+
129+ GpioError err = gpioDigitalWrite (addr, LOW);
130+ if (err != GpioError::NoError){
131+ return err;
132+ }
105133
106- GpioError err = gpioDigitalWrite (addr, LOW); // set pin low as default state
107- // if(err != GpioError::NoError){
108- // return err;
109- // }
110-
111- WIRE.beginTransmission (addr.gpio_address );
112- WIRE.write (REG_CONFIG0 + addr.port_idx );
113- WIRE.write (current_state);
134+ // wirezero
135+ wire.beginTransmission (addr.gpio_address );
136+ wire.write (REG_CONFIG0 + addr.port_idx );
137+ wire.write (current_state);
114138 pin_config[addr.gpio_id ][addr.port_idx ] = current_state;
115139
116- if (!WIRE .endTransmission (true )){
140+ if (wire .endTransmission (true ) != 0 ){
117141 return GpioError::I2CError;
118142 }
119-
120143 return GpioError::NoError;
121- }
144+ }
0 commit comments