PCA9955A and PCA9956A class library. The PCA9955A is a 16-channel and the PCA9956A is a 24-channel Fm+ I2C-bus 57mA/20V constant current LED driver. The PCA9955A has a extended feature which called "Gradation control".

Dependencies:   CompLedDvrCC

Dependents:   PCA9956A_Hello pca9956b_two_demoboards PCA9955A_Gradation_control PCA9955A_Gradation_control ... more

What is this?

Code for PCA9956A and PCA9955A.
24-channel and 16-channel constant current type LED driver component class.

Please refer to the component page for details

PCA9955B and PCA9956B are I²C-bus controlled 16-channel constant current LED driver optimized for dimming and blinking.

High-level API is available

A high-level API that can be used as the "PwmOut" of bed-SDK is available.
This API enables to make instances of each LED output pins and control PWM duty cycle by assignment.
Output current also controllable by API function.
For detail information, refer API document of LedPwmOutCC Class class which is included in PCA995xA class library.

#include "mbed.h"
#include "PCA9956A.h"

PCA9956A    led_cntlr( p28, p27, 0xC4 );  //  SDA, SCL, Slave_address(option)
LedPwmOutCC led( led_cntlr, L0 );

int main()
{
    while( 1 ) {
        for( float p = 0.0f; p < 1.0f; p += 0.1f ) {
            led     = p;
            wait( 0.1 );
        }
    }
}

About the chips

PCA9956A

The PCA9956A is an I2C-bus controlled 24-channel constant current LED driver optimized for dimming and blinking 57 mA LEDs. Each LED output has its own 8-bit resolution (256 steps) fixed frequency individual PWM controller that operates at 31.25 kHz with a duty cycle that is adjustable from 0 % to 99.6 % to allow the LED to be set to a specific brightness value.

Datasheet: http://www.nxp.com/documents/data_sheet/PCA9956A.pdf

PCA9955A

The PCA9955A is an I2C-bus controlled 16-channel constant current LED driver optimized for dimming and blinking 57 mA Red/Green/Blue/Amber (RGBA) LEDs in amusement products. Each LED output has its own 8-bit resolution (256 steps) fixed frequency individual PWM controller that operates at 31.25 kHz with a duty cycle that is adjustable from 0 % to 100 % to allow the LED to be set to a specific brightness value.

On addition to this, the PCA9955A has "Gradation control".
The gradation control is a new feature of PCA995xA series. After the register setting and start the control, the PCA9955A performs dimming cycles automatically without MCU intervention.

Datasheet: http://www.nxp.com/documents/data_sheet/PCA9955A.pdf

PCA9952 and PCA9955 (non-A version)

The PCA9955 and PCA9955 (no-A at end of the type number) is not supported by this component class.

PCA9955(non-A)

PCA9955A != PCA9955

PCA9955A is not software compatible to PCA9955(non-A version).
There are several differences between A and non-A versions.
Register mapping is one of the difference. Please make sure you are using PCA9955A.

How the API works?

When the instance is made, all set up for PWM operation are done automatically.
For the operation, user can control the LED brightness in two ways.

  • PWM
  • Current

PCA9955A and PCA9956A have internal 31.25kHz oscillator to generate internal PWM waveform. This signal switchs the output current ON and OFF. The class' function pwm() controls duty-cycle of this output.

Another control is current. Since the PCA9955A and PCA9956A are constant current type LED driver, those have internal current sources. The current source on each channels has independent control of output current. The class' function current() provides interface to current change.

API_and_output

Tips for the chips

PCA995xA family

This PCA995xA components library can be used for both PCA9955A(16-channel) and PCA9956A(24-channel).
If you are using both chips on the I2C bus, those can be operated like..

#include "mbed.h"
 
#include "PCA9955A.h"
#include "PCA9956A.h"

PCA9955A    led0( p28, p27, 0xC0 );    //  SDA, SCL, Slave_address=0xC0 (16-channel chip)
PCA9956A    led1( p28, p27, 0xC2 );    //  SDA, SCL, Slave_address=0xC2 (24-channel chip)
 
