6 I2C_device( i2c_address ),
8 n_ports( (nbits + 7) / 8 ),
16 I2C_device( wire, i2c_address ),
18 n_ports( (nbits + 7) / 8 ),
25void GPIO_base::init(
void )
27 constexpr uint16_t i = 0x0001;
28 uint8_t* tp = (uint8_t*)(&i);
40 pinMode(RESET_PIN, OUTPUT);
41 pinMode(ADDR_PIN, OUTPUT);
43 digitalWrite( RESET_PIN , 1 );
44 digitalWrite( ADDR_PIN , 1 );
45 digitalWrite( ADDR_PIN , 0 );
48 digitalWrite( RESET_PIN , 0 );
50 digitalWrite( RESET_PIN , 1 );
58 bit_op8( *(arp + OUT) + port, mask, value );
60 write_r8( *(arp + OUT) + port, value );
70 return read_r8( *(arp + IN) + port );
83 bit_op8( *(arp + CONFIG) + port, mask,
config );
85 write_r8( *(arp + CONFIG) + port,
config );
95 if ( auto_increment ) {
96 reg_w( auto_increment | *(arp + w), vp,
n_ports );
99 for (
int i = 0; i <
n_ports; i++ )
100 write_r8( *(arp + w) + i, *vp++ );
110 for (
int i = 0; i <
n_ports; i++ ) {
112 b[ i ] = temp | vp[ i ] >> 8;
119 int n_bytes = (
n_bits * 2 + 7) / 8;
121 if ( auto_increment ) {
122 reg_w( auto_increment | *(arp + w), (uint8_t*)b, n_bytes );
125 for (
int i = 0; i < n_bytes; i++ )
126 write_r8( *(arp + w) + i, b[ i ] );
132 if ( auto_increment ) {
133 reg_r( auto_increment | *(arp + w), vp,
n_ports );
136 for (
int i = 0; i <
n_ports; i++ )
137 *(vp + i) = read_r8( *(arp + w) + i );
145 int n_bytes = (
n_bits * 2 + 7) / 8;
147 if ( auto_increment ) {
148 reg_r( auto_increment | *(arp + w), (uint8_t*)vp, n_bytes );
151 for (
int i = 0; i < n_bytes; i++ )
152 *(vp + i) = read_r8( *(arp + w) + i );
159 for (
int i = 0; i <
n_ports; i++ ) {
161 vp[ i ] = temp | vp[ i ] >> 8;
170 write_r8( *(arp + w) + port_num, value );
175 write_r16( *(arp + w) + port_num, value );
180 return read_r8( *(arp + w) + port_num );
185 return read_r16( *(arp + w) + port_num );
188void GPIO_base::print_bin( uint8_t v )
191 for (
int i = 7; 0 <= i; i-- )
192 Serial.print(((v >> i) & 0x1) ?
"1" :
"0");
199 GPIO_base( i2c_address, 8, access_ref, 0x00 )
204 GPIO_base( wire, i2c_address, 8, access_ref, 0x00 )
212constexpr uint8_t PCA9554::access_ref[];
218 GPIO_base( i2c_address, 16, access_ref, 0x00 )
223 GPIO_base( wire, i2c_address, 8, access_ref, 0x00 )
231constexpr uint8_t PCA9555::access_ref[];
236PCAL6xxx_base::PCAL6xxx_base( uint8_t i2c_address,
const int nbits,
const uint8_t arp[], uint8_t ai ) :
241PCAL6xxx_base::PCAL6xxx_base( TwoWire& wire, uint8_t i2c_address,
const int nbits,
const uint8_t arp[], uint8_t ai ) :
242 GPIO_base( wire, i2c_address, nbits, arp, ai )
246PCAL6xxx_base::~PCAL6xxx_base()
267constexpr uint8_t PCAL6408A::access_ref[];
286constexpr uint8_t PCAL6416A::access_ref[];
305constexpr uint8_t PCAL6524::access_ref[];
324constexpr uint8_t PCAL6534::access_ref[];
330 :
GPIO_base( dev_address, nbits, arp, ai )
332 spi_setting = SPISettings( 1000000, MSBFIRST, SPI_MODE0 );
341 uint8_t w_data[ size + 2 ];
342 uint8_t r_data[ size + 2 ];
344 w_data[ 0 ] = (i2c_addr << 1);
345 w_data[ 1 ] = reg_adr | auto_increment;
346 memcpy( w_data + 2, data, size );
348 txrx( w_data, r_data, size + 2 );
358 w_data[ 0 ] = i2c_addr << 1;
359 w_data[ 1 ] = reg_adr;
362 txrx( w_data, r_data, 3 );
369 uint8_t w_data[ size + 2 ] = { 0 };
370 uint8_t r_data[ size + 2 ];
372 w_data[ 0 ] = (i2c_addr << 1) | 0x1;
373 w_data[ 1 ] = reg_adr | auto_increment;
375 txrx( w_data, r_data, size + 2 );
377 memcpy( data, r_data + 2, size );
387 w_data[ 0 ] = (i2c_addr << 1) | 0x1;
388 w_data[ 1 ] = reg_adr;
391 txrx( w_data, r_data, 3 );
396PCAL97xx_base::PCAL97xx_base( uint8_t dev_address,
const int nbits,
const uint8_t arp[], uint8_t ai ) :
397 GPIO_SPI( dev_address, nbits, arp, ai )
401PCAL97xx_base::~PCAL97xx_base()
418 pinMode( RESET_PIN_PCAL9722, OUTPUT );
419 digitalWrite( RESET_PIN_PCAL9722, 0 );
421 digitalWrite( RESET_PIN_PCAL9722, 1 );
425constexpr uint8_t PCAL9722::access_ref[];
virtual int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
GPIO_SPI(uint8_t device_address, int nbits, const uint8_t *arp, uint8_t ai)
virtual int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
virtual uint16_t * read_port16(access_word w, uint16_t *vp)
virtual void write_port(access_word w, const uint8_t *vp)
virtual void config(int port, uint8_t config, uint8_t mask=0)
GPIO_base(uint8_t i2c_address, int nbits, const uint8_t *arp, uint8_t ai)
virtual void write_port16(access_word w, const uint16_t *vp)
virtual void output(int port, uint8_t value, uint8_t mask=0)
virtual void begin(board env=NONE)
virtual uint8_t input(int port)
virtual uint8_t * read_port(access_word w, uint8_t *vp)
PCA9554(uint8_t i2c_address=(0x40 > > 1)+0)
PCA9555(uint8_t i2c_address=(0x40 > > 1)+0)
PCAL6408A(uint8_t i2c_address=(0x40 > > 1)+0)
PCAL6416A(uint8_t i2c_address=(0x40 > > 1)+0)
PCAL6524(uint8_t i2c_address=(0x44 > > 1)+0)
PCAL6534(uint8_t i2c_address=(0x44 > > 1)+0)
void begin(board env=NONE)
PCAL9722(uint8_t dev_address=(0x40 > > 1)+0)