I2C_device_Arduino 1.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( const uint8_t i2c_address, const bool repeated_start_enable ) : i2c( Wire ), i2c_addr( i2c_address ), rs_dis( !repeated_start_enable )
4{
5}
6
7I2C_device::I2C_device( TwoWire& wire, const uint8_t i2c_address, const bool repeated_start_enable ) : i2c( wire ), i2c_addr( i2c_address ), rs_dis( !repeated_start_enable )
8{
9}
10
14
16{
17 rs_dis = !en;
18}
19
20bool I2C_device::ping( void )
21{
22 i2c.beginTransmission( i2c_addr );
23 return !i2c.endTransmission();
24}
25
26void I2C_device::scan( TwoWire& target_i2c, const uint8_t stop )
27{
28 bool result[ 128 ];
29
30 for ( uint8_t i = 0; i < stop; i++ ) {
31 target_i2c.beginTransmission( i );
32 result[i] = !target_i2c.endTransmission();
33 }
34
35 for ( uint8_t i = stop; i < 128; i++ ) {
36 result[i] = false;
37 }
38
39 Serial.print( "\nI2C scan result\n " );
40 for ( uint8_t x = 0; x < 16; x++ ) {
41 Serial.print( " x" );
42 Serial.print( x, HEX );
43 }
44
45 for ( uint8_t i = 0; i < 128; i++ ) {
46 if ( !( i % 16) ) {
47 Serial.print( "\n" );
48 Serial.print( i / 16, HEX );
49 Serial.print( "x:" );
50 }
51
52 if ( result[ i ] ) {
53 Serial.print( " " );
54 Serial.print( i, HEX );
55 }
56 else {
57 Serial.print( " --" );
58 }
59 }
60 Serial.print( "\n" );
61}
62
63int I2C_device::tx( const uint8_t *data, const uint16_t size, const bool stop )
64{
65 uint16_t r_size;
66
67 i2c.beginTransmission( i2c_addr );
68 r_size = i2c.write( data, size );
69 uint8_t rtn = i2c.endTransmission( stop );
70
71 if (rtn)
72 return -rtn;
73
74 return r_size;
75}
76
77int I2C_device::rx( uint8_t *data, const uint16_t size )
78{
79 uint16_t r_size = i2c.requestFrom( i2c_addr, size );
80
81 if ( size && !r_size )
82 return -1;
83
84 for ( uint16_t i = 0; i < size; i++ ) {
85 while ( !i2c.available() )
86 ;
87 data[ i ] = i2c.read();
88 }
89 return r_size;
90}
91
92int I2C_device::reg_w( const uint8_t reg_adr, const uint8_t *data, const uint16_t size )
93{
94 uint8_t buffer[ size + 1 ];
95
96 buffer[ 0 ] = reg_adr;
97 for ( uint16_t i = 0; i < size; i++)
98 buffer[ i + 1 ] = data[ i ];
99
100 return tx( buffer, sizeof( buffer ) );
101}
102
103int I2C_device::reg_w( const uint8_t reg_adr, const uint8_t data )
104{
105 uint8_t buffer[ 2 ];
106
107 buffer[ 0 ] = reg_adr;
108 buffer[ 1 ] = data;
109
110 return tx( buffer, sizeof( buffer ) );
111}
112
113int I2C_device::reg_r( const uint8_t reg_adr, uint8_t *data, const uint16_t size )
114{
115 tx( &reg_adr, 1, rs_dis );
116 return rx( data, size );
117}
118
119uint8_t I2C_device::reg_r( const uint8_t reg_adr )
120{
121 uint8_t buffer;
122
123 tx( &reg_adr, 1, rs_dis );
124 rx( &buffer, 1 );
125 return buffer;
126}
127
128void I2C_device::write_r8( const uint8_t reg, const uint8_t val )
129{
130 reg_w( reg, val );
131}
132
133void I2C_device::write_r16( const uint8_t reg, const uint16_t val )
134{
135 uint8_t buff[ 2 ];
136
137 buff[ 0 ] = val >> 8;
138 buff[ 1 ] = val & 0xFF;
139
140 reg_w( reg, buff, sizeof( buff ) );
141}
142
143uint8_t I2C_device::read_r8( const uint8_t reg )
144{
145 return reg_r( reg );
146}
147
148uint16_t I2C_device::read_r16( const uint8_t reg )
149{
150 uint8_t buff[ 2 ];
151
152 reg_r( reg, buff, sizeof( buff ) );
153
154 return (buff[ 0 ] << 8) | buff[ 1 ];
155}
156
157void I2C_device::bit_op8( const uint8_t reg, const uint8_t mask, const uint8_t value )
158{
159 uint8_t v = read_r8( reg );
160
161 v &= mask;
162 v |= value;
163
164 write_r8( reg, v );
165}
166
167void I2C_device::bit_op16( const uint8_t reg, const uint16_t mask, const uint16_t value )
168{
169 uint16_t v = read_r16( reg );
170
171 v &= mask;
172 v |= value;
173
174 write_r16( reg, v );
175}
176
void write_r16(const uint8_t reg, const uint16_t val)
uint8_t read_r8(const uint8_t reg)
bool ping(void)
uint16_t read_r16(const uint8_t reg)
int reg_w(const uint8_t reg_adr, const uint8_t *data, const uint16_t size)
I2C_device(const uint8_t i2c_address, const bool repeated_start_enable=true)
Definition I2C_device.cpp:3
int rx(uint8_t *data, const uint16_t size)
void write_r8(const uint8_t reg, const uint8_t val)
int tx(const uint8_t *data, const uint16_t size, const bool stop=true)
TwoWire & i2c
Definition I2C_device.h:160
void bit_op16(const uint8_t reg, const uint16_t mask, const uint16_t value)
uint8_t i2c_addr
Definition I2C_device.h:161
static void scan(TwoWire &target_i2c=Wire, const uint8_t stop=128)
void bit_op8(const uint8_t reg, const uint8_t mask, const uint8_t value)
void repeated_start_enable(const bool en=true)
int reg_r(const uint8_t reg_adr, uint8_t *data, const uint16_t size)