GPIO_NXP_Arduino 1.1.2
GPIO device operation sample code for Arduino
Loading...
Searching...
No Matches
GPIO_NXP.h
1
7
8#ifndef ARDUINO_GPIO_NXP_ARD_H
9#define ARDUINO_GPIO_NXP_ARD_H
10
11#include <Arduino.h>
12#include <stdint.h>
13
14#include <I2C_device.h>
15
21enum access_word : uint8_t
22{
23 IN,
24 OUT,
25 POLARITY,
26 CONFIG,
27 DRIVE_STRENGTH,
28 LATCH,
29 PULL_UD_EN,
30 PULL_UD_SEL,
31 INT_MASK,
32 INT_STATUS,
33 OUTPUT_PORT_CONFIG,
34 NUM_access_word,
35};
36
44class GPIO_base : public I2C_device
45{
46public:
47 enum board {
48 NONE,
49 ARDUINO_SHIELD,
50 };
51
53 const int n_bits;
54
56 const int n_ports;
57
65 GPIO_base( uint8_t i2c_address, int nbits, const uint8_t* arp, uint8_t ai );
66
75 GPIO_base( TwoWire& wire, uint8_t i2c_address, int nbits, const uint8_t* arp, uint8_t ai );
76
78 virtual ~GPIO_base();
79
89 virtual void begin( board env = NONE );
90
99 virtual void output( int port, uint8_t value, uint8_t mask = 0 );
100
107 virtual void output( const uint8_t *vp );
108
116 virtual uint8_t input( int port );
117
125 virtual uint8_t* input( uint8_t *vp );
126
135 virtual void config( int port, uint8_t config, uint8_t mask = 0 );
136
143 virtual void config( const uint8_t* vp );
144
152 virtual void write_port( access_word w, const uint8_t* vp );
153
161 virtual void write_port16( access_word w, const uint16_t* vp );
162
171 virtual uint8_t* read_port( access_word w, uint8_t* vp );
172
181 virtual uint16_t* read_port16( access_word w, uint16_t* vp );
182
191 virtual void write_port( access_word w, uint8_t value, int port_num = 0 );
192
201 virtual void write_port16( access_word w, uint16_t value, int port_num = 0 );
202
211 virtual uint8_t read_port( access_word w, int port_num = 0 );
212
221 virtual uint16_t read_port16( access_word w, int port_num = 0 );
222
227 static void print_bin( uint8_t v );
228
229protected:
230 const uint8_t auto_increment;
231
232private:
233 const uint8_t* arp;
234 bool endian;
235
236 static constexpr int RESET_PIN = 8;
237 static constexpr int ADDR_PIN = 9;
238
239 void init( void );
240};
241
246class PCA9554 : public GPIO_base
247{
248public:
250 enum reg_num {
251 Input_Port,
252 Output_Port,
253 Polarity_Inversion,
254 Configuration,
255 };
256
261 PCA9554( uint8_t i2c_address = (0x40 >> 1) + 0 );
262
268 PCA9554( TwoWire& wire, uint8_t i2c_address = (0x40 >> 1) + 0 );
269
271 virtual ~PCA9554();
272
273 static constexpr uint8_t access_ref[ NUM_access_word ] = {
274 Input_Port, // IN,
275 Output_Port, // OUT
276 Polarity_Inversion, // POLARITY
277 Configuration, // CONFIG
278 0xFF, // DRIVE_STRENGTH ** CANNOT BE USED **
279 0xFF, // LATCH ** CANNOT BE USED **
280 0xFF, // PULL_UD_EN ** CANNOT BE USED **
281 0xFF, // PULL_UD_SEL ** CANNOT BE USED **
282 0xFF, // INT_MASK ** CANNOT BE USED **
283 0xFF, // INT_STATUS ** CANNOT BE USED **
284 0xFF, // OUTPUT_PORT_CONFIG ** CANNOT BE USED **
285 };
286
287#if DOXYGEN_ONLY
289 enum board {
290 NONE,
291 ARDUINO_SHIELD,
292 };
293
295 const int n_bits;
296
298 const int n_ports;
299
309 void begin( board env = NONE );
310
319 void output( int port, uint8_t value, uint8_t mask = 0 );
320
327 void output( const uint8_t *vp );
328
336 uint8_t input( int port );
337
345 uint8_t* input( uint8_t *vp );
346
355 void config( int port, uint8_t config, uint8_t mask = 0 );
356
363 void config( const uint8_t* vp );
364
372 void write_port( access_word w, const uint8_t* vp );
373
381 void write_port16( access_word w, const uint16_t* vp );
382
391 uint8_t* read_port( access_word w, uint8_t* vp );
392
401 uint16_t* read_port16( access_word w, uint16_t* vp );
402
411 void write_port( access_word w, uint8_t value, int port_num = 0 );
412
421 void write_port16( access_word w, uint16_t value, int port_num = 0 );
422
431 uint8_t read_port( access_word w, int port_num = 0 );
432
441 uint16_t read_port16( access_word w, int port_num = 0 );
442
447 bool ping( void );
448
456 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
457
464 int reg_w( uint8_t reg_adr, uint8_t data );
465
473 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
474
480 uint8_t reg_r( uint8_t reg_adr );
481
487 void write_r8( uint8_t reg, uint8_t val );
488
496 void write_r16( uint8_t reg, uint16_t val );
497
503 uint8_t read_r8( uint8_t reg );
504
512 uint16_t read_r16( uint8_t reg );
513
522 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
523 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
524#endif // DOXYGEN_ONLY
525
526};
527
532class PCA9555 : public GPIO_base
533{
534public:
536 enum reg_num {
537 Input_Port_0, Input_Port_1,
538 Output_Port_0, Output_Port_1,
539 Polarity_Inversion_Port_0, Polarity_Inversion_Port_1,
540 Configuration_Port_0, Configuration_Port_1,
541 };
542
547 PCA9555( uint8_t i2c_address = (0x40 >> 1) + 0 );
548
554 PCA9555( TwoWire& wire, uint8_t i2c_address = (0x40 >> 1) + 0 );
555
557 virtual ~PCA9555();
558
559 static constexpr uint8_t access_ref[ NUM_access_word ] = {
560 Input_Port_0, // IN,
561 Output_Port_0, // OUT
562 Polarity_Inversion_Port_0, // POLARITY
563 Configuration_Port_0, // CONFIG
564 0xFF, // DRIVE_STRENGTH ** CANNOT BE USED **
565 0xFF, // LATCH ** CANNOT BE USED **
566 0xFF, // PULL_UD_EN ** CANNOT BE USED **
567 0xFF, // PULL_UD_SEL ** CANNOT BE USED **
568 0xFF, // INT_MASK ** CANNOT BE USED **
569 0xFF, // INT_STATUS ** CANNOT BE USED **
570 0xFF, // OUTPUT_PORT_CONFIG ** CANNOT BE USED **
571 };
572
573#if DOXYGEN_ONLY
575 enum board {
576 NONE,
577 ARDUINO_SHIELD,
578 };
579
581 const int n_bits;
582
584 const int n_ports;
585
595 void begin( board env = NONE );
596
605 void output( int port, uint8_t value, uint8_t mask = 0 );
606
613 void output( const uint8_t *vp );
614
622 uint8_t input( int port );
623
631 uint8_t* input( uint8_t *vp );
632
641 void config( int port, uint8_t config, uint8_t mask = 0 );
642
649 void config( const uint8_t* vp );
650
658 void write_port( access_word w, const uint8_t* vp );
659
667 void write_port16( access_word w, const uint16_t* vp );
668
677 uint8_t* read_port( access_word w, uint8_t* vp );
678
687 uint16_t* read_port16( access_word w, uint16_t* vp );
688
697 void write_port( access_word w, uint8_t value, int port_num = 0 );
698
707 void write_port16( access_word w, uint16_t value, int port_num = 0 );
708
717 uint8_t read_port( access_word w, int port_num = 0 );
718
727 uint16_t read_port16( access_word w, int port_num = 0 );
728
733 bool ping( void );
734
742 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
743
750 int reg_w( uint8_t reg_adr, uint8_t data );
751
759 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
760
766 uint8_t reg_r( uint8_t reg_adr );
767
773 void write_r8( uint8_t reg, uint8_t val );
774
782 void write_r16( uint8_t reg, uint16_t val );
783
789 uint8_t read_r8( uint8_t reg );
790
798 uint16_t read_r16( uint8_t reg );
799
808 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
809 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
810#endif // DOXYGEN_ONLY
811};
812
821{
822public:
830 PCAL6xxx_base( uint8_t i2c_address, const int nbits, const uint8_t arp[], uint8_t ai );
831
840 PCAL6xxx_base( TwoWire& wire, uint8_t i2c_address, const int nbits, const uint8_t arp[], uint8_t ai );
841
843 virtual ~PCAL6xxx_base();
844};
845
846
852{
853public:
855 enum reg_num {
856 Input_Port,
857 Output_Port,
858 Polarity_Inversion,
859 Configuration,
860 Output_drive_strength_0 = 0x40,
861 Output_drive_strength_1,
862 Input_latch,
863 Pull_up_pull_down_enable,
864 Pull_up_pull_down_selection,
865 Interrupt_mask,
866 Interrupt_status,
867 Output_port_configuration,
868 };
869
874 PCAL6408A( uint8_t i2c_address = (0x40 >> 1) + 0 );
875
881 PCAL6408A( TwoWire& wire, uint8_t i2c_address = (0x40 >> 1) + 0 );
882
884 virtual ~PCAL6408A();
885
886 static constexpr uint8_t access_ref[ NUM_access_word ] = {
887 Input_Port, // IN,
888 Output_Port, // OUT
889 Polarity_Inversion, // POLARITY
890 Configuration, // CONFIG
891 Output_drive_strength_0, // DRIVE_STRENGTH
892 Input_latch, // LATCH
893 Pull_up_pull_down_enable, // PULL_UD_EN
894 Pull_up_pull_down_selection, // PULL_UD_SEL
895 Interrupt_mask, // INT_MASK
896 Interrupt_status, // INT_STATUS
897 Output_port_configuration, // OUTPUT_PORT_CONFIG
898 };
899
900#if DOXYGEN_ONLY
902 enum board {
903 NONE,
904 ARDUINO_SHIELD,
905 };
906
908 const int n_bits;
909
911 const int n_ports;
912
922 void begin( board env = NONE );
923
932 void output( int port, uint8_t value, uint8_t mask = 0 );
933
940 void output( const uint8_t *vp );
941
949 uint8_t input( int port );
950
958 uint8_t* input( uint8_t *vp );
959
968 void config( int port, uint8_t config, uint8_t mask = 0 );
969
976 void config( const uint8_t* vp );
977
985 void write_port( access_word w, const uint8_t* vp );
986
994 void write_port16( access_word w, const uint16_t* vp );
995
1004 uint8_t* read_port( access_word w, uint8_t* vp );
1005
1014 uint16_t* read_port16( access_word w, uint16_t* vp );
1015
1024 void write_port( access_word w, uint8_t value, int port_num = 0 );
1025
1034 void write_port16( access_word w, uint16_t value, int port_num = 0 );
1035
1044 uint8_t read_port( access_word w, int port_num = 0 );
1045
1054 uint16_t read_port16( access_word w, int port_num = 0 );
1055
1060 bool ping( void );
1061
1069 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
1070
1077 int reg_w( uint8_t reg_adr, uint8_t data );
1078
1086 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
1087
1093 uint8_t reg_r( uint8_t reg_adr );
1094
1100 void write_r8( uint8_t reg, uint8_t val );
1101
1109 void write_r16( uint8_t reg, uint16_t val );
1110
1116 uint8_t read_r8( uint8_t reg );
1117
1125 uint16_t read_r16( uint8_t reg );
1126
1135 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
1136 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
1137#endif // DOXYGEN_ONLY
1138};
1139
1145{
1146public:
1148 enum reg_num {
1149 Input_Port_0, Input_Port_1,
1150 Output_Port_0, Output_Port_1,
1151 Polarity_Inversion_port_0, Polarity_Inversion_port_1,
1152 Configuration_port_0, Configuration_port_1,
1153 Output_drive_strength_register_0=0x40, Output_drive_strength_register_0B,
1154 Output_drive_strength_register_1, Output_drive_strength_register_1B,
1155 Input_latch_register_0, Input_latch_register_1,
1156 Pull_up_pull_down_enable_register_0, Pull_up_pull_down_enable_register_1,
1157 Pull_up_pull_down_selection_register_0, Pull_up_pull_down_selection_register_1,
1158 Interrupt_mask_register_0, Interrupt_mask_register_1,
1159 Interrupt_status_register_0, Interrupt_status_register_1,
1160 Output_port_configuration_register,
1161 };
1162
1167 PCAL6416A( uint8_t i2c_address = (0x40 >> 1) + 0 );
1168
1174 PCAL6416A( TwoWire& wire, uint8_t i2c_address = (0x40 >> 1) + 0 );
1175
1177 virtual ~PCAL6416A();
1178
1179 static constexpr uint8_t access_ref[ NUM_access_word ] = {
1180 Input_Port_0, // IN,
1181 Output_Port_0, // OUT
1182 Polarity_Inversion_port_0, // POLARITY
1183 Configuration_port_0, // CONFIG
1184 Output_drive_strength_register_0, // DRIVE_STRENGTH
1185 Input_latch_register_0, // LATCH
1186 Pull_up_pull_down_enable_register_0, // PULL_UD_EN
1187 Pull_up_pull_down_selection_register_0, // PULL_UD_SEL
1188 Interrupt_mask_register_0, // INT_MASK
1189 Interrupt_status_register_0, // INT_STATUS
1190 Output_port_configuration_register, // OUTPUT_PORT_CONFIG
1191 };
1192
1193#if DOXYGEN_ONLY
1195 enum board {
1196 NONE,
1197 ARDUINO_SHIELD,
1198 };
1199
1201 const int n_bits;
1202
1204 const int n_ports;
1205
1215 void begin( board env = NONE );
1216
1225 void output( int port, uint8_t value, uint8_t mask = 0 );
1226
1233 void output( const uint8_t *vp );
1234
1242 uint8_t input( int port );
1243
1251 uint8_t* input( uint8_t *vp );
1252
1261 void config( int port, uint8_t config, uint8_t mask = 0 );
1262
1269 void config( const uint8_t* vp );
1270
1278 void write_port( access_word w, const uint8_t* vp );
1279
1287 void write_port16( access_word w, const uint16_t* vp );
1288
1297 uint8_t* read_port( access_word w, uint8_t* vp );
1298
1307 uint16_t* read_port16( access_word w, uint16_t* vp );
1308
1317 void write_port( access_word w, uint8_t value, int port_num = 0 );
1318
1327 void write_port16( access_word w, uint16_t value, int port_num = 0 );
1328
1337 uint8_t read_port( access_word w, int port_num = 0 );
1338
1347 uint16_t read_port16( access_word w, int port_num = 0 );
1348
1353 bool ping( void );
1354
1362 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
1363
1370 int reg_w( uint8_t reg_adr, uint8_t data );
1371
1379 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
1380
1386 uint8_t reg_r( uint8_t reg_adr );
1387
1393 void write_r8( uint8_t reg, uint8_t val );
1394
1402 void write_r16( uint8_t reg, uint16_t val );
1403
1409 uint8_t read_r8( uint8_t reg );
1410
1418 uint16_t read_r16( uint8_t reg );
1419
1428 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
1429 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
1430#endif // DOXYGEN_ONLY
1431};
1432
1438{
1439public:
1441 enum reg_num {
1442 Input_Port_0, Input_Port_1, Input_Port_2, reserved0,
1443 Output_Port_0, Output_Port_1, Output_Port_2, reserved1,
1444 Polarity_Inversion_port_0, Polarity_Inversion_port_1, Polarity_Inversion_port_2, reserved2,
1445 Configuration_port_0, Configuration_port_1, Configuration_port_2,
1446 Output_drive_strength_register_port_0A=0x40, Output_drive_strength_register_port_0B,
1447 Output_drive_strength_register_port_1A, Output_drive_strength_register_port_1B,
1448 Output_drive_strength_register_port_2A, Output_drive_strength_register_port_2B,
1449 reserved3, reserved4,
1450 Input_latch_register_port_0, Input_latch_register_port_1, Input_latch_register_port_2, reserved5,
1451 Pull_up_pull_down_enable_register_port_0, Pull_up_pull_down_enable_register_port_1, Pull_up_pull_down_enable_register_port_2, reserved6,
1452 Pull_up_pull_down_selection_register_port_0, Pull_up_pull_down_selection_register_port_1, Pull_up_pull_down_selection_register_port_2, reserved7,
1453 Interrupt_mask_register_port_0, Interrupt_mask_register_port_1, Interrupt_mask_register_port_2, reserved8,
1454 Interrupt_status_register_port_0, Interrupt_status_register_port_1, Interrupt_status_register_port_2, reserved9,
1455 Output_port_configuration_register, reserved10, reserved11, reserved12,
1456 Interrupt_edge_register_port_0A, Interrupt_edge_register_port_0B,
1457 Interrupt_edge_register_port_1A, Interrupt_edge_register_port_1B,
1458 Interrupt_edge_register_port_2A, Interrupt_edge_register_port_2B,
1459 reserved13, reserved14,
1460 Interrupt_clear_register_port_0, Interrupt_clear_register_port_1, Interrupt_clear_register_port_2, reserved15,
1461 Input_status_port_0, Input_status_port_1, Input_status_port_2, reserved16,
1462 Individual_pin_output_port_0_configuration_register, Individual_pin_output_port_1_configuration_register, Individual_pin_output_port_2_configuration_register, reserved17,
1463 Switch_debounce_enable_0, Switch_debounce_enable_1, Switch_debounce_count,
1464 };
1465
1470 PCAL6524( uint8_t i2c_address = (0x44 >> 1) + 0 );
1471
1477 PCAL6524( TwoWire& wire, uint8_t i2c_address = (0x44 >> 1) + 0 );
1478
1480 virtual ~PCAL6524();
1481
1482 static constexpr uint8_t access_ref[ NUM_access_word ] = {
1483 Input_Port_0, // IN,
1484 Output_Port_0, // OUT
1485 Polarity_Inversion_port_0, // POLARITY
1486 Configuration_port_0, // CONFIG
1487 Output_drive_strength_register_port_0A, // DRIVE_STRENGTH
1488 Input_latch_register_port_0, // LATCH
1489 Pull_up_pull_down_enable_register_port_0, // PULL_UD_EN
1490 Pull_up_pull_down_selection_register_port_0, // PULL_UD_SEL
1491 Interrupt_mask_register_port_0, // INT_MASK
1492 Interrupt_status_register_port_0, // INT_STATUS
1493 Output_port_configuration_register, // OUTPUT_PORT_CONFIG
1494 };
1495
1496#if DOXYGEN_ONLY
1498 enum board {
1499 NONE,
1500 ARDUINO_SHIELD,
1501 };
1502
1504 const int n_bits;
1505
1507 const int n_ports;
1508
1518 void begin( board env = NONE );
1519
1528 void output( int port, uint8_t value, uint8_t mask = 0 );
1529
1536 void output( const uint8_t *vp );
1537
1545 uint8_t input( int port );
1546
1554 uint8_t* input( uint8_t *vp );
1555
1564 void config( int port, uint8_t config, uint8_t mask = 0 );
1565
1572 void config( const uint8_t* vp );
1573
1581 void write_port( access_word w, const uint8_t* vp );
1582
1590 void write_port16( access_word w, const uint16_t* vp );
1591
1600 uint8_t* read_port( access_word w, uint8_t* vp );
1601
1610 uint16_t* read_port16( access_word w, uint16_t* vp );
1611
1620 void write_port( access_word w, uint8_t value, int port_num = 0 );
1621
1630 void write_port16( access_word w, uint16_t value, int port_num = 0 );
1631
1640 uint8_t read_port( access_word w, int port_num = 0 );
1641
1650 uint16_t read_port16( access_word w, int port_num = 0 );
1651
1656 bool ping( void );
1657
1665 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
1666
1673 int reg_w( uint8_t reg_adr, uint8_t data );
1674
1682 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
1683
1689 uint8_t reg_r( uint8_t reg_adr );
1690
1696 void write_r8( uint8_t reg, uint8_t val );
1697
1705 void write_r16( uint8_t reg, uint16_t val );
1706
1712 uint8_t read_r8( uint8_t reg );
1713
1721 uint16_t read_r16( uint8_t reg );
1722
1731 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
1732 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
1733#endif // DOXYGEN_ONLY
1734};
1735
1741{
1742public:
1744 enum reg_num {
1745 Input_Port_0, Input_Port_1, Input_Port_2, Input_Port_3, Input_Port_4,
1746 Output_Port_0, Output_Port_1, Output_Port_2, Output_Port_3, Output_Port_4,
1747 Polarity_Inversion_port_0, Polarity_Inversion_port_1, Polarity_Inversion_port_2, Polarity_Inversion_port_3, Polarity_Inversion_port_4,
1748 Configuration_port_0, Configuration_port_1, Configuration_port_2, Configuration_port_3, Configuration_port_4,
1749 Output_drive_strength_register_port_0A = 0x30, Output_drive_strength_register_port_0B,
1750 Output_drive_strength_register_port_1A, Output_drive_strength_register_port_1B,
1751 Output_drive_strength_register_port_2A, Output_drive_strength_register_port_2B,
1752 Output_drive_strength_register_port_3A, Output_drive_strength_register_port_3B,
1753 Output_drive_strength_register_port_4A, reserved0,
1754 Input_latch_register_port_0, Input_latch_register_port_1, Input_latch_register_port_2, Input_latch_register_port_3, Input_latch_register_port_4,
1755 Pull_up_pull_down_enable_register_port_0, Pull_up_pull_down_enable_register_port_1, Pull_up_pull_down_enable_register_port_2, Pull_up_pull_down_enable_register_port_3, Pull_up_pull_down_enable_register_port_4,
1756 Pull_up_pull_down_selection_register_port_0, Pull_up_pull_down_selection_register_port_1, Pull_up_pull_down_selection_register_port_2, Pull_up_pull_down_selection_register_port_3, Pull_up_pull_down_selection_register_port_4,
1757 Interrupt_mask_register_port_0, Interrupt_mask_register_port_1, Interrupt_mask_register_port_2, Interrupt_mask_register_port_3, Interrupt_mask_register_port_4,
1758 Interrupt_status_register_port_0, Interrupt_status_register_port_1, Interrupt_status_register_port_2, Interrupt_status_register_port_3, Interrupt_status_register_port_4,
1759 Output_port_configuration_register,
1760 Interrupt_edge_register_port_0A, Interrupt_edge_register_port_0B,
1761 Interrupt_edge_register_port_1A, Interrupt_edge_register_port_1B,
1762 Interrupt_edge_register_port_2A, Interrupt_edge_register_port_2B,
1763 Interrupt_edge_register_port_3A, Interrupt_edge_register_port_3B,
1764 Interrupt_edge_register_port_4A, reserved1,
1765 Interrupt_clear_register_port_0, Interrupt_clear_register_port_1, Interrupt_clear_register_port_2, Interrupt_clear_register_port_3, Interrupt_clear_register_port_4,
1766 Input_status_port_0, Input_status_port_1, Input_status_port_2, Input_status_port_3, Input_status_port_4,
1767 Individual_pin_output_port_0_configuration_register, Individual_pin_output_port_1_configuration_register, Individual_pin_output_port_2_configuration_register, Individual_pin_output_port_3_configuration_register, Individual_pin_output_port_4_configuration_register,
1768 Switch_debounce_enable_0, Switch_debounce_enable_1,
1769 Switch_debounce_count,
1770 };
1771
1776 PCAL6534( uint8_t i2c_address = (0x44 >> 1) + 0 );
1777
1783 PCAL6534( TwoWire& wire, uint8_t i2c_address = (0x44 >> 1) + 0 );
1784
1786 virtual ~PCAL6534();
1787
1788 static constexpr uint8_t access_ref[ NUM_access_word ] = {
1789 Input_Port_0, // IN,
1790 Output_Port_0, // OUT
1791 Polarity_Inversion_port_0, // POLARITY
1792 Configuration_port_0, // CONFIG
1793 Output_drive_strength_register_port_0A, // DRIVE_STRENGTH
1794 Input_latch_register_port_0, // LATCH
1795 Pull_up_pull_down_enable_register_port_0, // PULL_UD_EN
1796 Pull_up_pull_down_selection_register_port_0, // PULL_UD_SEL
1797 Interrupt_mask_register_port_0, // INT_MASK
1798 Interrupt_status_register_port_0, // INT_STATUS
1799 Output_port_configuration_register, // OUTPUT_PORT_CONFIG
1800 };
1801
1802#if DOXYGEN_ONLY
1804 enum board {
1805 NONE,
1806 ARDUINO_SHIELD,
1807 };
1808
1810 const int n_bits;
1811
1813 const int n_ports;
1814
1824 void begin( board env = NONE );
1825
1834 void output( int port, uint8_t value, uint8_t mask = 0 );
1835
1842 void output( const uint8_t *vp );
1843
1851 uint8_t input( int port );
1852
1860 uint8_t* input( uint8_t *vp );
1861
1870 void config( int port, uint8_t config, uint8_t mask = 0 );
1871
1878 void config( const uint8_t* vp );
1879
1887 void write_port( access_word w, const uint8_t* vp );
1888
1896 void write_port16( access_word w, const uint16_t* vp );
1897
1906 uint8_t* read_port( access_word w, uint8_t* vp );
1907
1916 uint16_t* read_port16( access_word w, uint16_t* vp );
1917
1926 void write_port( access_word w, uint8_t value, int port_num = 0 );
1927
1936 void write_port16( access_word w, uint16_t value, int port_num = 0 );
1937
1946 uint8_t read_port( access_word w, int port_num = 0 );
1947
1956 uint16_t read_port16( access_word w, int port_num = 0 );
1957
1962 bool ping( void );
1963
1971 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
1972
1979 int reg_w( uint8_t reg_adr, uint8_t data );
1980
1988 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
1989
1995 uint8_t reg_r( uint8_t reg_adr );
1996
2002 void write_r8( uint8_t reg, uint8_t val );
2003
2011 void write_r16( uint8_t reg, uint16_t val );
2012
2018 uint8_t read_r8( uint8_t reg );
2019
2027 uint16_t read_r16( uint8_t reg );
2028
2037 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
2038 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
2039#endif // DOXYGEN_ONLY
2040};
2041
2042class GPIO_SPI : public GPIO_base
2043{
2044public:
2052 GPIO_SPI( uint8_t device_address, int nbits, const uint8_t* arp, uint8_t ai );
2053
2056 virtual ~GPIO_SPI();
2057
2065 virtual int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
2066
2074 virtual int reg_w( uint8_t reg_adr, uint8_t data );
2075
2083 virtual int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
2084
2090 virtual uint8_t reg_r( uint8_t reg_adr );
2091};
2092
2100class PCAL97xx_base : public GPIO_SPI
2101{
2102public:
2103 PCAL97xx_base( uint8_t dev_address, const int nbits, const uint8_t arp[], uint8_t ai );
2104 virtual ~PCAL97xx_base();
2105};
2106
2111class PCAL9722 : public PCAL97xx_base
2112{
2113public:
2115 enum reg_num {
2116 Input_Port_0, Input_Port_1, Input_Port_2, reserved0,
2117 Output_Port_0, Output_Port_1, Output_Port_2, reserved1,
2118 Polarity_Inversion_port_0, Polarity_Inversion_port_1, Polarity_Inversion_port_2, reserved2,
2119 Configuration_port_0, Configuration_port_1, Configuration_port_2,
2120 Output_drive_strength_register_port_0A=0x40, Output_drive_strength_register_port_0B,
2121 Output_drive_strength_register_port_1A, Output_drive_strength_register_port_1B,
2122 Output_drive_strength_register_port_2A, Output_drive_strength_register_port_2B,
2123 reserved3, reserved4,
2124 Input_latch_register_port_0, Input_latch_register_port_1, Input_latch_register_port_2, reserved5,
2125 Pull_up_pull_down_enable_register_port_0, Pull_up_pull_down_enable_register_port_1, Pull_up_pull_down_enable_register_port_2, reserved6,
2126 Pull_up_pull_down_selection_register_port_0, Pull_up_pull_down_selection_register_port_1, Pull_up_pull_down_selection_register_port_2, reserved7,
2127 Interrupt_mask_register_port_0, Interrupt_mask_register_port_1, Interrupt_mask_register_port_2, reserved8,
2128 Interrupt_status_register_port_0, Interrupt_status_register_port_1, Interrupt_status_register_port_2, reserved9,
2129 Output_port_configuration_register, reserved10, reserved11, reserved12,
2130 Interrupt_edge_register_port_0A, Interrupt_edge_register_port_0B,
2131 Interrupt_edge_register_port_1A, Interrupt_edge_register_port_1B,
2132 Interrupt_edge_register_port_2A, Interrupt_edge_register_port_2B,
2133 reserved13, reserved14,
2134 Interrupt_clear_register_port_0, Interrupt_clear_register_port_1, Interrupt_clear_register_port_2, reserved15,
2135 Input_status_port_0, Input_status_port_1, Input_status_port_2, reserved16,
2136 Individual_pin_output_port_0_configuration_register, Individual_pin_output_port_1_configuration_register, Individual_pin_output_port_2_configuration_register, reserved17,
2137 Switch_debounce_enable_0, Switch_debounce_enable_1, Switch_debounce_count,
2138 };
2139
2144 PCAL9722( uint8_t dev_address = (0x40 >> 1) + 0 );
2145
2147 virtual ~PCAL9722();
2148
2158 void begin( board env = NONE );
2159
2160 static constexpr uint8_t access_ref[ NUM_access_word ] = {
2161 Input_Port_0, // IN,
2162 Output_Port_0, // OUT
2163 Polarity_Inversion_port_0, // POLARITY
2164 Configuration_port_0, // CONFIG
2165 Output_drive_strength_register_port_0A, // DRIVE_STRENGTH
2166 Input_latch_register_port_0, // LATCH
2167 Pull_up_pull_down_enable_register_port_0, // PULL_UD_EN
2168 Pull_up_pull_down_selection_register_port_0, // PULL_UD_SEL
2169 Interrupt_mask_register_port_0, // INT_MASK
2170 Interrupt_status_register_port_0, // INT_STATUS
2171 Output_port_configuration_register, // OUTPUT_PORT_CONFIG
2172 };
2173
2174private:
2175 static constexpr int RESET_PIN_PCAL9722 = 6;
2176
2177public:
2178#if DOXYGEN_ONLY
2180 enum board {
2181 NONE,
2182 ARDUINO_SHIELD,
2183 };
2184
2186 const int n_bits;
2187
2189 const int n_ports;
2190
2199 void output( int port, uint8_t value, uint8_t mask = 0 );
2200
2207 void output( const uint8_t *vp );
2208
2216 uint8_t input( int port );
2217
2225 uint8_t* input( uint8_t *vp );
2226
2235 void config( int port, uint8_t config, uint8_t mask = 0 );
2236
2243 void config( const uint8_t* vp );
2244
2252 void write_port( access_word w, const uint8_t* vp );
2253
2261 void write_port16( access_word w, const uint16_t* vp );
2262
2271 uint8_t* read_port( access_word w, uint8_t* vp );
2272
2281 uint16_t* read_port16( access_word w, uint16_t* vp );
2282
2291 void write_port( access_word w, uint8_t value, int port_num = 0 );
2292
2301 void write_port16( access_word w, uint16_t value, int port_num = 0 );
2302
2311 uint8_t read_port( access_word w, int port_num = 0 );
2312
2321 uint16_t read_port16( access_word w, int port_num = 0 );
2322
2330 int reg_w( uint8_t reg_adr, const uint8_t *data, uint16_t size );
2331
2338 int reg_w( uint8_t reg_adr, uint8_t data );
2339
2347 int reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size );
2348
2354 uint8_t reg_r( uint8_t reg_adr );
2355
2361 void write_r8( uint8_t reg, uint8_t val );
2362
2370 void write_r16( uint8_t reg, uint16_t val );
2371
2377 uint8_t read_r8( uint8_t reg );
2378
2386 uint16_t read_r16( uint8_t reg );
2387
2396 void bit_op8( uint8_t reg, uint8_t mask, uint8_t value );
2397 void bit_op16( uint8_t reg, uint16_t mask, uint16_t value );
2398#endif // DOXYGEN_ONLY
2399};
2400
2401
2402#endif // ARDUINO_GPIO_NXP_ARD_H
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
static void print_bin(uint8_t v)
Definition GPIO_NXP.cpp:188
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
void config(const uint8_t *vp)
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
void output(const uint8_t *vp)
const int n_bits
Definition GPIO_NXP.h:295
void write_r16(uint8_t reg, uint16_t val)
void write_port16(access_word w, const uint16_t *vp)
void write_port16(access_word w, uint16_t value, int port_num=0)
uint8_t read_r8(uint8_t reg)
void write_r8(uint8_t reg, uint8_t val)
uint8_t reg_r(uint8_t reg_adr)
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
const int n_ports
Definition GPIO_NXP.h:298
uint16_t read_port16(access_word w, int port_num=0)
void output(int port, uint8_t value, uint8_t mask=0)
uint16_t * read_port16(access_word w, uint16_t *vp)
int reg_w(uint8_t reg_adr, uint8_t data)
void config(int port, uint8_t config, uint8_t mask=0)
uint8_t * input(uint8_t *vp)
void begin(board env=NONE)
void write_port(access_word w, const uint8_t *vp)
uint8_t * read_port(access_word w, uint8_t *vp)
uint16_t read_r16(uint8_t reg)
bool ping(void)
uint8_t input(int port)
PCA9554(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:198
void write_port(access_word w, uint8_t value, int port_num=0)
uint8_t read_port(access_word w, int port_num=0)
virtual ~PCA9554()
Definition GPIO_NXP.cpp:208
void write_r8(uint8_t reg, uint8_t val)
uint8_t * read_port(access_word w, uint8_t *vp)
void config(int port, uint8_t config, uint8_t mask=0)
uint16_t read_port16(access_word w, int port_num=0)
virtual ~PCA9555()
Definition GPIO_NXP.cpp:227
void output(const uint8_t *vp)
void write_port(access_word w, uint8_t value, int port_num=0)
void write_port16(access_word w, uint16_t value, int port_num=0)
void output(int port, uint8_t value, uint8_t mask=0)
uint16_t read_r16(uint8_t reg)
int reg_w(uint8_t reg_adr, uint8_t data)
const int n_bits
Definition GPIO_NXP.h:581
uint8_t reg_r(uint8_t reg_adr)
uint8_t read_r8(uint8_t reg)
void write_port(access_word w, const uint8_t *vp)
uint16_t * read_port16(access_word w, uint16_t *vp)
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
void write_r16(uint8_t reg, uint16_t val)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
uint8_t * input(uint8_t *vp)
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
uint8_t input(int port)
void write_port16(access_word w, const uint16_t *vp)
const int n_ports
Definition GPIO_NXP.h:584
PCA9555(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:217
bool ping(void)
void begin(board env=NONE)
void config(const uint8_t *vp)
uint8_t read_port(access_word w, int port_num=0)
uint16_t * read_port16(access_word w, uint16_t *vp)
uint8_t read_r8(uint8_t reg)
void output(const uint8_t *vp)
void config(const uint8_t *vp)
PCAL6408A(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:253
const int n_bits
Definition GPIO_NXP.h:908
uint8_t * input(uint8_t *vp)
void write_port16(access_word w, uint16_t value, int port_num=0)
void begin(board env=NONE)
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
bool ping(void)
void write_r8(uint8_t reg, uint8_t val)
void write_r16(uint8_t reg, uint16_t val)
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
uint8_t reg_r(uint8_t reg_adr)
int reg_w(uint8_t reg_adr, uint8_t data)
uint16_t read_port16(access_word w, int port_num=0)
uint8_t * read_port(access_word w, uint8_t *vp)
const int n_ports
Definition GPIO_NXP.h:911
uint8_t read_port(access_word w, int port_num=0)
void config(int port, uint8_t config, uint8_t mask=0)
void write_port(access_word w, uint8_t value, int port_num=0)
virtual ~PCAL6408A()
Definition GPIO_NXP.cpp:263
void write_port(access_word w, const uint8_t *vp)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
void write_port16(access_word w, const uint16_t *vp)
void output(int port, uint8_t value, uint8_t mask=0)
uint8_t input(int port)
uint16_t read_r16(uint8_t reg)
uint16_t read_port16(access_word w, int port_num=0)
PCAL6416A(uint8_t i2c_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:272
bool ping(void)
void write_r8(uint8_t reg, uint8_t val)
void output(const uint8_t *vp)
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
void write_port(access_word w, const uint8_t *vp)
int reg_w(uint8_t reg_adr, uint8_t data)
void config(const uint8_t *vp)
uint8_t reg_r(uint8_t reg_adr)
void output(int port, uint8_t value, uint8_t mask=0)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
void begin(board env=NONE)
uint8_t read_port(access_word w, int port_num=0)
uint8_t * input(uint8_t *vp)
uint8_t * read_port(access_word w, uint8_t *vp)
uint16_t * read_port16(access_word w, uint16_t *vp)
uint8_t read_r8(uint8_t reg)
uint8_t input(int port)
void config(int port, uint8_t config, uint8_t mask=0)
const int n_ports
Definition GPIO_NXP.h:1204
virtual ~PCAL6416A()
Definition GPIO_NXP.cpp:282
uint16_t read_r16(uint8_t reg)
void write_port16(access_word w, uint16_t value, int port_num=0)
const int n_bits
Definition GPIO_NXP.h:1201
void write_port(access_word w, uint8_t value, int port_num=0)
void write_r16(uint8_t reg, uint16_t val)
void write_port16(access_word w, const uint16_t *vp)
uint8_t read_port(access_word w, int port_num=0)
virtual ~PCAL6524()
Definition GPIO_NXP.cpp:301
void output(const uint8_t *vp)
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
void config(int port, uint8_t config, uint8_t mask=0)
uint8_t * input(uint8_t *vp)
const int n_ports
Definition GPIO_NXP.h:1507
PCAL6524(uint8_t i2c_address=(0x44 > > 1)+0)
Definition GPIO_NXP.cpp:291
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
void begin(board env=NONE)
void write_port(access_word w, const uint8_t *vp)
uint8_t * read_port(access_word w, uint8_t *vp)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
void write_r8(uint8_t reg, uint8_t val)
uint16_t read_r16(uint8_t reg)
uint16_t * read_port16(access_word w, uint16_t *vp)
void output(int port, uint8_t value, uint8_t mask=0)
void write_r16(uint8_t reg, uint16_t val)
void write_port16(access_word w, const uint16_t *vp)
bool ping(void)
void config(const uint8_t *vp)
uint8_t reg_r(uint8_t reg_adr)
uint8_t read_r8(uint8_t reg)
void write_port16(access_word w, uint16_t value, int port_num=0)
uint16_t read_port16(access_word w, int port_num=0)
void write_port(access_word w, uint8_t value, int port_num=0)
const int n_bits
Definition GPIO_NXP.h:1504
uint8_t input(int port)
int reg_w(uint8_t reg_adr, uint8_t data)
void write_r16(uint8_t reg, uint16_t val)
void write_port16(access_word w, uint16_t value, int port_num=0)
uint8_t reg_r(uint8_t reg_adr)
uint8_t * read_port(access_word w, uint8_t *vp)
const int n_ports
Definition GPIO_NXP.h:1813
void output(const uint8_t *vp)
uint16_t read_port16(access_word w, int port_num=0)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
void config(const uint8_t *vp)
virtual ~PCAL6534()
Definition GPIO_NXP.cpp:320
uint8_t read_port(access_word w, int port_num=0)
void write_port(access_word w, uint8_t value, int port_num=0)
void write_r8(uint8_t reg, uint8_t val)
void begin(board env=NONE)
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
PCAL6534(uint8_t i2c_address=(0x44 > > 1)+0)
Definition GPIO_NXP.cpp:310
uint8_t read_r8(uint8_t reg)
uint16_t read_r16(uint8_t reg)
uint16_t * read_port16(access_word w, uint16_t *vp)
void config(int port, uint8_t config, uint8_t mask=0)
uint8_t * input(uint8_t *vp)
uint8_t input(int port)
void write_port(access_word w, const uint8_t *vp)
void write_port16(access_word w, const uint16_t *vp)
void output(int port, uint8_t value, uint8_t mask=0)
int reg_w(uint8_t reg_adr, uint8_t data)
bool ping(void)
const int n_bits
Definition GPIO_NXP.h:1810
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
PCAL6xxx_base(uint8_t i2c_address, const int nbits, const uint8_t arp[], uint8_t ai)
Definition GPIO_NXP.cpp:236
virtual ~PCAL6xxx_base()
Definition GPIO_NXP.cpp:246
void output(const uint8_t *vp)
void config(const uint8_t *vp)
void begin(board env=NONE)
Definition GPIO_NXP.cpp:415
void write_port(access_word w, uint8_t value, int port_num=0)
const int n_bits
Definition GPIO_NXP.h:2186
virtual ~PCAL9722()
Definition GPIO_NXP.cpp:411
void write_port16(access_word w, uint16_t value, int port_num=0)
void write_r8(uint8_t reg, uint8_t val)
uint16_t * read_port16(access_word w, uint16_t *vp)
uint16_t read_r16(uint8_t reg)
const int n_ports
Definition GPIO_NXP.h:2189
uint8_t input(int port)
uint8_t * read_port(access_word w, uint8_t *vp)
void write_port16(access_word w, const uint16_t *vp)
uint8_t read_port(access_word w, int port_num=0)
void write_port(access_word w, const uint8_t *vp)
PCAL9722(uint8_t dev_address=(0x40 > > 1)+0)
Definition GPIO_NXP.cpp:406
void output(int port, uint8_t value, uint8_t mask=0)
int reg_w(uint8_t reg_adr, uint8_t data)
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
void config(int port, uint8_t config, uint8_t mask=0)
void write_r16(uint8_t reg, uint16_t val)
int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size)
uint8_t reg_r(uint8_t reg_adr)
uint16_t read_port16(access_word w, int port_num=0)
uint8_t * input(uint8_t *vp)
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
uint8_t read_r8(uint8_t reg)