int main()
{
    led0.current( ALLPORTS, 1.0 ); //  Set all ports output current 100%
    led1.current( ALLPORTS, 1.0 ); //  Set all ports output current 100%

    led0.pwm( ....    //  PWM control for PCA9955A(16-channel chip)
    led1.pwm( ....    //  PWM control for PCA9956A(24-channel chip)
    ...

Other sample code

For PCA9955A : http://developer.mbed.org/users/nxp_ip/code/PCA9955A_Hello/
For PCA9956A : http://developer.mbed.org/users/nxp_ip/code/PCA9956A_Hello/
For Gradation control of PCA9955A http://developer.mbed.org/users/nxp_ip/code/PCA9955A_Gradation_control/

Committer:
nxp_ip
Date:
Thu Mar 19 08:40:03 2015 +0000
Revision:
4:fe221e1d4f44
Parent:
2:eeea2e848b81
Child:
5:cb07190e05e7
API document update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nxp_ip 0:a624e2eeccac 1 /** PCA9956A constant current LED driver
nxp_ip 0:a624e2eeccac 2 *
nxp_ip 0:a624e2eeccac 3 * An operation sample of PCA9956A 24-channel Fm+ I2C-bus 57mA/20V constant current LED driver.
nxp_ip 0:a624e2eeccac 4 * mbed accesses the PCA9956A registers through I2C.
nxp_ip 0:a624e2eeccac 5 *
nxp_ip 0:a624e2eeccac 6 * @class PCA9956A
nxp_ip 0:a624e2eeccac 7 * @author Akifumi (Tedd) OKANO, NXP Semiconductors
nxp_ip 4:fe221e1d4f44 8 * @version 0.6
nxp_ip 4:fe221e1d4f44 9 * @date 19-Mar-2015
nxp_ip 0:a624e2eeccac 10 *
nxp_ip 1:3522be54a4f5 11 * Released under the Apache 2 license
nxp_ip 0:a624e2eeccac 12 *
nxp_ip 0:a624e2eeccac 13 * About PCA9956A:
nxp_ip 0:a624e2eeccac 14 * http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_led_display_control/PCA9956ATW.html
nxp_ip 0:a624e2eeccac 15 */
nxp_ip 0:a624e2eeccac 16
nxp_ip 0:a624e2eeccac 17 #ifndef MBED_PCA9956A
nxp_ip 0:a624e2eeccac 18 #define MBED_PCA9956A
nxp_ip 0:a624e2eeccac 19
nxp_ip 0:a624e2eeccac 20 #include "mbed.h"
nxp_ip 0:a624e2eeccac 21 #include "PCA995xA.h"
nxp_ip 2:eeea2e848b81 22 #include "LedPwmOutCC.h"
nxp_ip 0:a624e2eeccac 23
nxp_ip 0:a624e2eeccac 24 /** PCA9956A class
nxp_ip 0:a624e2eeccac 25 *
nxp_ip 0:a624e2eeccac 26 * This is a driver code for the PCA9956A 24-channel Fm+ I2C-bus 57mA/20V constant current LED driver.
nxp_ip 0:a624e2eeccac 27 * This class provides interface for PCA9956A operation and accessing its registers.
nxp_ip 0:a624e2eeccac 28 * Detail information is available on next URL.
nxp_ip 0:a624e2eeccac 29 * http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_led_display_control/PCA9956ATW.html
nxp_ip 0:a624e2eeccac 30 *
nxp_ip 4:fe221e1d4f44 31 * Next sample code shows operation based on low-level-API (operated by just device instane)
nxp_ip 4:fe221e1d4f44 32 *
nxp_ip 0:a624e2eeccac 33 * Example:
nxp_ip 0:a624e2eeccac 34 * @code
nxp_ip 4:fe221e1d4f44 35 * // PCA9956A operation sample using its device instance
nxp_ip 0:a624e2eeccac 36 *
nxp_ip 4:fe221e1d4f44 37 * #include "mbed.h"
nxp_ip 0:a624e2eeccac 38 * #include "PCA9956A.h"
nxp_ip 4:fe221e1d4f44 39 *
nxp_ip 0:a624e2eeccac 40 * PCA9956A led_cntlr( p28, p27, 0x02 ); // SDA, SCL, Slave_address(option)
nxp_ip 0:a624e2eeccac 41 *
nxp_ip 0:a624e2eeccac 42 * int main()
nxp_ip 0:a624e2eeccac 43 * {
nxp_ip 0:a624e2eeccac 44 * led_cntlr.current( ALLPORTS, 1.0 ); // Set all ports output current 100%
nxp_ip 0:a624e2eeccac 45 *
nxp_ip 0:a624e2eeccac 46 * while(1) {
nxp_ip 0:a624e2eeccac 47 * for ( int port = 0; port < led_cntlr.number_of_ports(); port++ ) {
nxp_ip 0:a624e2eeccac 48 * for ( int i = 1; i <= 100; i++ ) {
nxp_ip 0:a624e2eeccac 49 * led_cntlr.pwm( port, (float)i / 100.0 );
nxp_ip 0:a624e2eeccac 50 * wait( 0.01 );
nxp_ip 0:a624e2eeccac 51 * }
nxp_ip 0:a624e2eeccac 52 * }
nxp_ip 0:a624e2eeccac 53 * led_cntlr.pwm( ALLPORTS, 0.0 );
nxp_ip 0:a624e2eeccac 54 * }
nxp_ip 0:a624e2eeccac 55 * }
nxp_ip 0:a624e2eeccac 56 * @endcode
nxp_ip 4:fe221e1d4f44 57 *
nxp_ip 4:fe221e1d4f44 58 * The high-level-API:LedPwmOutCC is also available.
nxp_ip 4:fe221e1d4f44 59 * It can be used like next sample code.
nxp_ip 4:fe221e1d4f44 60 *
nxp_ip 4:fe221e1d4f44 61 * @code
nxp_ip 4:fe221e1d4f44 62 * // PCA9956A operation sample using high-level-API
nxp_ip 4:fe221e1d4f44 63 *
nxp_ip 4:fe221e1d4f44 64 * #include "mbed.h"
nxp_ip 4:fe221e1d4f44 65 * #include "PCA9956A.h"
nxp_ip 4:fe221e1d4f44 66 *
nxp_ip 4:fe221e1d4f44 67 * PCA9956A led_cntlr( p28, p27, 0x02 ); // SDA, SCL, Slave_address(option)
nxp_ip 4:fe221e1d4f44 68 * LedPwmOutCC led0( led_cntlr, L0 ); // Instance for LED0 pin
nxp_ip 4:fe221e1d4f44 69 * LedPwmOutCC led1( led_cntlr, L1 ); // Instance for LED1 pin
nxp_ip 4:fe221e1d4f44 70 * LedPwmOutCC led2( led_cntlr, L2 ); // Instance for LED2 pin
nxp_ip 4:fe221e1d4f44 71 *
nxp_ip 4:fe221e1d4f44 72 * int main()
nxp_ip 4:fe221e1d4f44 73 * {
nxp_ip 4:fe221e1d4f44 74 * led0.current( 0.5 ); // LED0 pin current output setting to 50%
nxp_ip 4:fe221e1d4f44 75 * led1.current( 0.5 ); // LED1 pin current output setting to 50%
nxp_ip 4:fe221e1d4f44 76 * led2.current( 0.5 ); // LED2 pin current output setting to 50%
nxp_ip 4:fe221e1d4f44 77 *
nxp_ip 4:fe221e1d4f44 78 * while(1) {
nxp_ip 4:fe221e1d4f44 79 *
nxp_ip 4:fe221e1d4f44 80 * for ( float p = 1.0; p >= 0.0; p -= 0.01 ) {
nxp_ip 4:fe221e1d4f44 81 * led0 = p; // Set LED0 output PWM dutycycle as 'p'
nxp_ip 4:fe221e1d4f44 82 * wait( 0.01 );
nxp_ip 4:fe221e1d4f44 83 * }
nxp_ip 4:fe221e1d4f44 84 *
nxp_ip 4:fe221e1d4f44 85 * for ( float p = 1.0; p >= 0.0; p -= 0.01 ) {
nxp_ip 4:fe221e1d4f44 86 * led1 = p; // Set LED1 output PWM dutycycle as 'p'
nxp_ip 4:fe221e1d4f44 87 * wait( 0.01 );
nxp_ip 4:fe221e1d4f44 88 * }
nxp_ip 4:fe221e1d4f44 89 *
nxp_ip 4:fe221e1d4f44 90 * for ( float p = 1.0; p >= 0.0; p -= 0.01 ) {
nxp_ip 4:fe221e1d4f44 91 * led2 = p; // Set LED2 output PWM dutycycle as 'p'
nxp_ip 4:fe221e1d4f44 92 * wait( 0.01 );
nxp_ip 4:fe221e1d4f44 93 * }
nxp_ip 4:fe221e1d4f44 94 * }
nxp_ip 4:fe221e1d4f44 95 * }
nxp_ip 4:fe221e1d4f44 96 * @endcode
nxp_ip 0:a624e2eeccac 97 */
nxp_ip 0:a624e2eeccac 98 class PCA9956A : public PCA995xA
nxp_ip 0:a624e2eeccac 99 {
nxp_ip 0:a624e2eeccac 100 public:
nxp_ip 4:fe221e1d4f44 101
nxp_ip 4:fe221e1d4f44 102 #if DOXYGEN_ONLY
nxp_ip 4:fe221e1d4f44 103 /** PCA9956A pin names high-level API i.e. LedPwmOutCC */
nxp_ip 4:fe221e1d4f44 104 typedef enum {
nxp_ip 4:fe221e1d4f44 105 L0, /**< LED0 pin */
nxp_ip 4:fe221e1d4f44 106 L1, /**< LED1 pin */
nxp_ip 4:fe221e1d4f44 107 L2, /**< LED2 pin */
nxp_ip 4:fe221e1d4f44 108 L3, /**< LED3 pin */
nxp_ip 4:fe221e1d4f44 109 L4, /**< LED4 pin */
nxp_ip 4:fe221e1d4f44 110 L5, /**< LED5 pin */
nxp_ip 4:fe221e1d4f44 111 L6, /**< LED6 pin */
nxp_ip 4:fe221e1d4f44 112 L7, /**< LED7 pin */
nxp_ip 4:fe221e1d4f44 113 L8, /**< LED8 pin */
nxp_ip 4:fe221e1d4f44 114 L9, /**< LED9 pin */
nxp_ip 4:fe221e1d4f44 115 L10, /**< LED10 pin */
nxp_ip 4:fe221e1d4f44 116 L11, /**< LED11 pin */
nxp_ip 4:fe221e1d4f44 117 L12, /**< LED12 pin */
nxp_ip 4:fe221e1d4f44 118 L13, /**< LED13 pin */
nxp_ip 4:fe221e1d4f44 119 L14, /**< LED14 pin */
nxp_ip 4:fe221e1d4f44 120 L15, /**< LED15 pin */
nxp_ip 4:fe221e1d4f44 121 L16, /**< LED16 pin */
nxp_ip 4:fe221e1d4f44 122 L17, /**< LED17 pin */
nxp_ip 4:fe221e1d4f44 123 L18, /**< LED18 pin */
nxp_ip 4:fe221e1d4f44 124 L19, /**< LED19 pin */
nxp_ip 4:fe221e1d4f44 125 L20, /**< LED20 pin */
nxp_ip 4:fe221e1d4f44 126 L21, /**< LED21 pin */
nxp_ip 4:fe221e1d4f44 127 L22, /**< LED22 pin */
nxp_ip 4:fe221e1d4f44 128 L23, /**< LED23 pin */
nxp_ip 4:fe221e1d4f44 129 L_NC = ~0x0L /**< for when the pin is left no-connection */
nxp_ip 4:fe221e1d4f44 130 } LedPinName;
nxp_ip 4:fe221e1d4f44 131 #endif // DOXYGEN_ONLY
nxp_ip 4:fe221e1d4f44 132
nxp_ip 0:a624e2eeccac 133 /** Name of the PCA9956A registers */
nxp_ip 0:a624e2eeccac 134 enum command_reg {
nxp_ip 0:a624e2eeccac 135 MODE1, MODE2,
nxp_ip 0:a624e2eeccac 136 LEDOUT0, LEDOUT1, LEDOUT2, LEDOUT3, LEDOUT4, LEDOUT5,
nxp_ip 0:a624e2eeccac 137 GRPPWM, GRPFREQ,
nxp_ip 0:a624e2eeccac 138 PWM0, PWM1, PWM2, PWM3,
nxp_ip 0:a624e2eeccac 139 PWM4, PWM5, PWM6, PWM7,
nxp_ip 0:a624e2eeccac 140 PWM8, PWM9, PWM10, PWM11,
nxp_ip 0:a624e2eeccac 141 PWM12, PWM13, PWM14, PWM15,
nxp_ip 0:a624e2eeccac 142 PWM16, PWM17, PWM18, PWM19,
nxp_ip 0:a624e2eeccac 143 PWM20, PWM21, PWM22, PWM23,
nxp_ip 0:a624e2eeccac 144 IREF0, IREF1, IREF2, IREF3,
nxp_ip 0:a624e2eeccac 145 IREF4, IREF5, IREF6, IREF7,
nxp_ip 0:a624e2eeccac 146 IREF8, IREF9, IREF10, IREF11,
nxp_ip 0:a624e2eeccac 147 IREF12, IREF13, IREF14, IREF15,
nxp_ip 0:a624e2eeccac 148 IREF16, IREF17, IREF18, IREF19,
nxp_ip 0:a624e2eeccac 149 IREF20, IREF21, IREF22, IREF23,
nxp_ip 0:a624e2eeccac 150 OFFSET = 0x3A,
nxp_ip 0:a624e2eeccac 151 SUBADR1, SUBADR2, SUBADR3, ALLCALLADR,
nxp_ip 0:a624e2eeccac 152 PWMALL, IREFALL,
nxp_ip 0:a624e2eeccac 153 EFLAG0, EFLAG1, EFLAG2, EFLAG3, EFLAG4, EFLAG5,
nxp_ip 0:a624e2eeccac 154
nxp_ip 0:a624e2eeccac 155 REGISTER_START = MODE1,
nxp_ip 0:a624e2eeccac 156 LEDOUT_REGISTER_START = LEDOUT0,
nxp_ip 0:a624e2eeccac 157 PWM_REGISTER_START = PWM0,
nxp_ip 0:a624e2eeccac 158 IREF_REGISTER_START = IREF0,
nxp_ip 0:a624e2eeccac 159 };
nxp_ip 0:a624e2eeccac 160
nxp_ip 0:a624e2eeccac 161 /** Create a PCA9629A instance connected to specified I2C pins with specified address
nxp_ip 0:a624e2eeccac 162 *
nxp_ip 0:a624e2eeccac 163 * @param i2c_sda I2C-bus SDA pin
nxp_ip 0:a624e2eeccac 164 * @param i2c_sda I2C-bus SCL pin
nxp_ip 0:a624e2eeccac 165 * @param i2c_address I2C-bus address (default: 0xC0)
nxp_ip 0:a624e2eeccac 166 */
nxp_ip 0:a624e2eeccac 167 PCA9956A( PinName i2c_sda, PinName i2c_scl, char i2c_address = PCA995xA::DEFAULT_I2C_ADDR );
nxp_ip 0:a624e2eeccac 168
nxp_ip 0:a624e2eeccac 169 /** Create a PCA9629A instance connected to specified I2C pins with specified address
nxp_ip 0:a624e2eeccac 170 *
nxp_ip 0:a624e2eeccac 171 * @param i2c_obj I2C object (instance)
nxp_ip 0:a624e2eeccac 172 * @param i2c_address I2C-bus address (default: 0xC0)
nxp_ip 0:a624e2eeccac 173 */
nxp_ip 0:a624e2eeccac 174 PCA9956A( I2C &i2c_obj, char i2c_address = PCA995xA::DEFAULT_I2C_ADDR );
nxp_ip 0:a624e2eeccac 175
nxp_ip 0:a624e2eeccac 176 /** Destractor
nxp_ip 0:a624e2eeccac 177 *
nxp_ip 0:a624e2eeccac 178 */
nxp_ip 0:a624e2eeccac 179 virtual ~PCA9956A();
nxp_ip 0:a624e2eeccac 180
nxp_ip 0:a624e2eeccac 181 /** Returns the number of output ports
nxp_ip 0:a624e2eeccac 182 *
nxp_ip 0:a624e2eeccac 183 * @returns
nxp_ip 0:a624e2eeccac 184 * The number of output ports
nxp_ip 0:a624e2eeccac 185 */
nxp_ip 0:a624e2eeccac 186 virtual int number_of_ports( void );
nxp_ip 0:a624e2eeccac 187
nxp_ip 0:a624e2eeccac 188 #if DOXYGEN_ONLY
nxp_ip 0:a624e2eeccac 189 /** Set the output duty-cycle, specified as a percentage (float)
nxp_ip 0:a624e2eeccac 190 *
nxp_ip 0:a624e2eeccac 191 * @param port Selecting output port
nxp_ip 0:a624e2eeccac 192 * 'ALLPORTS' can be used to set all port duty-cycle same value.
nxp_ip 0:a624e2eeccac 193 * @param v A floating-point value representing the output duty-cycle,
nxp_ip 0:a624e2eeccac 194 * specified as a percentage. The value should lie between
nxp_ip 1:3522be54a4f5 195 * 0.0f (representing on 0%) and 1.0f (representing on 99.6%).
nxp_ip 0:a624e2eeccac 196 * Values outside this range will have undefined behavior.
nxp_ip 0:a624e2eeccac 197 */
nxp_ip 0:a624e2eeccac 198 void pwm( int port, float v );
nxp_ip 0:a624e2eeccac 199
nxp_ip 0:a624e2eeccac 200 /** Set all output port duty-cycle, specified as a percentage (array of float)
nxp_ip 0:a624e2eeccac 201 *
nxp_ip 0:a624e2eeccac 202 * @param vp Aray to floating-point values representing the output duty-cycle,
nxp_ip 0:a624e2eeccac 203 * specified as a percentage. The value should lie between
nxp_ip 1:3522be54a4f5 204 * 0.0f (representing on 0%) and 1.0f (representing on 99.6%).
nxp_ip 0:a624e2eeccac 205 *
nxp_ip 0:a624e2eeccac 206 * @note
nxp_ip 0:a624e2eeccac 207 * The aray should have length of 24
nxp_ip 0:a624e2eeccac 208 */
nxp_ip 0:a624e2eeccac 209 void pwm( float *vp );
nxp_ip 0:a624e2eeccac 210
nxp_ip 0:a624e2eeccac 211 /** Set the output current, specified as a percentage (float)
nxp_ip 0:a624e2eeccac 212 *
nxp_ip 0:a624e2eeccac 213 * @param port Selecting output port
nxp_ip 0:a624e2eeccac 214 * 'ALLPORTS' can be used to set all port duty-cycle same value.
nxp_ip 0:a624e2eeccac 215 * @param v A floating-point value representing the output current,
nxp_ip 0:a624e2eeccac 216 * specified as a percentage. The value should lie between
nxp_ip 0:a624e2eeccac 217 * 0.0f (representing on 0%) and 1.0f (representing on 100%).
nxp_ip 0:a624e2eeccac 218 * Values outside this range will have undefined behavior.
nxp_ip 0:a624e2eeccac 219 */
nxp_ip 0:a624e2eeccac 220 void current( int port, float vp );
nxp_ip 0:a624e2eeccac 221
nxp_ip 0:a624e2eeccac 222 /** Set all output port curent, specified as a percentage (array of float)
nxp_ip 0:a624e2eeccac 223 *
nxp_ip 0:a624e2eeccac 224 * @param vp Aray to floating-point values representing the output current,
nxp_ip 0:a624e2eeccac 225 * specified as a percentage. The value should lie between
nxp_ip 0:a624e2eeccac 226 * 0.0f (representing on 0%) and 1.0f (representing on 100%).
nxp_ip 0:a624e2eeccac 227 *
nxp_ip 0:a624e2eeccac 228 * @note
nxp_ip 0:a624e2eeccac 229 * The aray should have length of 24
nxp_ip 0:a624e2eeccac 230 */
nxp_ip 0:a624e2eeccac 231 void current( float *vP );
nxp_ip 0:a624e2eeccac 232
nxp_ip 0:a624e2eeccac 233 /** Register write (single byte) : Low level access to device register
nxp_ip 0:a624e2eeccac 234 *
nxp_ip 0:a624e2eeccac 235 * @param reg_addr Register address
nxp_ip 0:a624e2eeccac 236 * @param data Value for setting into the register
nxp_ip 0:a624e2eeccac 237 */
nxp_ip 0:a624e2eeccac 238 void write( char reg_addr, char data );
nxp_ip 0:a624e2eeccac 239
nxp_ip 0:a624e2eeccac 240 /** Register write (multiple bytes) : Low level access to device register
nxp_ip 0:a624e2eeccac 241 *
nxp_ip 0:a624e2eeccac 242 * @param data Pointer to an array. First 1 byte should be the writing start register address
nxp_ip 0:a624e2eeccac 243 * @param length Length of data
nxp_ip 0:a624e2eeccac 244 */
nxp_ip 0:a624e2eeccac 245 void write( char *data, int length );
nxp_ip 0:a624e2eeccac 246
nxp_ip 0:a624e2eeccac 247 /** Register read (single byte) : Low level access to device register
nxp_ip 0:a624e2eeccac 248 *
nxp_ip 0:a624e2eeccac 249 * @param reg_addr Register address
nxp_ip 0:a624e2eeccac 250 * @return Read value from register
nxp_ip 0:a624e2eeccac 251 */
nxp_ip 0:a624e2eeccac 252 char read( char reg_addr );
nxp_ip 0:a624e2eeccac 253
nxp_ip 0:a624e2eeccac 254 /** Register write (multiple bytes) : Low level access to device register
nxp_ip 0:a624e2eeccac 255 *
nxp_ip 0:a624e2eeccac 256 * @param reg_addr Register address
nxp_ip 0:a624e2eeccac 257 * @param data Pointer to an array. The values are stored in this array.
nxp_ip 0:a624e2eeccac 258 * @param length Length of data
nxp_ip 0:a624e2eeccac 259 */
nxp_ip 0:a624e2eeccac 260 void read( char reg_addr, char *data, int length );
nxp_ip 0:a624e2eeccac 261 #endif
nxp_ip 0:a624e2eeccac 262
nxp_ip 0:a624e2eeccac 263 private:
nxp_ip 0:a624e2eeccac 264 void initialize( void );
nxp_ip 0:a624e2eeccac 265 virtual char pwm_register_access( int port );
nxp_ip 0:a624e2eeccac 266 virtual char current_register_access( int port );
nxp_ip 0:a624e2eeccac 267
nxp_ip 0:a624e2eeccac 268 const int n_of_ports;
nxp_ip 0:a624e2eeccac 269 }
nxp_ip 0:a624e2eeccac 270 ;
nxp_ip 0:a624e2eeccac 271
nxp_ip 0:a624e2eeccac 272 #endif // MBED_PCA9956A