Tool/software: TI-RTOS
hi,
i am trying to connect pca9685 with cc1350 using i2c.
writing from cc1350 to pca9685 seems to be working fine but the code gets stuck in i2c_transfer function while reading. looks like pca is not responding (my best guess).
but the same pca9685 is working just fine with arduino.
all my connections seem to be right.
i have tried both with and without pullups on sda scl lines
can you please help me find out whats going wrong.
#include <stdint.h> #include <stddef.h> #include <unistd.h> #include <inttypes.h> #include <ti/drivers/GPIO.h> #include <ti/drivers/I2C.h> #include "Board.h" #define TASKSTACKSIZE 640 #define PCA9685_MODE1 0x0 #define PCA9685_PRESCALE 0xFE unsigned int i=4095; uint8_t txBuffer[5]; uint8_t rxBuffer[2]; I2C_Handle i2c; I2C_Transaction i2cTransaction; uint8_t read8(uint8_t addr) { txBuffer[0] = addr; i2cTransaction.slaveAddress = 0x40; i2cTransaction.writeBuf = txBuffer; i2cTransaction.writeCount = 1; i2cTransaction.readBuf = rxBuffer; i2cTransaction.readCount = 1; if (I2C_transfer(i2c, &i2cTransaction)) <<-------------------------------------------------- ADDED A BREAKPOINT HERE ---- AFTER I HIT RUN AGAIN ---- NEVER COMES OUT OF THIS { printf("\n=====\nsuccess at pca reading \n=====\n"); <<------------------------------------- NEVER EXECUTES //printf("\n=====\nsuccess at pca reading %\n=====\n", PRIu8, addr); return rxBuffer[0]; } else { printf("\n=====\nfailure at pca reading %\n=====\n", PRIu8, addr); while(1); return 0; } } uint8_t write8(uint8_t addr, uint8_t data) { txBuffer[0] = addr; txBuffer[1] = data; i2cTransaction.slaveAddress = 0x40; i2cTransaction.writeBuf = txBuffer; i2cTransaction.writeCount = 2; i2cTransaction.readBuf = rxBuffer; i2cTransaction.readCount = 1; //sleep(2); if (I2C_transfer(i2c, &i2cTransaction)) { printf("\n=====\nsuccess at pca writing \n=====\n"); //printf("\n=====\nsuccess at pca writing %\n=====\n", PRIu8, addr); return 1; } else { printf("\n=====\nfailure at pca writing %\n=====\n", PRIu8, addr); while(1); return 0; } } void reset(void) { txBuffer[0] = 0x00; txBuffer[1] = 0x80; i2cTransaction.slaveAddress = 0x40; i2cTransaction.writeBuf = txBuffer; i2cTransaction.writeCount = 2; i2cTransaction.readBuf = rxBuffer; i2cTransaction.readCount = 1; sleep(2); if (I2C_transfer(i2c, &i2cTransaction)) { printf("\n=====\npca reset command sent\n=====\n"); } else { printf("\n=====\nfailure at pca reset\n=====\n"); while(1); } } void setPwmFreq(float freq) { printf("attempting to set freq: %f Hz\n=====\nsetting pre-scale: 3\n=====\n", freq); uint8_t oldmode = read8(PCA9685_MODE1); uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep write8(PCA9685_MODE1, newmode); // go to sleep write8(PCA9685_PRESCALE, 3); // set the prescaler write8(PCA9685_MODE1, oldmode); sleep(5); write8(PCA9685_MODE1, oldmode | 0xa0); // This sets the MODE1 register to turn on auto increment. printf("new mode set to: %\n=====\n", PRIu8, read8(PCA9685_MODE1)); } void *mainThread(void *arg0) { I2C_Params i2cParams; GPIO_init(); I2C_init(); GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); GPIO_setConfig(Board_GPIO_LED1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); I2C_Params_init(&i2cParams); i2cParams.bitRate = I2C_400kHz; i2c = I2C_open(Board_I2C_TMP, &i2cParams); if (i2c == NULL) { while (1); } else { } reset(); setPwmFreq(1600); txBuffer[0] = 0X00; txBuffer[1] = 0X00; txBuffer[2] = 0X00; txBuffer[3] = 0X00; txBuffer[4] = 0X00; i2cTransaction.slaveAddress = 0X40; i2cTransaction.writeBuf = txBuffer; i2cTransaction.writeCount = 5; i2cTransaction.readBuf = rxBuffer; i2cTransaction.readCount = 1; sleep(2); GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_ON); while(1) { i-=8; if(i==1) i=4095; txBuffer[0] = 0X06; txBuffer[1] = 0X00; txBuffer[2] = 0X00; txBuffer[3] = i; txBuffer[4] = i>>8; if (I2C_transfer(i2c, &i2cTransaction)) { //printf("i2c transac\n"); //printf(rxBuffer[0]); GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_OFF); GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_ON); } else { //printf("i2c NOT transac\n"); GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON); GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_OFF); } /* Sleep for 1 second */ sleep(1); } I2C_close(i2c); return (NULL); }