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