| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- /*****************************************************************************
- *
- * Copyright(C) 2011, Embedded Artists AB
- * All rights reserved.
- *
- ******************************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * Embedded Artists AB assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. Embedded Artists AB
- * reserves the right to make changes in the software without
- * notification. Embedded Artists AB also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- *****************************************************************************/
- /*
- * NOTE: I2C must have been initialized before calling any functions in this
- * file.
- */
- /******************************************************************************
- * Includes
- *****************************************************************************/
- //#include "board.h"
- #include "chip.h"
- #include "pca9532.h"
- /******************************************************************************
- * Defines and typedefs
- *****************************************************************************/
- #define I2C_PORT (LPC_I2C0)
- #define LS_MODE_ON 0x01
- #define LS_MODE_BLINK0 0x02
- #define LS_MODE_BLINK1 0x03
- /******************************************************************************
- * External global variables
- *****************************************************************************/
- /******************************************************************************
- * Local variables
- *****************************************************************************/
- static uint16_t blink0Shadow = 0;
- static uint16_t blink1Shadow = 0;
- static uint16_t ledStateShadow = 0;
- /******************************************************************************
- * Local Functions
- *****************************************************************************/
- static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len)
- {
- I2CM_XFER_T i2cData;
- i2cData.slaveAddr = addr;
- i2cData.options = 0;
- i2cData.status = 0;
- i2cData.txBuff = buf;
- i2cData.txSz = len;
- i2cData.rxBuff = NULL;
- i2cData.rxSz = 0;
- if (Chip_I2CM_XferBlocking(LPC_I2C0, &i2cData) == 0) {
- return ERROR;
- }
- return SUCCESS;
- }
- static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len)
- {
- I2CM_XFER_T i2cData;
- i2cData.slaveAddr = addr;
- i2cData.options = 0;
- i2cData.status = 0;
- i2cData.txBuff = NULL;
- i2cData.txSz = 0;
- i2cData.rxBuff = buf;
- i2cData.rxSz = len;
- if (Chip_I2CM_XferBlocking(LPC_I2C0, &i2cData) == 0) {
- return ERROR;
- }
- return SUCCESS;
- }
- static void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode)
- {
- #define IS_LED_SET(bit, x) ( ( ((x) & (bit)) != 0 ) ? 1 : 0 )
- int i = 0;
- for (i = 0; i < 4; i++) {
- ls[i] |= ( (IS_LED_SET(0x0001, states)*mode << 0)
- | (IS_LED_SET(0x0002, states)*mode << 2)
- | (IS_LED_SET(0x0004, states)*mode << 4)
- | (IS_LED_SET(0x0008, states)*mode << 6) );
- states >>= 4;
- }
- }
- static void setLeds(void)
- {
- uint8_t buf[5];
- uint8_t ls[4] = {0,0,0,0};
- uint16_t states = ledStateShadow;
- /* LEDs in On/Off state */
- setLsStates(states, ls, LS_MODE_ON);
- /* set the LEDs that should blink */
- setLsStates(blink0Shadow, ls, LS_MODE_BLINK0);
- setLsStates(blink1Shadow, ls, LS_MODE_BLINK1);
- buf[0] = PCA9532_LS0 | PCA9532_AUTO_INC;
- buf[1] = ls[0];
- buf[2] = ls[1];
- buf[3] = ls[2];
- buf[4] = ls[3];
- I2CWrite(PCA9532_I2C_ADDR, buf, 5);
- }
- /******************************************************************************
- * Public Functions
- *****************************************************************************/
- /******************************************************************************
- *
- * Description:
- * Initialize the PCA9532 Device
- *
- *****************************************************************************/
- void pca9532_init (void)
- {
- /* nothing to initialize */
- }
- /******************************************************************************
- *
- * Description:
- * Get the LED states
- *
- * Params:
- * [in] shadow - TRUE if the states should be retrieved from the shadow
- * variables. The shadow variable are updated when any
- * of setLeds, setBlink0Leds and/or setBlink1Leds are
- * called.
- *
- * FALSE if the state should be retrieved from the PCA9532
- * device. A blinkin LED may be reported as on or off
- * depending on the state when calling the function.
- *
- * Returns:
- * A mask where a 1 indicates that a LED is on (or blinking).
- *
- *****************************************************************************/
- uint16_t pca9532_getLedState (uint32_t shadow)
- {
- uint8_t buf[2];
- uint16_t ret = 0;
- if (shadow) {
- /* a blink LED is reported as on*/
- ret = (ledStateShadow | blink0Shadow | blink1Shadow);
- }
- else {
- /*
- * A blinking LED may be reported as on or off depending on
- * its state when reading the Input register.
- */
-
- buf[0] = PCA9532_INPUT0;
- I2CWrite(PCA9532_I2C_ADDR, buf, 1);
- I2CRead(PCA9532_I2C_ADDR, buf, 1);
- ret = buf[0];
- buf[0] = PCA9532_INPUT1;
- I2CWrite(PCA9532_I2C_ADDR, buf, 1);
- I2CRead(PCA9532_I2C_ADDR, buf, 1);
- ret |= (buf[0] << 8);
- /* invert since LEDs are active low */
- ret = ((~ret) & 0xFFFF);
- }
- return (ret & ~PCA9532_NOT_USED);
- }
- /******************************************************************************
- *
- * Description:
- * Set LED states (on or off).
- *
- * Params:
- * [in] ledOnMask - The LEDs that should be turned on. This mask has
- * priority over ledOffMask
- * [in] ledOffMask - The LEDs that should be turned off.
- *
- *****************************************************************************/
- void pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask)
- {
- /* turn off leds */
- ledStateShadow &= (~(ledOffMask) & 0xffff);
- /* ledOnMask has priority over ledOffMask */
- ledStateShadow |= ledOnMask;
- /* turn off blinking */
- blink0Shadow &= (~(ledOffMask) & 0xffff);
- blink1Shadow &= (~(ledOffMask) & 0xffff);
- setLeds();
- }
- /******************************************************************************
- *
- * Description:
- * Set the blink period for PWM0. Valid values are 0 - 255 where 0
- * means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.
- *
- * Params:
- * [in] period - the period for pwm0
- *
- *****************************************************************************/
- void pca9532_setBlink0Period(uint8_t period)
- {
- uint8_t buf[2];
- buf[0] = PCA9532_PSC0;
- buf[1] = period;
- I2CWrite(PCA9532_I2C_ADDR, buf, 2);
- }
- /******************************************************************************
- *
- * Description:
- * Set the duty cycle for PWM0. Valid values are 0 - 100. 25 means the LED
- * is on 25% of the period.
- *
- * Params:
- * [in] duty - duty cycle
- *
- *****************************************************************************/
- void pca9532_setBlink0Duty(uint8_t duty)
- {
- uint8_t buf[2];
- uint32_t tmp = duty;
- if (tmp > 100) {
- tmp = 100;
- }
- tmp = (256 * tmp)/100;
- buf[0] = PCA9532_PWM0;
- buf[1] = tmp;
- I2CWrite(PCA9532_I2C_ADDR, buf, 2);
- }
- /******************************************************************************
- *
- * Description:
- * Set the LEDs that should blink with rate and duty cycle from PWM0.
- * Blinking is turned off with pca9532_setLeds.
- *
- * Params:
- * [in] ledMask - LEDs that should blink.
- *
- *****************************************************************************/
- void pca9532_setBlink0Leds(uint16_t ledMask)
- {
- blink0Shadow |= ledMask;
- setLeds();
- }
- /******************************************************************************
- *
- * Description:
- * Set the blink period for PWM1. Valid values are 0 - 255 where 0
- * means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.
- *
- * Params:
- * [in] period - The period for PWM1
- *
- *****************************************************************************/
- void pca9532_setBlink1Period(uint8_t period)
- {
- uint8_t buf[2];
- buf[0] = PCA9532_PSC1;
- buf[1] = period;
- I2CWrite(PCA9532_I2C_ADDR, buf, 2);
- }
- /******************************************************************************
- *
- * Description:
- * Set the duty cycle for PWM1. Valid values are 0 - 100. 25 means the LED
- * is on 25% of the period.
- *
- * Params:
- * [in] duty - duty cycle.
- *
- *****************************************************************************/
- void pca9532_setBlink1Duty(uint8_t duty)
- {
- uint8_t buf[2];
- uint32_t tmp = duty;
- if (tmp > 100) {
- tmp = 100;
- }
- tmp = (256 * tmp)/100;
- buf[0] = PCA9532_PWM1;
- buf[1] = tmp;
- I2CWrite(PCA9532_I2C_ADDR, buf, 2);
- }
- /******************************************************************************
- *
- * Description:
- * Set the LEDs that should blink with rate and duty cycle from PWM1.
- * Blinking is turned off with pca9532_setLeds.
- *
- * Params:
- * [in] ledMask - LEDs that should blink.
- *
- *****************************************************************************/
- void pca9532_setBlink1Leds(uint16_t ledMask)
- {
- blink1Shadow |= ledMask;
- setLeds();
- }
|