한국어
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/

번호 제목 글쓴이 날짜 조회 수
52 Rockchip VOP makersweb 2024.04.22 57
» Raspberry Pi에서 I²C 그리고 Bit-bang (비트뱅) makersweb 2023.08.27 472
50 Yocto 프로젝트 3.4 릴리스(honister) 이상 버전으로 마이그레이션 시 참고 사항 makersweb 2023.03.21 938
49 Raspberry Pi 와 ATtiny85 간 I²C 통신 file makersweb 2023.03.18 432
48 로직분석기와 함께 PulseView 를 사용해서 CAN 신호 캡쳐 file makersweb 2023.03.16 611
47 임베디드 개발자를 위한 Hex,Bin,Dec 변환기 유틸 file makersweb 2023.02.27 1117
46 ATtiny85 개발보드(HW-260) file makersweb 2023.01.02 446
45 플랫폼 디바이스 및 디바이스 트리 makersweb 2021.03.20 3961
44 Android 기기를 사용하여 Raspberry Pi SD 카드 작성 방법 file makersweb 2020.08.01 984
43 Raspberry Pi 의 프레임버퍼(Framebuffer)구성 makersweb 2020.05.15 1812
42 라즈베리파이2에서 RTOS기반 GPIO제어(LED) file makersweb 2020.04.21 1629
41 POSIX를 지원하는 오픈소스 RTOS, RTEMS file makersweb 2020.04.15 1713
40 라즈베리파이 부팅 가능한 sd카드 파티션 생성 makersweb 2020.04.15 1703
39 플랫폼 디바이스 및 드라이버에 대해서 makersweb 2020.02.01 6237
38 디바이스 트리(Device Tree, DT) makersweb 2020.01.12 5531
37 RISC-V : 자유롭고 개방 된 RISC 명령어 세트 아키텍처 [2] file makersweb 2020.01.01 1010
36 임베디드 비대칭 멀티 프로세싱(asymmetric multiprocessing) 시스템 file makersweb 2019.12.31 939
35 임베디드 시스템에서 베어메탈(Bare metal) 이란? makersweb 2019.12.11 3318
34 HelloWorld 커널 모듈과 yocto 레시피 추가 방법 file makersweb 2019.12.09 5615
33 ESP32 블루투스 스피커(A2DP Sink) file makersweb 2019.10.29 3497