连接PCA9955 I2C LED驱动器

时间:2014-05-30 07:08:40

标签: avr i2c

我想使用TWi通信模式将ATmega128连接到PCA9955 LED驱动器。 TWI还可以,但即便如此,PCA9955也不会承认。我试图在不使用PWM的情况下点亮LED 14。我的代码在这里。我已将PCA9955的AD0,AD1和AD2引脚连接到地,因此地址为器件地址为0x02。谁能告诉我这里有什么关于PCA9955 LED驱动器?

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 fully 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 now all addresses are connected to 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);
}

我得到的输出是。

device ack err.
address ack err.
data ack err.

唯一可以接受的是&#39;开始&#39; I2C。

这是我的电路。 enter image description here

1 个答案:

答案 0 :(得分:1)

根据datasheet,9955有4个地址引脚。你也需要拉低A3或高。

但即使这样,地址也不是0x02。在7.1.1节的图3中,地址显示为

1 1 0 A3 A2 A1 A0 R/W

因此,如果您将所有引脚接地,则器件地址应为0xC0或0xC1,具体取决于您是在读还是写它。