LEDDriver_NXP_Arduino 0.1.2
LED driver device operation sample code for Arduino
Loading...
Searching...
No Matches
LEDDriver.cpp
Go to the documentation of this file.
1#include "LEDDriver.h"
2
3/* LEDDriver class ******************************************/
4
5LEDDriver::LEDDriver( uint8_t n_ch, uint8_t PWM_r, uint8_t oe ) :
6 n_channel( n_ch ), reg_PWM( PWM_r ), oe_pin( oe )
7{
8 // do nothing.
9 // leave it in default state.
10}
11
13{
14}
15
16void LEDDriver::pwm( uint8_t ch, float value )
17{
18 reg_access( reg_PWM + ch, (uint8_t)(value * 255.0) );
19}
20
21void LEDDriver::pwm( float* values )
22{
23 uint8_t v[ n_channel ];
24 for ( int i = 0; i < n_channel; i++ )
25 v[ i ] = (uint8_t)(values[ i ] * 255.0);
26
27 reg_access( 0x80 | reg_PWM, v, n_channel );
28}
29
30
31
32/* PCA995x class ******************************************/
33
34PCA995x::PCA995x( uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, uint8_t oe ) :
35 LEDDriver( n_ch, PWM_r, oe ), reg_IREF( IREF_r ), reg_IREFALL( IREFALL_r )
36{
37 // do nothing.
38 // leave it in default state.
39}
40
42{
43}
44
45void PCA995x::begin( float current, board env )
46{
47 init( current );
48
49 if ( env ) {
50 pinMode( oe_pin, OUTPUT );
51 digitalWrite( oe_pin , 0 );
52 }
53}
54
55void PCA995x::irefall( uint8_t iref )
56{
57 reg_access( reg_IREFALL, iref );
58}
59
60
61
62/* PCA995x_I2C class ******************************************/
63
64PCA995x_I2C::PCA995x_I2C( uint8_t i2c_address, uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, uint8_t oe ) :
65 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, oe ),
66 I2C_device( i2c_address )
67{
68 // do nothing.
69 // leave it in default state.
70}
71
73{
74}
75
76void PCA995x_I2C::reg_access( uint8_t reg, uint8_t val )
77{
78 write_r8( reg, val );
79}
80
81void PCA995x_I2C::reg_access( uint8_t reg, uint8_t *vp, int len )
82{
83 reg_w( 0x80 | reg, vp, len );
84}
85
86
87
88/* PCA995x_SPI class ******************************************/
89
90PCA995x_SPI::PCA995x_SPI( uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, uint8_t oe ) :
91 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, oe )
92{
93 // do nothing.
94 // leave it in default state.
95}
96
98{
99}
100
101void PCA995x_SPI::txrx( uint8_t *data, int size )
102{
103 digitalWrite( SS, LOW );
104 SPI.transfer( data, size );
105 digitalWrite( SS, HIGH );
106}
107
108void PCA995x_SPI::reg_access( uint8_t reg, uint8_t val )
109{
110 uint8_t data[] = { reg, val };
111
112 txrx( data, sizeof( data ) );
113}
114
115void PCA995x_SPI::reg_access( uint8_t reg, uint8_t *vp, int len )
116{
117 uint8_t data[ len * 2 ];
118
119 for ( int i = 0; i < len; i++ ) {
120 data[ i * 2 + 0 ] = reg + (i * 2);
121 data[ i * 2 + 1 ] = vp[ i ];
122 }
123
124 for ( int i = 0; i < len * 2; i += 2 )
125 txrx( data + i, 2 );
126}
127
128void PCA995x_SPI::reg_w( uint8_t reg, uint8_t val )
129{
130 reg_access( reg << 1, val );
131}
132
133void PCA995x_SPI::reg_w( uint8_t reg, uint8_t *vp, int len )
134{
135 reg_access( reg << 1, vp, len );
136}
137
138uint8_t PCA995x_SPI::reg_r( uint8_t reg )
139{
140 uint8_t data[ 2 ] = { 0xFF, 0xFF };
141
142 reg_access( (reg << 1) | 0x01, 0xFF );
143 txrx( data, sizeof( data ) );
144
145 return data[ 1 ];
146}
147
148void PCA995x_SPI::reg_r( uint8_t reg, uint8_t *vp, int len )
149{
150 for ( int i = 0; i < len; i++ ) {
151 *vp++ = reg_r( ((reg + i) << 1) | 0x01 );
152 }
153}
154
155void PCA995x_SPI::write_r8( uint8_t reg, uint8_t val )
156{
157 reg_w( reg, val );
158}
159
160uint8_t PCA995x_SPI::read_r8( uint8_t reg )
161{
162 return reg_r( reg );
163}
164
165void PCA995x_SPI::irefall( uint8_t iref )
166{
167 write_r8( reg_IREFALL, iref );
168}
169
170void PCA995x_SPI::pwm( uint8_t ch, float value )
171{
172 write_r8( reg_PWM + ch, (uint8_t)(value * 255.0) );
173}
174
175void PCA995x_SPI::pwm( float* values )
176{
177 uint8_t v[ n_channel ];
178 for ( int i = 0; i < n_channel; i++ )
179 v[ i ] = (uint8_t)(values[ i ] * 255.0);
180
181 reg_w( reg_PWM, v, n_channel );
182}
183
184
185
186
187
188
189
190
191/* PCA9955B class ******************************************/
192PCA9955B::PCA9955B( uint8_t i2c_address ) :
193 PCA995x_I2C( i2c_address, 16, PCA9955B::PWM0, PCA9955B::IREF0, PCA9955B::IREFALL )
194{
195}
196
198{
199}
200
201void PCA9955B::init( float current )
202{
203 uint8_t init[] = { 0xAA, 0xAA, 0xAA, 0xAA };
204 reg_w( 0x80 | LEDOUT0, init, sizeof( init ) );
205 write_r8( PWMALL, 0x00 );
206
207 irefall( (uint8_t)(current * 255.0) );
208}
209
210
211
212/* PCA9956B class ******************************************/
213PCA9956B::PCA9956B( uint8_t i2c_address ) :
214 PCA995x_I2C( i2c_address, 24, PCA9956B::PWM0, PCA9956B::IREF0, PCA9956B::IREFALL )
215{
216}
217
219{
220}
221
222void PCA9956B::init( float current )
223{
224 uint8_t init[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
225 reg_w( 0x80 | LEDOUT0, init, sizeof( init ) );
226 write_r8( PWMALL, 0x00 );
227
228 irefall( (uint8_t)(current * 255.0) );
229}
230
231
232
233/* PCA9957 class ******************************************/
235 PCA995x_SPI( 24, PCA9957::PWM0, PCA9957::IREF0, PCA9957::IREFALL )
236{
237}
238
240{
241}
242
243void PCA9957::init( float current )
244{
245 uint8_t init[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
246
247 digitalWrite( SS, HIGH );
248
249 write_r8( MODE2, 0x18 );
250 write_r8( PWMALL, 0x00 );
251 reg_w( LEDOUT0, init, sizeof( init ) );
252
253 irefall( (uint8_t)(current * 255.0) );
254
255}
256
257
258
void pwm(uint8_t ch, float value)
Definition: LEDDriver.cpp:16
LEDDriver(uint8_t n_ch, uint8_t PWM_r, uint8_t oe)
Definition: LEDDriver.cpp:5
const uint8_t n_channel
Definition: LEDDriver.h:54
virtual ~LEDDriver()
Definition: LEDDriver.cpp:12
const uint8_t oe_pin
Definition: LEDDriver.h:56
const uint8_t reg_PWM
Definition: LEDDriver.h:55
virtual void reg_access(uint8_t reg, uint8_t val)=0
virtual ~PCA9955B()
Definition: LEDDriver.cpp:197
PCA9955B(uint8_t i2c_address=(0xBC > > 1))
Definition: LEDDriver.cpp:192
void init(float current)
Definition: LEDDriver.cpp:201
virtual ~PCA9956B()
Definition: LEDDriver.cpp:218
void init(float current)
Definition: LEDDriver.cpp:222
PCA9956B(uint8_t i2c_address=(0x02 > > 1))
Definition: LEDDriver.cpp:213
virtual ~PCA9957()
Definition: LEDDriver.cpp:239
void init(float current)
Definition: LEDDriver.cpp:243
@ PWMALL
Definition: LEDDriver.h:252
@ LEDOUT0
Definition: LEDDriver.h:229
PCA995x_I2C(uint8_t i2c_address, uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, uint8_t oe=8)
Definition: LEDDriver.cpp:64
virtual ~PCA995x_I2C()
Definition: LEDDriver.cpp:72
void reg_access(uint8_t reg, uint8_t val)
Definition: LEDDriver.cpp:76
PCA995x_SPI(uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, uint8_t oe=9)
Definition: LEDDriver.cpp:90
uint8_t reg_r(uint8_t reg)
Definition: LEDDriver.cpp:138
void irefall(uint8_t iref)
Definition: LEDDriver.cpp:165
uint8_t read_r8(uint8_t reg)
Definition: LEDDriver.cpp:160
void reg_access(uint8_t reg, uint8_t val)
Definition: LEDDriver.cpp:108
void write_r8(uint8_t reg, uint8_t val)
Definition: LEDDriver.cpp:155
void reg_w(uint8_t reg, uint8_t val)
Definition: LEDDriver.cpp:128
void pwm(uint8_t ch, float value)
Definition: LEDDriver.cpp:170
virtual ~PCA995x_SPI()
Definition: LEDDriver.cpp:97
void txrx(uint8_t *data, int size)
Definition: LEDDriver.cpp:101
void irefall(uint8_t iref)
Definition: LEDDriver.cpp:55
virtual void init(float current)=0
virtual ~PCA995x()
Definition: LEDDriver.cpp:41
const uint8_t reg_IREFALL
Definition: LEDDriver.h:85
virtual void begin(float current=0.1, board env=NONE)
Definition: LEDDriver.cpp:45
PCA995x(uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, uint8_t oe=8)
Definition: LEDDriver.cpp:34