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 )
10LEDDriver::~LEDDriver()
19 bp[ ch ] = (uint8_t)(value * 255.0);
22 reg_access( reg_PWM + ch, (uint8_t)(value * 255.0) );
29 for (
int i = 0; i < n_channel; i++ )
30 bp[ i ] = (uint8_t)(values[ i ] * 255.0);
33 uint8_t v[ n_channel ];
34 for (
int i = 0; i < n_channel; i++ )
35 v[ i ] = (uint8_t)(values[ i ] * 255.0);
37 reg_access( 0x80 | reg_PWM, v, n_channel );
44 reg_access( 0x80 | reg_PWM, bp, n_channel );
55 bp =
new uint8_t[ n_channel ];
56 for (
int i = 0; i < n_channel; i++ )
65PCA995x::PCA995x( uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r,
const uint8_t* ar, uint8_t oe ) :
66 LEDDriver( n_ch, PWM_r, oe ), reg_IREF( IREF_r ), reg_IREFALL( IREFALL_r ), arp( ar )
76void PCA995x::begin(
float current, board env,
bool bflag )
81 pinMode( oe_pin, OUTPUT );
82 digitalWrite( oe_pin , 0 );
90 reg_access( reg_IREFALL, iref );
97PCA995x_I2C::PCA995x_I2C( uint8_t i2c_address, uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r,
const uint8_t* ar, uint8_t oe ) :
98 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, ar, oe ),
99 I2C_device( i2c_address )
103PCA995x_I2C::PCA995x_I2C( TwoWire& wire, uint8_t i2c_address, uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r,
const uint8_t* ar, uint8_t oe ) :
104 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, ar, oe ),
105 I2C_device( wire, i2c_address )
109PCA995x_I2C::~PCA995x_I2C()
113void PCA995x_I2C::reg_access( uint8_t reg, uint8_t val )
115 write_r8( reg, val );
118void PCA995x_I2C::reg_access( uint8_t reg, uint8_t *vp,
int len )
120 reg_w( 0x80 | reg, vp, len );
123uint8_t PCA995x_I2C::reg_access( uint8_t reg )
125 return read_r8( reg );
128void PCA995x_I2C::reg_access_r( uint8_t reg, uint8_t *vp,
int len )
130 reg_r( 0x80 | reg, vp, len );
137PCA995x_SPI::PCA995x_SPI( uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r,
const uint8_t* ar, uint8_t oe ) :
138 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, ar, oe )
140 SPISettings spi_settings( 4000 * 1000, MSBFIRST, SPI_MODE0 );
143PCA995x_SPI::~PCA995x_SPI()
147void PCA995x_SPI::txrx( uint8_t *data,
int size )
149 SPI.beginTransaction( spi_setting );
151 digitalWrite( SS, LOW );
152 SPI.transfer( data, size );
153 digitalWrite( SS, HIGH );
155 SPI.endTransaction();
158void PCA995x_SPI::reg_access( uint8_t reg, uint8_t val )
160 uint8_t data[] = { (uint8_t)(reg << 1), val };
162 txrx( data,
sizeof( data ) );
165void PCA995x_SPI::reg_access( uint8_t reg, uint8_t *vp,
int len )
167 uint8_t data[ len * 2 ];
169 for (
int i = 0; i < len; i++ ) {
170 data[ i * 2 + 0 ] = (reg << 1) + (i * 2);
171 data[ i * 2 + 1 ] = vp[ i ];
174 for (
int i = 0; i < len * 2; i += 2 )
178uint8_t PCA995x_SPI::reg_access( uint8_t reg )
180 uint8_t data0[ 2 ] = { (uint8_t)((reg << 1) | 0x01), 0xFF };
181 uint8_t data1[ 2 ] = { 0xFF, 0xFF };
183 txrx( data0,
sizeof( data0 ) );
184 txrx( data1,
sizeof( data1 ) );
189void PCA995x_SPI::reg_access_r( uint8_t reg, uint8_t *vp,
int len )
191 for (
int i = 0; i < len; i++ ) {
192 *vp++ = reg_access( reg + i );
196void PCA995x_SPI::reg_w( uint8_t reg, uint8_t val )
198 reg_access( reg, val );
201void PCA995x_SPI::reg_w( uint8_t reg, uint8_t *vp,
int len )
203 reg_access( reg, vp, len );
206uint8_t PCA995x_SPI::reg_r( uint8_t reg )
208 return reg_access( reg );
211void PCA995x_SPI::reg_r( uint8_t reg, uint8_t *vp,
int len )
213 reg_access_r( reg, vp, len );
216void PCA995x_SPI::write_r8( uint8_t reg, uint8_t val )
221uint8_t PCA995x_SPI::read_r8( uint8_t reg )
228 write_r8( reg_IREFALL, iref );
231void PCA995x_SPI::pwm( uint8_t ch,
float value )
233 write_r8( reg_PWM + ch, (uint8_t)(value * 255.0) );
236void PCA995x_SPI::pwm(
float* values )
238 uint8_t v[ n_channel ];
239 for (
int i = 0; i < n_channel; i++ )
240 v[ i ] = (uint8_t)(values[ i ] * 255.0);
242 reg_w( reg_PWM, v, n_channel );
void pwm(uint8_t ch, float value)
void buffer_enable(bool flag)
void irefall(uint8_t iref)
void irefall(uint8_t iref)