我想使用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。
这是我的电路。
答案 0 :(得分:1)
根据datasheet,9955有4个地址引脚。你也需要拉低A3或高。
但即使这样,地址也不是0x02
。在7.1.1节的图3中,地址显示为
1 1 0 A3 A2 A1 A0 R/W
因此,如果您将所有引脚接地,则器件地址应为0xC0或0xC1,具体取决于您是在读还是写它。