I2C_device_Arduino 0.4.0
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( Wire ), i2c_addr( i2c_address ), rs_dis( !repeated_start_enable )
4{
5}
6
7I2C_device::I2C_device( TwoWire& wire, uint8_t i2c_address, bool repeated_start_enable ) : i2c( wire ), i2c_addr( i2c_address ), rs_dis( !repeated_start_enable )
8{
9}
10
12{
13}
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, 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( uint8_t *data, uint16_t size, bool stop )
64{
65 i2c.beginTransmission( i2c_addr );
66 size = i2c.write( data, size );
67 uint8_t rtn = i2c.endTransmission( stop );
68
69 if (rtn)
70 return -rtn;
71
72 return size;
73}
74
75int I2C_device::rx( uint8_t *data, uint16_t size )
76{
77 uint16_t r_size = i2c.requestFrom( i2c_addr, size );
78
79 if ( size && !r_size )
80 return -1;
81
82 for ( uint16_t i = 0; i < size; i++ ) {
83 while ( !i2c.available() )
84 ;
85 data[ i ] = i2c.read();
86 }
87 return r_size;
88}
89
90int I2C_device::reg_w( uint8_t reg_adr, uint8_t *data, uint16_t size )
91{
92 uint8_t buffer[ size + 1 ];
93
94 buffer[ 0 ] = reg_adr;
95 for ( uint16_t i = 0; i < size; i++)
96 buffer[ i + 1 ] = data[ i ];
97
98 return tx( buffer, sizeof( buffer ) );
99}
100
101int I2C_device::reg_w( uint8_t reg_adr, uint8_t data )
102{
103 uint8_t buffer[ 2 ];
104
105 buffer[ 0 ] = reg_adr;
106 buffer[ 1 ] = data;
107
108 return tx( buffer, sizeof( buffer ) );
109}
110
111int I2C_device::reg_r( uint8_t reg_adr, uint8_t *data, uint16_t size )
112{
113 tx( &reg_adr, 1, rs_dis );
114 return rx( data, size );
115}
116
117uint8_t I2C_device::reg_r( uint8_t reg_adr )
118{
119 uint8_t buffer;
120
121 tx( &reg_adr, 1, rs_dis );
122 rx( &buffer, 1 );
123 return buffer;
124}
125
126void I2C_device::write_r8( uint8_t reg, uint8_t val )
127{
128 reg_w( reg, val );
129}
130
131void I2C_device::write_r16( uint8_t reg, uint16_t val )
132{
133 uint8_t buff[ 2 ];
134
135 buff[ 0 ] = val >> 8;
136 buff[ 1 ] = val & 0xFF;
137
138 reg_w( reg, buff, sizeof( buff ) );
139}
140
141uint8_t I2C_device::read_r8( uint8_t reg )
142{
143 return reg_r( reg );
144}
145
146uint16_t I2C_device::read_r16( uint8_t reg )
147{
148 uint8_t buff[ 2 ];
149
150 reg_r( reg, buff, sizeof( buff ) );
151
152 return (buff[ 0 ] << 8) | buff[ 1 ];
153}
154
155void I2C_device::bit_op8( uint8_t reg, uint8_t mask, uint8_t value )
156{
157 uint8_t v = read_r8( reg );
158
159 v &= mask;
160 v |= value;
161
162 write_r8( reg, v );
163}
164
165void I2C_device::bit_op16( uint8_t reg, uint16_t mask, uint16_t value )
166{
167 uint16_t v = read_r16( reg );
168
169 v &= mask;
170 v |= value;
171
172 write_r16( reg, v );
173}
174
bool ping(void)
Definition: I2C_device.cpp:20
int rx(uint8_t *data, uint16_t size)
Definition: I2C_device.cpp:75
uint8_t read_r8(uint8_t reg)
Definition: I2C_device.cpp:141
bool rs_dis
Definition: I2C_device.h:160
void write_r8(uint8_t reg, uint8_t val)
Definition: I2C_device.cpp:126
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
Definition: I2C_device.cpp:155
int tx(uint8_t *data, uint16_t size, bool stop=true)
Definition: I2C_device.cpp:63
int reg_w(uint8_t reg_adr, uint8_t *data, uint16_t size)
Definition: I2C_device.cpp:90
static void scan(TwoWire &target_i2c=Wire, uint8_t stop=128)
Definition: I2C_device.cpp:26
TwoWire & i2c
Definition: I2C_device.h:158
uint16_t read_r16(uint8_t reg)
Definition: I2C_device.cpp:146
void write_r16(uint8_t reg, uint16_t val)
Definition: I2C_device.cpp:131
void repeated_start_enable(bool en=true)
Definition: I2C_device.cpp:15
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
Definition: I2C_device.cpp:111
void bit_op16(uint8_t reg, uint16_t mask, uint16_t value)
Definition: I2C_device.cpp:165
uint8_t i2c_addr
Definition: I2C_device.h:159
I2C_device(uint8_t i2c_address, bool repeated_start_enable=true)
Definition: I2C_device.cpp:3