GPIO_NXP_Arduino 0.3.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, const 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 arp( ar ),
10 auto_increment( ai )
11{
12 constexpr uint16_t i = 0x0001;
13 uint8_t* tp = (uint8_t*)(&i);
14
15 endian = tp[ 0 ]; // 'true' if LittleEndian
16}
17
19{
20}
21
22void GPIO_base::begin( board env )
23{
24 if ( env ) {
25 pinMode(RESET_PIN, OUTPUT);
26 pinMode(ADDR_PIN, OUTPUT);
27
28 digitalWrite( RESET_PIN , 1 );
29 digitalWrite( ADDR_PIN , 1 );
30 digitalWrite( ADDR_PIN , 0 );
31 delay( 1 );
32
33 digitalWrite( RESET_PIN , 0 );
34 delay( 1 ); // reset time = 500ns(min)
35 digitalWrite( RESET_PIN , 1 );
36 delay( 1 ); // reset recovery time = 600ns(min)
37 }
38}
39
40void GPIO_base::output( int port, uint8_t value, uint8_t mask )
41{
42 if ( mask )
43 bit_op8( *(arp + OUT) + port, mask, value );
44
45 write_r8( *(arp + OUT) + port, value );
46}
47
48void GPIO_base::output( uint8_t *vp )
49{
50 write_port( OUT, vp );
51}
52
53uint8_t GPIO_base::input( int port )
54{
55 return read_r8( *(arp + IN) + port );
56}
57
58uint8_t* GPIO_base::input( uint8_t *vp )
59{
60 read_port( IN, vp );
61
62 return vp;
63}
64
65void GPIO_base::config( int port, uint8_t config, uint8_t mask )
66{
67 if ( mask )
68 bit_op8( *(arp + CONFIG) + port, mask, config );
69
70 write_r8( *(arp + CONFIG) + port, config );
71}
72
73void GPIO_base::config( uint8_t* vp )
74{
75 write_port( CONFIG, vp );
76}
77
78void GPIO_base::write_port( access_word w, uint8_t* vp )
79{
80 if ( auto_increment ) {
81 reg_w( auto_increment | *(arp + w), vp, n_ports );
82 }
83 else {
84 for ( int i = 0; i < n_ports; i++ )
85 write_r8( *(arp + w) + i, *vp++ );
86 }
87}
88
89void GPIO_base::write_port16( access_word w, uint16_t* vp )
90{
91 if ( endian ) {
92 uint16_t temp;
93 for ( int i = 0; i < n_ports; i++ ) {
94 temp = vp[ i ] << 8;
95 vp[ i ] = temp | vp[ i ] >> 8;
96 }
97 }
98
99 int n_bytes = (n_bits * 2 + 7) / 8;
100
101 if ( auto_increment ) {
102 reg_w( auto_increment | *(arp + w), (uint8_t*)vp, n_bytes );
103 }
104 else {
105 for ( int i = 0; i < n_bytes; i++ )
106 write_r8( *(arp + w) + i, *vp++ );
107 }
108}
109
110uint8_t* GPIO_base::read_port( access_word w, uint8_t* vp )
111{
112 if ( auto_increment ) {
113 reg_r( auto_increment | *(arp + w), vp, n_ports );
114 }
115 else {
116 for ( int i = 0; i < n_ports; i++ )
117 *(vp + i) = read_r8( *(arp + w) + i );
118 }
119
120 return vp;
121}
122
123uint16_t* GPIO_base::read_port16( access_word w, uint16_t* vp )
124{
125 int n_bytes = (n_bits * 2 + 7) / 8;
126
127 if ( auto_increment ) {
128 reg_r( auto_increment | *(arp + w), (uint8_t*)vp, n_bytes );
129 }
130 else {
131 for ( int i = 0; i < n_bytes; i++ )
132 *(vp + i) = read_r8( *(arp + w) + i );
133 }
134
135
136 if ( endian ) {
137 uint16_t temp;
138
139 for ( int i = 0; i < n_ports; i++ ) {
140 temp = vp[ i ] << 8;
141 vp[ i ] = temp | vp[ i ] >> 8;
142 }
143 }
144
145 return vp;
146}
147
148void GPIO_base::write_port( access_word w, uint8_t value, int port_num )
149{
150 write_r8( *(arp + w) + port_num, value );
151}
152
153void GPIO_base::write_port16( access_word w, uint16_t value, int port_num )
154{
155 write_r16( *(arp + w) + port_num, value );
156}
157
158uint8_t GPIO_base::read_port( access_word w, int port_num )
159{
160 return read_r8( *(arp + w) + port_num );
161}
162
163uint16_t GPIO_base::read_port16( access_word w, int port_num )
164{
165 return read_r16( *(arp + w) + port_num );
166}
167
168void GPIO_base::print_bin( uint8_t v )
169{
170 Serial.print(" 0b");
171 for (int i = 7; 0 <= i; i-- )
172 Serial.print(((v >> i) & 0x1) ? "1" : "0");
173}
174
175
176/* ******** PCA9554 ******** */
177
178PCA9554::PCA9554( uint8_t i2c_address ) :
179 GPIO_base( i2c_address, 8, access_ref, 0x00 )
180{
181}
182
183PCA9554::~PCA9554()
184{
185}
186
187constexpr uint8_t PCA9554::access_ref[];
188
189
190/* ******** PCA9555 ******** */
191
192PCA9555::PCA9555( uint8_t i2c_address ) :
193 GPIO_base( i2c_address, 16, access_ref, 0x00 )
194{
195}
196
197PCA9555::~PCA9555()
198{
199}
200
201constexpr uint8_t PCA9555::access_ref[];
202
203
204/* ******** PCAL6xxx_base ******** */
205
206PCAL6xxx_base::PCAL6xxx_base( uint8_t i2c_address, const int nbits, const uint8_t arp[], uint8_t ai ) :
207 GPIO_base( i2c_address, nbits, arp, ai )
208{
209}
210
211PCAL6xxx_base::~PCAL6xxx_base()
212{
213}
214
215
216/* ******** PCAL6408A ******** */
217
218PCAL6408A::PCAL6408A( uint8_t i2c_address ) :
219 PCAL6xxx_base( i2c_address, 8, access_ref, 0 )
220{
221}
222
223PCAL6408A::~PCAL6408A()
224{
225}
226
227constexpr uint8_t PCAL6408A::access_ref[];
228
229
230/* ******** PCAL6416A ******** */
231
232PCAL6416A::PCAL6416A( uint8_t i2c_address ) :
233 PCAL6xxx_base( i2c_address, 16, access_ref, 0 )
234{
235}
236
237PCAL6416A::~PCAL6416A()
238{
239}
240
241constexpr uint8_t PCAL6416A::access_ref[];
242
243
244/* ******** PCAL6524 ******** */
245
246PCAL6524::PCAL6524( uint8_t i2c_address ) :
247 PCAL6xxx_base( i2c_address, 24, access_ref, 0x80 )
248{
249}
250
251PCAL6524::~PCAL6524()
252{
253}
254
255constexpr uint8_t PCAL6524::access_ref[];
256
257
258/* ******** PCAL6534 ******** */
259
260PCAL6534::PCAL6534( uint8_t i2c_address ) :
261 PCAL6xxx_base( i2c_address, 34, access_ref, 0x80 )
262{
263}
264
265PCAL6534::~PCAL6534()
266{
267}
268
269constexpr uint8_t PCAL6534::access_ref[];
GPIO_base(uint8_t i2c_address, const int nbits, const uint8_t *arp, uint8_t ai)
Definition: GPIO_NXP.cpp:5
uint16_t * read_port16(access_word w, uint16_t *vp)
Definition: GPIO_NXP.cpp:123
const int n_bits
Definition: GPIO_NXP.h:53
void config(int port, uint8_t config, uint8_t mask=0)
Definition: GPIO_NXP.cpp:65
const int n_ports
Definition: GPIO_NXP.h:56
virtual ~GPIO_base()
Definition: GPIO_NXP.cpp:18
void write_port16(access_word w, uint16_t *vp)
Definition: GPIO_NXP.cpp:89
void output(int port, uint8_t value, uint8_t mask=0)
Definition: GPIO_NXP.cpp:40
void write_port(access_word w, uint8_t *vp)
Definition: GPIO_NXP.cpp:78
void begin(board env=NONE)
Definition: GPIO_NXP.cpp:22
uint8_t input(int port)
Definition: GPIO_NXP.cpp:53
uint8_t * read_port(access_word w, uint8_t *vp)
Definition: GPIO_NXP.cpp:110