아두이노/이론

I2C통신 아두이노와 오실로스코프로 확인해보기 2편

원원 2021. 10. 3. 14:34


안녕하세요. I2C 2편입니다.  

I2C통신 아두이노와 오실로스코프로 확인해보기 1편
https://wowon.tistory.com/224?category=615512
I2C통신 아두이노와 오실로스코프로 확인해보기 3편
https://wowon.tistory.com/226?category=615512




아두이노와 오실로스코프를 이용해서 데이터 주소를 슬레이브에게 보내는 것을 해보겠습니다.



- Wire.begin() : I2C를 사용할 수 있게 초기화합니다.

- Wire.beginTransmission(address) : 슬레이브 주소전달 함수입니다. (주소는 7bit)

- Wire.write(value) : 슬레이브에게 보낼 데이터입니다.

- Wrie.endTransmission() :  write()에 의해 대기중이였던 데이터를 전송하고, 통신을 종료합니다. 이 함수의 리턴값에 따라서 슬레이브가 데이터를 수신했는지 알 수 있습니다.
0: 성공
1: 데이터가 너무 길어 전송 버퍼에 맞지 않음
2: 주소 전송 시 NACK 수신
3: 데이터 전송 시 NACK 수신
4: 기타 오류


- 아두이노(UNO) 코드.  I2C모듈은 JMOD-TEMP-1 (LM75A)을 사용했습니다. UNO는 A4가 SDA라인, A5가 SCL라인입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<Wire.h>
 
 
void setup() {
  Wire.begin();
  Serial.begin(9600);
}
 
void loop() {
  int i;
  Wire.beginTransmission(0x00);
  i = Wire.endTransmission();
 
  if(i ==0)
    Serial.println("success");
  else
  {
    Serial.print("Error : ");
    Serial.println(i);
  }
 
  delay(1000);
}
cs

11번에서 주소를 보내고 있는데, 주소는 0x00을 보내고 있습니다. 

위의 포맷으로 파형이 찍혀야 합니다.

연결한 I2C 모듈의 주소는 0x48이므로, NACK입니다.

 

Wire.beginTransmission의 리턴값이 2이므로 "주소 전송 시 NACK 수신" 입니다.

그럼 이제 주소로 0x01, 0x02, 0x03을 보내보겠습니다.

*0x01

*0x02

*0x03

지금까지 NACK가 오는건 슬레이브의 주솟값이 잘못되었기 때문입니다.

제가 사용한 JMOD-TEMP-1 (LM75A)을 소개해보자면 디지털 온도센서 모듈입니다. JMOD-TEMP-1은 제이씨넷 회사가 LM75A IC를 이용하여 보드를 만든 것 입니다. JMOD-TEMP-1은 보드에 풀업저항이 연결되어 있으므로 SCL,SDA에 따로 풀업저항을 연결안해줘도 됩니다. 

실제로 핀배치를 보면 SDA,SCL가 있는 것을 확인할 수 있습니다.

이제 LM75A데이터를 보면 이 모듈의 주솟값이 적혀있습니다.

0b1001A2A1A0이고 A2,A1,A0을 연결안하면 0이고 연결하면 1입니다. 그래서 A0~A2을 연결 안하면 주솟값이 0x48이 됩니다.( 7비트)  그럼 이제 이 모듈의 주솟값인 0x48을 보내보겠습니다.

ACK의값이 0이고, Wire.beginTransmission의 리턴값이 0이므로 성공입니다.

3편에서는 실제로 데이터를 WRITE , READ 해보겠습니다.