avr - Interfacing PCA9955 I2C LED driver -
i want interface atmega128 pca9955 led driver using twi communication mode. twi ok pca9955 doesn't acknowledge it. trying light led 14 without using pwm. code here. have connected ad0, ad1 , ad2 pins of pca9955 ground address device address 0x02. can tell me did miss here regarding pca9955 led driver ?
void master_twi_init(void) { twsr = 0x03; twbr = 124; // scl frequency 1000hz (approximately) } void device_init(void) { stdout = &uart0_str; uart0_init(); master_twi_init(); } int main(void){ device_init(); _delay_ms(5); twi_tx_byte(0x05, 0b00010000); // set led 14 bright while(1){;} } void twi_tx_byte(uint8_t addr, uint8_t data) { twcr = (1<<twint)|(1<<twsta)|(0<<twsto)|(1<<twen); while (!(twcr & (1<<twint))); if ((twsr & 0xf8) != 0x08){printf("start error.\r\n");} _delay_ms(100); twdr = 0xc0; //for addresses connected ground twcr = (1<<twint)|(1<<twen); while(!(twcr & (1<<twint))); if ((twsr & 0xf8) != 0x18){printf("device ack err.\r\n");} _delay_ms(100); twdr = addr; twcr = (1<<twint)|(1<<twen); while(!(twcr & (1<<twint))); if ((twsr & 0xf8) != 0x28){printf("address ack err.\r\n");} _delay_ms(100); twdr = data; twcr = (1<<twint)|(1<<twen); while(!(twcr & (1<<twint))); if ((twsr & 0xf8) != 0x28){printf("data ack err.\r\n");} _delay_ms(100); twcr = (1<<twint)|(1<<twen)|(1<<twsto); }
the output is.
device ack err. address ack err. data ack err.
the thing okay 'start' of i2c.
this circuit.
according datasheet, 9955 has 4 address pins. need pull a3 low or high, too.
but then, address not 0x02
. in fig.3 in section 7.1.1, address shown be
1 1 0 a3 a2 a1 a0 r/w
so if ground pins, device address should 0xc0 or 0xc1, depending on whether reading or writing it.
Comments
Post a Comment