본문 바로가기
임베디드 관련/Arduino

[Arduino] Wire 라이브러리 함수 총 정리

by minhyeok.lee 2024. 1. 11.
반응형

Arduino의 Wire 라이브러리의 클래스 이름은 TwoWire이고 이는 I2C 통신의 다른 이름인 TWI(Two Wire Interface)에서 유래

TwoWire 클래스에서 전역객체로 Wire를 사용하고 있으므로 실제로는 Wire를 통해 통신이 이루어진다.

 


 

 

Wire 라이브러리 함수 모음

 

Wire.begin()

Wire.begin(address)

 - address: 7비트 슬레이브 주소, 지정되지 않은 경우 버스를 컨트롤러 장치로 참여시킨다.

Wire 라이브러리를 초기화 및 I2C 버스를 컨트롤러 또는 주변 장치로 결합하는 함수이다.

이 함수는 일반적으로 한 번만 호출되어야 한다.

 

1. Wire.begin()은 Mater역할을 한다.

2. Wire.begin(address)는 Slave역할을 한다.

 


 

Wire.end()

Wire.begin()이후에 Wire 라이브러리를 비활성화 한다.

이후에 Wire라이브러리를 다시 사용하려면 Wire.begin()을 다시 호출해야한다.

 * 참고: 이 함수는 Wire 라이브러리의 원래 버전에서 사용할 수 없었고 일부 플랫폼에서는 여전히 사용 불가능하다.


 

 

Wire.beginTransmission(address)

 - address: 전송할 장치의 7비트 주소

address로 지정된 Slave로 데이터 전송을 시작한다.

실제 전송은 Wire.write()함수로 버퍼에 기록 후 Wire.endTransmission() 함수가 사용되면 발생한다.

 


 

Wire.endTransmission()

Wire.endTransmission(stop)

 - stop의 default 값은 true이다.

   -> true: 요청이 완료 된 후에 중지 메시지를 보내고 전송 후 버스를 해제한다.

   -> false: 요청이 완료된 후에도 연결을 유지하여 다른 Master 장치가 데이터를 요구할 수 없도록 한다.

 

address로 지정된 Slave로 데이터 전송을 시작한다.

Write 함수에 의해 버퍼에 기록된 데이터를 전송하여 Wire.beginTransmission 함수로 시작한 Slave 장치로 데이터 전송을 마친다.

stop은 이 함수로 요청이 완료되었을 때 I2C 통신의 정지 메시지를 보낼지를 지정하는 것으로 true나 false 값을 사용한다.

 

return 값

0: 성공

1: 데이터의 길이가 너무 길어 버퍼 용량이 초과

2: 주소 전송 오류

3: 데이터 전송 오류

4: 기타 오류

5: 시간초과


 

Wire.write(value)

Wire.write(string)

Wire.write(data, length)

 - value: 단일 바이트로 보낼 값

 - string: 일련의 바이트로 보낼 문자열

 - data: 바이트로 전송할 데이터 배열, length: 전송할 바이트 수

 

Master의 요청에 따라 Slave에 데이터를 전송하거나 전송할 데이터를 버퍼에 기록한다.

이 함수의 위치는 Wire.beginTransmission()과 Wire.endTransmission()의 호출 사이이다.

 

예제코드

#include <Wire.h>

byte val = 0;

void setup() {
  Wire.begin(); // I2C 통신시작
}

void loop() {
    Wire.beginTransmission(44);  // 장치 번호 44(0x2C)로 전송

    Wire.write(val);             // 값 바이트를 전송
    Wire.endTransmission();      // 전송 중지

    val++;                       // 값 증가

    // 64(최대)에 도달한 경우
    if(val == 64) {
        val = 0;                   // 0에서 다시 시작
    }

    delay(500);
}

 

Wire.requestFrom(address, quantity)

Wire.requestFrom(address, quantity, stop)

 - address: 바이트를 요청할 장치의 슬레이브 장치의 7비트 주소

 - quantity: 요청할 바이트의 수

 - stop의 default 값은 true이다.

   -> true: 요청이 완료 된 후에 중지 메시지를 보내고 전송 후 버스를 해제한다.

   -> false: 요청이 완료된 후에도 연결을 유지하여 다른 Master 장치가 데이터를 요구할 수 없도록 한다.

 

Mater가 Slave에게 지정한 양의 데이터를 요청한다.

quantity가 지정한 양이 되며 바이트 단위로 사용한다.

stop은 앞의 Wire.endTransmission과 마찬가지로 요청완료 후 정지 메시지를 전송할 지 지정하는 변수이다.

 


 

