■ I2C: Inter-Integrated Circuit
데이터가 메세지 형태로 전송된다.
Serial data (SDA)와 Serial Clock(SCL)의 두 가지 선이 필요하다.
- 라즈베리파이에서는 각각 2번, 3번이다.
2개의 선만 사용한다는 점과, ack를 사용해 성공적인 수신 확인을 받을 수 있다는 점이 장점.
spi보다 느리고 복잡하며, 데이터 프레임이 8비트로 제한된다는 점이 단점이다.
■ 통신 방법
(1) 시작 조건을 전송한다.
- SCL이 High일 때 SDA가 High에서 Low로 변한다.
(2) 각 슬레이브에게 주소 데이터를 전송한다.
(3) 본인의 주소라면 data를 통해 ack를 전송한다. 1비트 low값이다.
(4) 해당 슬레이브로 데이터를 전송한다.
(5) 마찬가지로 데이터 전송 성공 여부에 따라 ack를 전송한다.
(6) 종료 조건을 전송한다.
- SCL이 High일 때 SDA가 Low에서 High로 변한다.
try:
bus.read_byte(address)
print("PCF8591 모듈이 제대로 연결되었습니다.")
except:
print("PCF8591 모듈이 연결되지 않았거나, 잘못된 주소를 사용하고 있습니다.")
------------------------------------------------------------------------------------------------------------------------------
--->>> 예제 : 데이터 송신 I2C_read-write.py <<<-----------------------------------------
import smbus2
import time
# I2C 버스 설정 (대부분의 라즈베리 파이 모델은 1)
bus = smbus2.SMBus(1)
# 센서/기기의 I2C 주소
DEVICE_ADDRESS = 0x48
# 데이터 쓰기 (주소 0x01에 0xFF 데이터 전송)
bus.write_byte_data(DEVICE_ADDRESS, 0x01, 0xFF)
time.sleep(0.1)
# 데이터 읽기 (주소 0x00에서 1바이트 읽기)
data = bus.read_byte_data(DEVICE_ADDRESS, 0x00)
print(f"Read data: {hex(data)}")
# 블록 데이터 읽기 (연속된 여러 바이트)
# block = bus.read_i2c_block_data(DEVICE_ADDRESS, 0x00, 2)
# print(f"Block data: {block}")