목차

I2C

CUBLOC2에 있는 I2C 전용 포트를 통해 외부 센서 및 메모리 디바이스등과 데이터를 송수신할 수 있습니다.

I2cstart

I2cstart speed

파라미터 설명
speed 통신 속도 (100 ~ 1000) (예: 100 = 100kHz)

I2C를 초기화하고 통신 속도를 설정합니다.

I2cstart 100   ' 100kHz

I2cwrite

result = I2cwrite(devaddr, regaddr, data(), length)

파라미터 설명
result 실행 결과 (0=성공, 그 외=에러)
devaddr 디바이스 주소 (7bit, R/W 제외)
regaddr 레지스터 또는 메모리 주소 (1바이트)
data() 전송할 Byte 배열
length 전송할 바이트 수

지정된 레지스터에 데이터를 씁니다.

반환값이 필요 없는 경우, 함수형이 아닌 명령식으로 사용할 수 있습니다.

Dim tx(2) As Byte

tx(0) = &H12
tx(1) = &H34

I2cwrite &H50, &H10, tx(), 2

I2cread

result = I2cread(devaddr, regaddr, data(), length)

파라미터 설명
result 실행 결과 (0=성공, 그 외=에러)
devaddr 디바이스 주소 (7bit, R/W 제외)
regaddr 레지스터 또는 메모리 주소 (1바이트)
data() 수신 데이터를 저장할 Byte 배열
length 수신할 바이트 수

지정된 레지스터에서 데이터를 읽습니다.

반환값이 필요 없는 경우, 함수형이 아닌 명령식으로 사용할 수 있습니다.

Dim rx(2) As Byte

I2cread &H50, &H10, rx(), 2

I2cwriteraw

result = I2cwriteraw(devaddr, data(), length)

파라미터 설명
result 실행 결과 (0=성공, 그 외=에러)
devaddr 디바이스 주소 (7bit)
data() 전송할 Byte 배열
length 전송할 바이트 수

레지스터 주소 없이 데이터를 직접 전송합니다.

반환값이 필요 없는 경우, 함수형이 아닌 명령식으로 사용할 수 있습니다.

Dim tx(2) As Byte

tx(0) = &HAA
tx(1) = &H55

I2cwriteraw &H50, tx(), 2

I2creadraw

result = I2creadraw(devaddr, data(), length)

파라미터 설명
result 실행 결과 (0=성공, 그 외=에러)
devaddr 디바이스 주소 (7bit)
data() 수신 데이터를 저장할 Byte 배열
length 수신할 바이트 수

레지스터 주소 없이 데이터를 직접 읽습니다.

반환값이 필요 없는 경우, 함수형이 아닌 명령식으로 사용할 수 있습니다.

Dim rx(2) As Byte

I2creadraw &H50, rx(), 2

주의사항


예제 프로그램

I2C 디바이스는 내부 주소 길이에 따라 사용 방법이 달라집니다.

주소가 1바이트일 경우

이 경우 I2cwrite, I2cread 명령을 사용하면 내부 주소 전송이 자동 처리됩니다.

Dim tempi As Integer
Dim tx(1) As Byte
Dim rx(1) As Byte

tempi = 3

I2cstart 100

Do
    tx(0) = tempi And &HFF

    I2cwrite &H50, &H00, tx(), 1
    I2cread  &H50, &H00, rx(), 1

    tempi = tempi + 1

    Debug Dec rx(0), Cr
    Wait 500
Loop

내부 동작:

주소가 2바이트일 경우 (RAW 사용)

FRAM, EEPROM과 같은 메모리 디바이스는 주소가 2바이트인 경우가 많습니다. 이 경우 I2cwrite로는 처리할 수 없으므로 RAW 명령을 사용해야 합니다.

Dim tempi As Integer
Dim tx(3) As Byte
Dim addr(2) As Byte
Dim rx(1) As Byte

tempi = 3

I2cstart 100

Do
    tx(0) = &H00
    tx(1) = &H00
    tx(2) = tempi And &HFF

    I2cwriteraw &H50, tx(), 3

    addr(0) = &H00
    addr(1) = &H00

    I2cwriteraw &H50, addr(), 2
    I2creadraw  &H50, rx(), 1

    tempi = tempi + 1

    Debug Dec rx(0), Cr
    Wait 500
Loop

내부 동작:


에러 코드

함수형으로 사용하면 다음과 같은 코드가 반환됩니다.


I2C가 왜 필요한가요?

MCU(CUBLOC2)는 기본적으로 디지털 입력/출력, ADC, PWM 같은 기능을 가지고 있지만, 더 다양한 센서나 주변장치를 연결하려면 외부 칩과 통신해야 하는 경우가 많습니다.

I2C는 이런 외부 장치와 데이터를 주고받기 위한 간단한 직렬 통신 방식입니다.

I2C의 장점은 단 2개의 선(SDA, SCL)만으로 여러 장치를 동시에 연결할 수 있다는 점입니다. 예를 들어 아래와 같은 장치들이 I2C를 많이 사용합니다.

  1. 온도 센서
  2. 압력 / 습도 센서
  3. OLED / LCD 디스플레이
  4. 7 세그먼트 디스플레이
  5. RTC(실시간 시계)
  6. EEPROM / FRAM 메모리
  7. ADC / DAC 확장 칩
  8. IO 확장 칩 (입출력 포트 증가)

예를 들어 온도 센서를 연결한다고 가정하면:

온도센서 → 현재 온도값 읽기
OLED     → 현재 온도 표시
FRAM     → 온도 로그 저장

이런 여러 장치를 모두 같은 SDA/SCL 선에 연결하여 사용할 수 있습니다.

← CUBLOC2 목차로 돌아가기