Wire.available()

Wire.read() 함수로 읽어들일 수 있는 유효한 바이트 수를 반환한다.

Master장치에서 Slave 장치로 데이터를 요청한 후 도착한 데이터를 검사하기 위하여 주로 사용한다.

 ex) while(Wire.available()){ ... }

 


 

 

Wire.read()

Master에서 Wire.requestFrom() 함수로 Slave에 요청한 데이터를 읽는 함수로 한 바이트씩 읽어 반환한다.

반대로 Master에서 보내어 Slave에 도착한 데이터를 읽기 위해서도 사용할 수 있다.

 

예제코드

#include <Wire.h>

void setup() {
  Wire.begin();             // I2C 통신시작
  Serial.begin(9600);       // 출력을 위한 시리얼 시작
}

void loop() {
    Wire.requestFrom(2, 6);    // 슬레이브 장치 번호 2에서 6바이트 요청

    // 슬레이브가 요청한 것보다 적게 보낼 수 있다.
    while(Wire.available()) {
        char c = Wire.read();    // 바이트를 문자로 받기
        Serial.print(c);         // 문자(c) 출력
    }

    delay(500);
}

 

 

Wire.onReceive(handler)

 - handler : 주변 장치가 데이터를 수신할 때 호출되는 함수, 이는 단일 int 매개변수(컨트롤러 장치에서 읽은 바이트 수)를 사용하고 아무것도 반환하지 않아야 한다.

Slave가 Master로부터 전송을 받았을 때 호출될핸들러(handler) 함수를 등록한다.

핸들러 함수는 수신한 데이터의 바이트 수를 나타내는 int형의 변수를 가진다. = void (*) (int)

 


 

 

Wire.onRequest(handler)

 - handler : 호출할 함수로, 매개변수를 사용하지 않고 아무것도 반환하지 않는다.

Slave가 Master로부터 데이터 요청을 받았을 때 호출되는 핸들러 함수를 등록한다.

핸들러 함수는 반환 값이 없으며 변수도 갖지 않는다. = void (*) (void)

 

 

전송되는 데이터의 크기는 available 함수를 통해 알아낼 수 있다.

예제코드

  uint8_t i = 0;
  while (Wire.available()) {
    i++ = Wire.read();
  }
  // i의 값이 데이터의 크기

 

 


 

Wire.setClock(clockFrequency)

 - clockFrequency : 원하는 통신 클록의 값(헤르츠 단위), 허용되는 값은 100000(표준 모드) 및 400000(고속 모드), 일부 프로세서는 10000(저속 모드), 1000000(고속 모드 플러스) 및 3400000(고속 모드)도 지원,. 원하는 모드가 지원되는지 확인하려면 특정 프로세서 설명서를 참조해야 한다.

 

이 함수는 I2C 통신을 위한 클럭 주파수를 수정한다.

I2C 주변 장치에는 최소 작동 클럭 주파수가 없지만 일반적으로 100KHz가 기준이다.

 


 

* 참고: 아래 세 함수는 Wire 라이브러리의 원래 버전에서는 사용할 수 없으며 일부 플랫폼에서는 여전히 사용할 수 없을 수도 있다. 여러 플랫폼과 버전에서 휴대할 수 있어야 하는 코드는 Wire_HAS_TIMEout 매크로를 사용할 수 있으며, 이 매크로는 Wire.setWireTimeout(), Wire.getWireTimeoutFlag() 및 Wire.clearWireTimeout()을 모두 사용할 수 있는 경우에만 정의된다.

 

Wire.setWireTimeout()

Wire.setWireTimeout(timeout, reset_on_timeout)

 - timeout a timeout: 시간 초과(마이크로초), 0이면 시간 초과 확인이 비활성화됩니다.

 - reset_on_timeout: true인 경우 Wire 하드웨어는 시간 초과 시 자동으로 재설정된다.

 

이 함수가 매개변수 없이 호출되면 일반적인 단일 마스터 구성에서 잠금을 방지하는 데 충분한 기본 시간 제한이 구성된다.

 

Wire.clearTimeout()

시간 초과 플래그를 지운다.

기본적으로 제한 시간이 설정되어 있지 않을 수 있다.

 

Wire.getWireTimeoutFlag()

플래그를 마지막으로 지운 이후 시간 초과가 발생했는지 여부를 확인한다.
이 플래그는 Wire.clearWireTimeoutFlag()가 호출될 때 또는 Wire.setWireTimeout()을 사용하여 타임아웃이 변경될 때마다 설정되고 지워진다.

반응형

댓글