한국어
Embedded
 

소프트웨어로 GPIO핀을 직접 조작하여 특정 직렬통신 프로토콜을 구현하는 것을 Bit-bang (비트뱅)이라고 한다. 여러가지 이유로 전용 (회로)하드웨어 블럭을 사용할 수 없을 때 이런 방법을 사용한다.

예를 들어 CPU가 I2C 회로 블럭에 "이 데이터를 I2C로 보내" 또는 "I2C로 온 데이터를 알려줘"같은 전용 I2C 기능(회로)의 하드웨어가 하던일을 I2C(비트뱅)에서 CPU가 클럭을 제어하여 데이터를 송수신하는 것을 소프트웨어로 구현한다. 전용 회로를 사용하지 않기 때문에 소프트웨어 개발자의 수고가 필요할 수 있다.

하지만 리눅스에는 I2C bitbang 드라이버가 함께 제공된다. 또한 Python이나 C 언어로 I2C bitbang 드라이버를 사용하지 않고 직접 GPIO 조작하여 실현하는 라이브러리도 있다.

Raspberry Pi에서 Linux Kernel 드라이버를 사용하여 I2C bitbang 으로 통신

드라이버 활성화

먼저 /boot/config.txt을 편집하여 드라이버를 활성화한다. Device Tree의 오버레이 기능을 이용한다. 파일 끝에 다음 줄을 추가한다.

dtoverlay=i2c-gpio,bus=11,i2c_gpio_sda=23,i2c_gpio_scl=24

여기서 bus=는 I2C 버스 번호, i2c_gpio_sda=는 SDA GPIO 핀, i2c_gpio_scl=는 SCL GPIO 핀 번호를 지정한 것이다. 버스 번호가 없으면 자동으로 번호가 지정된다. 여기에서는 I2C 버스 11, GPIO 23, 24를 지정했다.

지정한 것은 핀 헤더의 번호가 아니라 GPIO의 번호라는 것에 주의하자.

I2C, UART, SPI 등을 사용하도록 설정한 경우에는 같은 핀은 피하도록한다. 예를 들어 UART를 활성화하면 GPIO 14, GPIO15를 사용할 수 없다.

파일을 저장한 후 Raspberry Pi를 다시 시작한다.

동작 확인 방법

Linux Kernel의 I2C bitbang 드라이버가 활성화되면 /dev/i2c-xx장치 파일을 사용할 수 있다. 다음 명령으로 확인할 수 있다.

ls /dev/i2c*
/dev/i2c-1 /dev/i2c-11

여기에서는 전용 하드웨어 I2C도 활성화되어 있기 때문에 두 개의 I2C 버스를 볼 수 있다. /dev/i2c-1하드웨어 I2C, 다른 하나는 I2C bitbang 소프트웨어 I2C다. 버스 번호 11을 지정했기 때문에  i2c-11로 되어있다.

리눅스에서 디바이스 드라이버를 직접 구현해야하는 경우 도움이 될 수 있는 내용을 다음 링크에서 찾을 수 있다.
https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-gpio.c
https://embetronicx.com/tutorials/linux/device-drivers/i2c-bus-driver-real-2/