GPIO_NXP_Arduino 1.1.0
GPIO device operation sample code for Arduino
Loading...
Searching...
No Matches
GPIO_NXP.cpp
1#include "GPIO_NXP.h"
2
3/* ******** GPIO_base ******** */
4
5GPIO_base::GPIO_base( uint8_t i2c_address, int nbits, const uint8_t* ar, uint8_t ai ) :
6 I2C_device( i2c_address ),
7 n_bits( nbits ),
8 n_ports( (nbits + 7) / 8 ),
9 auto_increment( ai ),
10 arp( ar )
11{
12 init();
13}
14
15GPIO_base::GPIO_base( TwoWire& wire, uint8_t i2c_address, int nbits, const uint8_t* ar, uint8_t ai ) :
16 I2C_device( wire, i2c_address ),
17 n_bits( nbits ),
18 n_ports( (nbits + 7) / 8 ),
19 auto_increment( ai ),
20 arp( ar )
21{
22 init();
23}
24
25void GPIO_base::init( void )
26{
27 constexpr uint16_t i = 0x0001;
28 uint8_t* tp = (uint8_t*)(&i);
29
30 endian = tp[ 0 ]; // 'true' if LittleEndian
31}
32
36
37void GPIO_base::begin( board env )
38{
39 if ( env ) {
40 pinMode(RESET_PIN, OUTPUT);
41 pinMode(ADDR_PIN, OUTPUT);
42
43 digitalWrite( RESET_PIN , 1 );
44 digitalWrite( ADDR_PIN , 1 );
45 digitalWrite( ADDR_PIN , 0 );
46 delay( 1 );
47
48 digitalWrite( RESET_PIN , 0 );
49 delay( 1 ); // reset time = 500ns(min)
50 digitalWrite( RESET_PIN , 1 );
51 delay( 1 ); // reset recovery time = 600ns(min)
52 }
53}
54
55void GPIO_base::output( int port, uint8_t value, uint8_t mask )
56{
57 if ( mask )
58 bit_op8( *(arp + OUT) + port, mask, value );
59
60 write_r8( *(arp + OUT) + port, value );
61}
62
63void GPIO_base::output( const uint8_t *vp )
64{
65 write_port( OUT, vp );
66}
67
68uint8_t GPIO_base::input( int port )
69{
70 return read_r8( *(arp + IN) + port );
71}
72
73uint8_t* GPIO_base::input( uint8_t *vp )
74{
75 read_port( IN, vp );
76
77 return vp;
78}
79
80void GPIO_base::config( int port, uint8_t config, uint8_t mask )
81{
82 if ( mask )
83 bit_op8( *(arp + CONFIG) + port, mask, config );
84
85 write_r8( *(arp + CONFIG) + port, config );
86}
87
88void GPIO_base::config( const uint8_t* vp )
89{
90 write_port( CONFIG, vp );
91}
92
93void GPIO_base::write_port( access_word w, const uint8_t* vp )
94{
95 if ( auto_increment ) {
96 reg_w( auto_increment | *(arp + w), vp, n_ports );
97 }
98 else {
99 for ( int i = 0; i < n_ports; i++ )
100 write_r8( *(arp + w) + i, *vp++ );
101 }
102}
103
104void GPIO_base::write_port16( access_word w, const uint16_t* vp )
105{
106 uint16_t b[ n_ports ];
107
108 if ( endian ) {
109 uint16_t temp;
110 for ( int i = 0; i < n_ports; i++ ) {
111 temp = vp[ i ] << 8;
112 b[ i ] = temp | vp[ i ] >> 8;
113 }
114 }
115 else {
116 memcpy( b, vp, n_ports << 1 );
117 }
118
119 int n_bytes = (n_bits * 2 + 7) / 8;
120
121 if ( auto_increment ) {
122 reg_w( auto_increment | *(arp + w), (uint8_t*)b, n_bytes );
123 }
124 else {
125 for ( int i = 0; i < n_bytes; i++ )
126 write_r8( *(arp + w) + i, b[ i ] );
127 }
128}
129
130uint8_t* GPIO_base::read_port( access_word w, uint8_t* vp )
131{
132 if ( auto_increment ) {
133 reg_r( auto_increment | *(arp + w), vp, n_ports );
134 }
135 else {
136 for ( int i = 0; i < n_ports; i++ )
137 *(vp + i) = read_r8( *(arp + w) + i );
138 }
139
140 return vp;
141}
142
143uint16_t* GPIO_base::read_port16( access_word w, uint16_t* vp )
144{
145 int n_bytes = (n_bits * 2 + 7) / 8;
146
147 if ( auto_increment ) {
148 reg_r( auto_increment | *(arp + w), (uint8_t*)vp, n_bytes );
149 }
150 else {
151 for ( int i = 0; i < n_bytes; i++ )
152 *(vp + i) = read_r8( *(arp + w) + i );
153 }
154
155
156 if ( endian ) {
157 uint16_t temp;
158
159 for ( int i = 0; i < n_ports; i++ ) {
160 temp = vp[ i ] << 8;
161 vp[ i ] = temp | vp[ i ] >> 8;
162 }
163 }
164
165 return vp;
166}
167
168void GPIO_base::write_port( access_word w, uint8_t value, int port_num )
169{
170 write_r8( *(arp + w) + port_num, value );
171}
172
173void GPIO_base::write_port16( access_word w, uint16_t value, int port_num )
174{
175 write_r16( *(arp + w) + port_num, value );
176}
177
178uint8_t GPIO_base::read_port( access_word w, int port_num )
179{
180 return read_r8( *(arp + w) + port_num );
181}
182
183uint16_t GPIO_base::read_port16( access_word w, int port_num )
184{
185 return read_r16( *(arp + w) + port_num );
186}
187
188void GPIO_base::print_bin( uint8_t v )
189{
190 Serial.print(" 0b");
191 for (int i = 7; 0 <= i; i-- )
192 Serial.print(((v >> i) & 0x1) ? "1" : "0");
193}
194
195
196/* ******** PCA9554 ******** */
197
198PCA9554::PCA9554( uint8_t i2c_address ) :
199 GPIO_base( i2c_address, 8, access_ref, 0x00 )
200{
201}
202
203PCA9554::PCA9554( TwoWire& wire, uint8_t i2c_address ) :
204 GPIO_base( wire, i2c_address, 8, access_ref, 0x00 )
205{
206}
207
211
212constexpr uint8_t PCA9554::access_ref[];
213
214
215/* ******** PCA9555 ******** */
216
217PCA9555::PCA9555( uint8_t i2c_address ) :
218 GPIO_base( i2c_address, 16, access_ref, 0x00 )
219{
220}
221
222PCA9555::PCA9555( TwoWire& wire, uint8_t i2c_address ) :
223 GPIO_base( wire, i2c_address, 8, access_ref, 0x00 )
224{
225}
226
230
231constexpr uint8_t PCA9555::access_ref[];
232
233
234/* ******** PCAL6xxx_base ******** */
235
236PCAL6xxx_base::PCAL6xxx_base( uint8_t i2c_address, const int nbits, const uint8_t arp[], uint8_t ai ) :
237 GPIO_base( i2c_address, nbits, arp, ai )
238{
239}
240
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 )
243{
244}
245
246PCAL6xxx_base::~PCAL6xxx_base()
247{
248}
249
250
251/* ******** PCAL6408A ******** */
252
253PCAL6408A::PCAL6408A( uint8_t i2c_address ) :
254 PCAL6xxx_base( i2c_address, 8, access_ref, 0 )
255{
256}
257
258PCAL6408A::PCAL6408A( TwoWire& wire, uint8_t i2c_address ) :
259 PCAL6xxx_base( wire, i2c_address, 8, access_ref, 0 )
260{
261}
262
266
267constexpr uint8_t PCAL6408A::access_ref[];
268
269
270/* ******** PCAL6416A ******** */
271
272PCAL6416A::PCAL6416A( uint8_t i2c_address ) :
273 PCAL6xxx_base( i2c_address, 16, access_ref, 0 )
274{
275}
276
277PCAL6416A::PCAL6416A( TwoWire& wire, uint8_t i2c_address ) :
278 PCAL6xxx_base( wire, i2c_address, 8, access_ref, 0 )
279{
280}
281
285
286constexpr uint8_t PCAL6416A::access_ref[];
287
288
289/* ******** PCAL6524 ******** */
290
291PCAL6524::PCAL6524( uint8_t i2c_address ) :
292 PCAL6xxx_base( i2c_address, 24, access_ref, 0x80 )
293{
294}
295
296PCAL6524::PCAL6524( TwoWire& wire, uint8_t i2c_address ) :
297 PCAL6xxx_base( wire, i2c_address, 8, access_ref, 0 )
298{
299}
300
304
305constexpr uint8_t PCAL6524::access_ref[];
306
307
308/* ******** PCAL6534 ******** */
309
310PCAL6534::PCAL6534( uint8_t i2c_address ) :
311 PCAL6xxx_base( i2c_address, 34, access_ref, 0x80 )
312{
313}
314
315PCAL6534::PCAL6534( TwoWire& wire, uint8_t i2c_address ) :
316 PCAL6xxx_base( wire, i2c_address, 8, access_ref, 0 )
317{
318}
319
323
324constexpr uint8_t PCAL6534::access_ref[];
325
326
327/* ******** PCAL9722 ******** */
328
329GPIO_SPI::GPIO_SPI( uint8_t dev_address, int nbits, const uint8_t* arp, uint8_t ai )
330 : GPIO_base( dev_address, nbits, arp, ai )
331{
332 spi_setting = SPISettings( 1000000, MSBFIRST, SPI_MODE0 );
333}
334
338
339int GPIO_SPI::reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size )
340{
341 uint8_t w_data[ size + 2 ];
342 uint8_t r_data[ size + 2 ];
343
344 w_data[ 0 ] = (i2c_addr << 1);
345 w_data[ 1 ] = reg_adr | auto_increment;
346 memcpy( w_data + 2, data, size );
347
348 txrx( w_data, r_data, size + 2 );
349
350 return size;
351}
352
353int GPIO_SPI::reg_w( uint8_t reg_adr, uint8_t data )
354{
355 uint8_t w_data[ 3 ];
356 uint8_t r_data[ 3 ];
357
358 w_data[ 0 ] = i2c_addr << 1;
359 w_data[ 1 ] = reg_adr;
360 w_data[ 2 ] = data;
361
362 txrx( w_data, r_data, 3 );
363
364 return 1;
365}
366
367int GPIO_SPI::reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size )
368{
369 uint8_t w_data[ size + 2 ] = { 0 };
370 uint8_t r_data[ size + 2 ];
371
372 w_data[ 0 ] = (i2c_addr << 1) | 0x1;
373 w_data[ 1 ] = reg_adr | auto_increment;
374
375 txrx( w_data, r_data, size + 2 );
376
377 memcpy( data, r_data + 2, size );
378
379 return size;
380}
381
382uint8_t GPIO_SPI::reg_r( uint8_t reg_adr )
383{
384 uint8_t w_data[ 3 ];
385 uint8_t r_data[ 3 ];
386
387 w_data[ 0 ] = (i2c_addr << 1) | 0x1;
388 w_data[ 1 ] = reg_adr;
389 w_data[ 2 ] = 0;
390
391 txrx( w_data, r_data, 3 );
392
393 return r_data[ 2 ];
394}
395
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 )
398{
399}
400
401PCAL97xx_base::~PCAL97xx_base()
402{
403}
404
405
406PCAL9722::PCAL9722( uint8_t dev_address ) :
407 PCAL97xx_base( dev_address, 24, access_ref, 0x80 )
408{
409}
410
414
416{
417 if ( env ) {
418 pinMode( RESET_PIN_PCAL9722, OUTPUT );
419 digitalWrite( RESET_PIN_PCAL9722, 0 );
420 delay( 1 );
421 digitalWrite( RESET_PIN_PCAL9722, 1 );
422 }
423}
424
425constexpr uint8_t PCAL9722::access_ref[];
426
virtual int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
Definition GPIO_NXP.cpp:367
GPIO_SPI(uint8_t device_address, int nbits, const uint8_t *arp, uint8_t ai)
Definition GPIO_NXP.cpp:329
virtual ~GPIO_SPI()
Definition GPIO_NXP.cpp:335
virtual int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
Definition GPIO_NXP.cpp:339
virtual uint16_t * read_port16(access_word w, uint16_t *vp)
Definition GPIO_NXP.cpp:143
virtual void write_port(access_word w, const uint8_t *vp)
Definition GPIO_NXP.cpp:93
const int n_bits
Definition GPIO_NXP.h:53
virtual void config(int port, uint8_t config, uint8_t mask=0)
Definition GPIO_NXP.cpp:80
const int n_ports
Definition GPIO_NXP.h:56
virtual ~GPIO_base()
Definition GPIO_NXP.cpp:33
GPIO_base(uint8_t i2c_address, int nbits, const uint8_t *arp, uint8_t ai)
Definition GPIO_NXP.cpp:5
virtual void write_port16(access_word w, const uint16_t *vp)
Definition GPIO_NXP.cpp:104
virtual void output(int port, uint8_t value, uint8_t mask=0)
Definition GPIO_NXP.cpp:55
virtual void begin(board env=NONE)
Definition GPIO_NXP.cpp:37
virtual uint8_t input(int port)
Definition GPIO_NXP.cpp:68
virtual uint8_t * read_port(access_word w, uint8_t *vp)
Definition GPIO_NXP.cpp:130
PCA9554(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:198
virtual ~PCA9554()
Definition GPIO_NXP.cpp:208
virtual ~PCA9555()
Definition GPIO_NXP.cpp:227
PCA9555(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:217
PCAL6408A(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:253
virtual ~PCAL6408A()
Definition GPIO_NXP.cpp:263
PCAL6416A(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:272
virtual ~PCAL6416A()
Definition GPIO_NXP.cpp:282
virtual ~PCAL6524()
Definition GPIO_NXP.cpp:301
PCAL6524(uint8_t i2c_address=(0x44 > > 1)+0)
Definition GPIO_NXP.cpp:291
virtual ~PCAL6534()
Definition GPIO_NXP.cpp:320
PCAL6534(uint8_t i2c_address=(0x44 > > 1)+0)
Definition GPIO_NXP.cpp:310
void begin(board env=NONE)
Definition GPIO_NXP.cpp:415
virtual ~PCAL9722()
Definition GPIO_NXP.cpp:411
PCAL9722(uint8_t dev_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:406