내가 ATmega128로 어떤 IC소자랑 I2C통신을 하고 싶어
근대 데이터시트고 뭐고 다 뒤져봐도 Device Address를 모르겠는거야
보통 EEPROM이랑 통신할 때는 0xA0~8에 해당하는 아이디가 보통인데 이런식으로 명시가 안되어 있었어
그래서 Broadcase하듯이 모든 주소에다가 임으의 데이터값을 보내봤어
void findSlave(void)
{
uint8_t cnt = 1;
unsigned char Add,Data;
>
Add = 0x00;
while(1){
if(Add == 0x80) //주소 끝까지 감
{
sprintf(Buffer, "No available address ");
puts_USART0(Buffer);
break;
}
TWCR = ((1<<TWINT) | (1<<TWSTA) | (1<<TWEN)); // TWI 시작
while(!(TWCR & (1<<TWINT))); // TWINT 클리어될 동안
sprintf(Buffer, "%d st_TWSR : 0x%x ", cnt, TWSR);
puts_USART0(Buffer);
if(TWSR == 0x08) //START 컨디션 확인
{
sprintf(Buffer, "Start Condition OK ");
puts_USART0(Buffer);
}
else
{
sprintf(Buffer, "Start Condition Fail ");
puts_USART0(Buffer);
}
cnt++;
TWDR = ((Add<<1)& 0xfe); // 슬레이브 주소
TWCR = ((1<<TWINT) | (1<<TWEN));
//delay_ms(1);
while(!(TWCR & (1<<TWINT))); // TWINT 클리어될 동안
if(TWSR == 0x18) //주소보낸 후 반응 확인
{
sprintf(Buffer, "Write OK, Address : 0x%x ",Add);
puts_USART0(Buffer);
break;
}
else{
sprintf(Buffer, "Write error, TWSR : 0x%x ",TWSR);
puts_USART0(Buffer);
}
TWDR = Data; // 데이터 송신
TWCR = ( (1<<TWINT) | (1<< TWEN));
while(!(TWCR & (1<<TWINT))); // TWINT 클리어될 동안
TWCR = ((1<<TWINT) | (1<<TWSTO) | (1<<TWEN)); // 정지
sprintf(Buffer, "tried ADD : 0x%x ", Add);
puts_USART0(Buffer);
delay_ms(1);
Add++; //주소 올려서 반복
}
}
이런식으로 말이지,
그랬더니 0x00번부터 0x7F(address는 7비트짜리니까 7F가 마지막이지)까지 싹다 보내봤는데
일단 Start 신호가 문제없이 갔고, 주소가 안맞는지 0x20이라는 I2C통신상태(주소+W 보냈는데 슬레이브로부터 NACK 수신)
신호가 왔어. 그것도 모든 주소에서 말이지. 이런 경우는 어떻게 해야함? 모든 주소가 먹통인데, 이거 하드웨어가 문제인 걸까?
http://electronicsdo.tistory.com/60