====== 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 목차로 돌아가기]]