I2C_device_Arduino
1.2.0
An I²C utility class for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
I2C_device.cpp
Go to the documentation of this file.
1
#include "
I2C_device.h
"
2
3
I2C_device::I2C_device
( uint8_t i2c_address,
bool
repeated_start_enable
) :
i2c_addr
( i2c_address ),
i2c
( Wire ),
rs_dis
( !
repeated_start_enable
)
4
{
5
}
6
7
I2C_device::I2C_device
( TwoWire& wire, uint8_t i2c_address,
bool
repeated_start_enable
) :
i2c_addr
( i2c_address ),
i2c
( wire ),
rs_dis
( !
repeated_start_enable
)
8
{
9
}
10
11
I2C_device::~I2C_device
()
12
{
13
}
14
15
void
I2C_device::repeated_start_enable
(
bool
en )
16
{
17
rs_dis
= !en;
18
}
19
20
bool
I2C_device::ping
(
void
)
21
{
22
i2c
.beginTransmission(
i2c_addr
);
23
return
!
i2c
.endTransmission();
24
}
25
26
void
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
63
int
I2C_device::tx
(
const
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 ||
rs_dis
);
68
69
if
(rtn)
70
return
-rtn;
71
72
return
size;
73
}
74
75
int
I2C_device::rx
( uint8_t *data, uint16_t size,
bool
stop )
76
{
77
uint16_t r_size =
i2c
.requestFrom(
static_cast<
int
>
(
i2c_addr
),
static_cast<
int
>
( size ),
static_cast<
int
>
( stop ||
rs_dis
) );
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
90
int
I2C_device::reg_w
( uint8_t reg_adr,
const
uint8_t *data, uint16_t size,
bool
stop )
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 ), stop );
99
}
100
101
int
I2C_device::reg_w
( uint8_t reg_adr, uint8_t data,
bool
stop )
102
{
103
uint8_t buffer[ 2 ];
104
105
buffer[ 0 ] = reg_adr;
106
buffer[ 1 ] = data;
107
108
return
tx
( buffer,
sizeof
( buffer ), stop );
109
}
110
111
int
I2C_device::reg_r
( uint8_t reg_adr, uint8_t *data, uint16_t size,
bool
stop )
112
{
113
tx
( ®_adr, 1,
false
);
114
return
rx
( data, size, stop );
115
}
116
117
uint8_t
I2C_device::reg_r
( uint8_t reg_adr,
bool
stop )
118
{
119
uint8_t buffer = 0;
// assigning zero to suppress warning "-Wmaybe-uninitialized"
120
121
tx
( ®_adr, 1,
false
);
122
rx
( &buffer, 1, stop );
123
return
buffer;
124
}
125
126
void
I2C_device::write_r8
( uint8_t reg, uint8_t val,
bool
stop )
127
{
128
reg_w
( reg, val, stop );
129
}
130
131
void
I2C_device::write_r16
( uint8_t reg, uint16_t val,
bool
stop )
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 ), stop );
139
}
140
141
uint8_t
I2C_device::read_r8
( uint8_t reg,
bool
stop )
142
{
143
return
reg_r
( reg, stop );
144
}
145
146
uint16_t
I2C_device::read_r16
( uint8_t reg,
bool
stop )
147
{
148
uint8_t buff[ 2 ];
149
150
reg_r
( reg, buff,
sizeof
( buff ), stop );
151
152
return
(buff[ 0 ] << 8) | buff[ 1 ];
153
}
154
155
void
I2C_device::bit_op8
( uint8_t reg, uint8_t mask, uint8_t value )
156
{
157
uint8_t v =
read_r8
( reg,
false
);
158
159
v &= mask;
160
v |= value;
161
162
write_r8
( reg, v );
163
}
164
165
void
I2C_device::bit_op16
( uint8_t reg, uint16_t mask, uint16_t value )
166
{
167
uint16_t v =
read_r16
( reg,
false
);
168
169
v &= mask;
170
v |= value;
171
172
write_r16
( reg, v );
173
}
174
175
void
I2C_device::txrx
(
const
uint8_t *w_data, uint8_t *r_data, uint16_t size )
176
{
177
memcpy( r_data, w_data, size );
178
179
SPI.beginTransaction(
spi_setting
);
180
181
digitalWrite( SS, LOW );
182
SPI.transfer( r_data, size );
183
digitalWrite( SS, HIGH );
184
185
SPI.endTransaction();
186
}
187
I2C_device.h
I2C_device::rx
int rx(uint8_t *data, uint16_t size, bool stop=true)
Definition
I2C_device.cpp:75
I2C_device::ping
bool ping(void)
Definition
I2C_device.cpp:20
I2C_device::~I2C_device
~I2C_device()
Definition
I2C_device.cpp:11
I2C_device::spi_setting
SPISettings spi_setting
Definition
I2C_device.h:181
I2C_device::read_r8
uint8_t read_r8(uint8_t reg, bool stop=true)
Definition
I2C_device.cpp:141
I2C_device::rs_dis
bool rs_dis
Definition
I2C_device.h:185
I2C_device::tx
int tx(const uint8_t *data, uint16_t size, bool stop=true)
Definition
I2C_device.cpp:63
I2C_device::write_r8
void write_r8(uint8_t reg, uint8_t val, bool stop=true)
Definition
I2C_device.cpp:126
I2C_device::bit_op8
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
Definition
I2C_device.cpp:155
I2C_device::scan
static void scan(TwoWire &target_i2c=Wire, uint8_t stop=128)
Definition
I2C_device.cpp:26
I2C_device::i2c
TwoWire & i2c
Definition
I2C_device.h:184
I2C_device::write_r16
void write_r16(uint8_t reg, uint16_t val, bool stop=true)
Definition
I2C_device.cpp:131
I2C_device::reg_r
virtual int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size, bool stop=true)
Definition
I2C_device.cpp:111
I2C_device::reg_w
virtual int reg_w(uint8_t reg_adr, const uint8_t *data, uint16_t size, bool stop=true)
Definition
I2C_device.cpp:90
I2C_device::txrx
void txrx(const uint8_t *w_data, uint8_t *r_data, uint16_t size)
Definition
I2C_device.cpp:175
I2C_device::repeated_start_enable
void repeated_start_enable(bool en=true)
Definition
I2C_device.cpp:15
I2C_device::bit_op16
void bit_op16(uint8_t reg, uint16_t mask, uint16_t value)
Definition
I2C_device.cpp:165
I2C_device::i2c_addr
uint8_t i2c_addr
Definition
I2C_device.h:180
I2C_device::I2C_device
I2C_device(uint8_t i2c_address, bool repeated_start_enable=true)
Definition
I2C_device.cpp:3
I2C_device::read_r16
uint16_t read_r16(uint8_t reg, bool stop=true)
Definition
I2C_device.cpp:146
Generated by
1.17.0