안녕하세요. 오늘은 I2C Address 주소찾기를 해보겠습니다.
사용한 보드는 Arduino-UNO입니다. (SDA:A4 , SCL:A5)
사용할 함수는 세개입니다.
- Wire.begin() : I2C를 사용할 수 있게 초기화합니다.
- Wire.beginTransmission(address) : 슬레이브 주소전달 함수입니다. (주소는 7bit)
- Wrie.endTransmission() : write()에 의해 대기중이였던 데이터를 전송하고, 통신을 종료합니다. 이 함수의 리턴값에 따라서 슬레이브가 데이터를 수신했는지 알 수 있습니다.
0: 성공
1: 데이터가 너무 길어 전송 버퍼에 맞지 않음
2: 주소 전송 시 NACK 수신
3: 데이터 전송 시 NACK 수신
4: 기타 오류
Wire.beginTransmission(address)를 통해서 0~127번주소까지 보낸다음에 Wrie.endTransmission()를 통해서 통신이 정상적으로 되었는지 return값을 확인하고 0이면 성공입니다
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
byte address,flag=0;
Serial.println("Scanning");
for(address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0)
{
Serial.print("I2C device address : 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println("\nAddress scan success\n");
flag = 1;
break;
}
}
if(flag == 0)
Serial.println("Address scan fail\n");
delay(5000);
}
성공하면 success가 뜨고 실패하면 fail이 뜹니다. 저는 fail때 모듈을 우노랑 제거했었습니다
*슬레이브에게 응답을 받았을 때 ACK
*슬레이브에게 응답을 못받았을 때 NAK