====== I2C ======
CUBLOC2에 있는 I2C 전용 포트를 통해 외부 센서 및 메모리 디바이스등과 데이터를 송수신할 수 있습니다.
* P36 : SDA
* P37 : SCL
==== 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
----
==== 주의사항 ====
* ''devaddr''는 반드시 **7bit 주소**를 사용해야 합니다.
* 데이터시트에 표시된 8bit 주소(예: 0xA0, 0xA1)는 사용할 수 없습니다. 예: 0xA0 → 0x50으로 변환하여 사용합니다.
----
==== 예제 프로그램 ====
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
내부 동작:
* Write : devaddr → regaddr → data
* Read : devaddr → regaddr → (Restart) → data 읽기
=== 주소가 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
내부 동작:
* Write : devaddr → addr High → addr Low → data
* Read :
* devaddr → addr High → addr Low
* (Restart) → data 읽기
----
==== 에러 코드 ====
함수형으로 사용하면 다음과 같은 코드가 반환됩니다.
* 0: 성공
* 2: 유효하지 않은 7비트 장치 주소
* 3: 유효하지 않은 데이터 포인터 또는 길이
* 4: I2C 채널이 초기화되지 않음 (I2cstart를 먼저 호출하십시오)
* 6: 전송 바이트 수 불일치
----
===== I2C가 왜 필요한가요? =====
MCU(CUBLOC2)는 기본적으로 디지털 입력/출력, ADC, PWM 같은 기능을 가지고 있지만, 더 다양한 센서나 주변장치를 연결하려면 외부 칩과 통신해야 하는 경우가 많습니다.
I2C는 이런 외부 장치와 데이터를 주고받기 위한 **간단한 직렬 통신 방식**입니다.
I2C의 장점은 단 2개의 선(SDA, SCL)만으로 여러 장치를 동시에 연결할 수 있다는 점입니다. 예를 들어 아래와 같은 장치들이 I2C를 많이 사용합니다.
- 온도 센서
- 압력 / 습도 센서
- OLED / LCD 디스플레이
- 7 세그먼트 디스플레이
- RTC(실시간 시계)
- EEPROM / FRAM 메모리
- ADC / DAC 확장 칩
- IO 확장 칩 (입출력 포트 증가)
예를 들어 온도 센서를 연결한다고 가정하면:
온도센서 → 현재 온도값 읽기
OLED → 현재 온도 표시
FRAM → 온도 로그 저장
이런 여러 장치를 모두 같은 SDA/SCL 선에 연결하여 사용할 수 있습니다.
[[..:index|← CUBLOC2 목차로 돌아가기]]