I2C_device_Arduino 0.2
An I²C utility class for Arduino
Loading...
Searching...
No Matches
I2C_device.cpp
Go to the documentation of this file.
1#include "I2C_device.h"
2
3I2C_device::I2C_device( uint8_t i2c_address, bool repeated_start_enable ) : i2c_addr( i2c_address ), rs_dis( !repeated_start_enable )
4{
5 // do nothing.
6 // leave it in default state.
7}
8
10{
11}
12
14{
15 rs_dis = !en;
16}
17
18bool I2C_device::ping( uint8_t addr )
19{
20 Wire.beginTransmission( addr );
21 return !Wire.endTransmission();
22}
23
24void I2C_device::scan( void )
25{
26 bool result[ 128 ];
27
28 for ( uint8_t i = 0; i < 128; i++ )
29 result[i] = I2C_device::ping(i);
30
31 Serial.print( "\nI2C scan result\n " );
32 for ( uint8_t x = 0; x < 16; x++ ) {
33 Serial.print( " x" );
34 Serial.print( x, HEX );
35 }
36
37 for ( uint8_t i = 0; i < 128; i++ ) {
38 if ( !( i % 16) ) {
39 Serial.print( "\n" );
40 Serial.print( i / 16, HEX );
41 Serial.print( "x:" );
42 }
43
44 if ( result[ i ] ) {
45 Serial.print( " " );
46 Serial.print( i, HEX );
47 }
48 else {
49 Serial.print( " --" );
50 }
51 }
52 Serial.print( "\n" );
53}
54
55uint16_t I2C_device::tx( uint8_t *data, uint16_t size, bool stop )
56{
57 Wire.beginTransmission( i2c_addr );
58 size = Wire.write( data, size );
59 uint8_t rtn = Wire.endTransmission( stop );
60
61 if (rtn)
62 Serial.println( "i2c_tx: ERROR" );
63
64 return size;
65}
66
67uint16_t I2C_device::rx( uint8_t *data, uint16_t size )
68{
69 uint16_t r_size = Wire.requestFrom( i2c_addr, size );
70
71 if (r_size != size)
72 Serial.println( "i2c_rx: received size was shorter than specified" );
73
74 for ( uint16_t i = 0; i < size; i++ ) {
75 while ( !Wire.available() )
76 ;
77 data[ i ] = Wire.read();
78 }
79 return r_size;
80}
81
82uint16_t I2C_device::reg_w( uint8_t reg_adr, uint8_t *data, uint16_t size )
83{
84 uint8_t buffer[ size + 1 ];
85
86 buffer[ 0 ] = reg_adr;
87 for ( uint16_t i = 0; i < size; i++)
88 buffer[ i + 1 ] = data[ i ];
89
90 return tx( buffer, sizeof( buffer ) );
91}
92
93uint16_t I2C_device::reg_w( uint8_t reg_adr, uint8_t data )
94{
95 uint8_t buffer[ 2 ];
96
97 buffer[ 0 ] = reg_adr;
98 buffer[ 1 ] = data;
99
100 return tx( buffer, sizeof( buffer ) );
101}
102
103uint16_t I2C_device::reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size )
104{
105 tx( &reg_adr, 1, rs_dis );
106 return rx( data, size );
107}
108
109uint8_t I2C_device::reg_r( uint8_t reg_adr )
110{
111 uint8_t buffer;
112
113 tx( &reg_adr, 1, rs_dis );
114 rx( &buffer, 1 );
115 return buffer;
116}
117
118void I2C_device::write_r8( uint8_t reg, uint8_t val )
119{
120 reg_w( reg, val );
121}
122
123void I2C_device::write_r16( uint8_t reg, uint16_t val )
124{
125 uint8_t buff[ 2 ];
126
127 buff[ 0 ] = val >> 8;
128 buff[ 1 ] = val & 0xFF;
129
130 reg_w( reg, buff, sizeof( buff ) );
131}
132
133uint8_t I2C_device::read_r8( uint8_t reg )
134{
135 return reg_r( reg );
136}
137
138uint16_t I2C_device::read_r16( uint8_t reg )
139{
140 uint8_t buff[ 2 ];
141
142 reg_r( reg, buff, sizeof( buff ) );
143
144 return (buff[ 0 ] << 8) | buff[ 1 ];
145}
146
147void I2C_device::bit_op8( uint8_t reg, uint8_t mask, uint8_t value )
148{
149 uint8_t v = read_r8( reg );
150
151 v &= mask;
152 v |= value;
153
154 write_r8( reg, v );
155}
156
157void I2C_device::bit_op16( uint8_t reg, uint16_t mask, uint16_t value )
158{
159 uint16_t v = read_r16( reg );
160
161 v &= mask;
162 v |= value;
163
164 write_r16( reg, v );
165}
166
uint16_t tx(uint8_t *data, uint16_t size, bool stop=true)
Definition: I2C_device.cpp:55
uint8_t read_r8(uint8_t reg)
Definition: I2C_device.cpp:133
bool rs_dis
Definition: I2C_device.h:147
void write_r8(uint8_t reg, uint8_t val)
Definition: I2C_device.cpp:118
static bool ping(uint8_t addr)
Definition: I2C_device.cpp:18
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
Definition: I2C_device.cpp:147
static void scan(void)
Definition: I2C_device.cpp:24
uint16_t rx(uint8_t *data, uint16_t size)
Definition: I2C_device.cpp:67
uint16_t read_r16(uint8_t reg)
Definition: I2C_device.cpp:138
void write_r16(uint8_t reg, uint16_t val)
Definition: I2C_device.cpp:123
void repeated_start_enable(bool en=true)
Definition: I2C_device.cpp:13
void bit_op16(uint8_t reg, uint16_t mask, uint16_t value)
Definition: I2C_device.cpp:157
uint8_t i2c_addr
Definition: I2C_device.h:146
I2C_device(uint8_t i2c_address, bool repeated_start_enable=true)
Definition: I2C_device.cpp:3
uint16_t reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
Definition: I2C_device.cpp:103
uint16_t reg_w(uint8_t reg_adr, uint8_t *data, uint16_t size)
Definition: I2C_device.cpp:82