이번 chapter에서는 대표적인 serial bus protocol인 UART, SPI, I2C에 대해 배운다.
프로토콜 | 와이어 수 | Clock | 비트 순서 | 통신 모드 |
---|---|---|---|---|
UART | 2개 (TX/RX) | 비동기 | LSB | 1:1, 1:多 |
SPI | 3개 (MOSI/MISO/CLK) | 동기 | MSB/LSB | 1:1, 1:多 |
I2C | 2개 (SDA/SCL) | 동기 | MSB | 1:1, 1:多 |
(인간적으로 번역 진짜 너무할 정도라 이해가 전혀 안감. 추가 자료조사로 이 부분은 보충해야겠음.)
printf()
를 통해 host PC로 디버깅 문구를 출력할 때 사용한다.SPI_CLK
을 활성화한다.SPI_MOSI
에 명령어를 slave로 전송한다.SPI_MISO
로 데이터를 master로 전송한다.SPI_MOSI
로 계속 보낸다. Slave는 이 dummy bytes를 무시한다.SPI_CLK
를 활성화한다.0x8F
라는 명령어를 SPI_MISO
를 통해 보낸다. 이 명령어는 slave(가속도계)의 데이터를 읽는 명령어다. Master가 slave로부터 처음에 SPI_MOSI
로 받은 데이터 0xFF
는 slave의 dummy bytes로 무시한다.SPI_MOSI
로 0x3B
라는 데이터를 master에게 전송한다. 이때 master는 더 이상 보낼 데이터가 없으므로 slave에게 0xFF
라는 dummy bytes를 SPI_MISO
로 보냈지만, slave는 무시한다.I2C는 전송속도가 느린만큼 저전력 통신이 가능한 serial communication protocol이다. SPI와 공통점이 많지만, 고정 주소로 slave를 선택할 수 있기 때문에 I2C_SDA
핀 하나만으로 통신이 가능하다. 이 과정에 대해서는 후술한다.
I2C는 두 가지 핀을 가지고있다.
I2C_SCL
: master와 slave 사이에 동기화된 통신을 진행.I2C_SDA
: Address와 명령 그리고 데이터와 ACK/NACK 신호를 주고받음.I2C 프로토콜 상세는 다음과 같다.
START 조건
SCL
은 HIGH
로 고정된 상태에서 SDA
가 HIGH → LOW
로 바뀌는 경우를 통신의 시작이라 간주한다.1st frame - Address frame
0
), READ(1
)을 의미한다.ACK/NACK
bit는 slave에 의해 결정되며 0
이면 ACK, 1
이면 NACK를 의미한다.2nd frame - Data frame
END 조건
SCL
은 HIGH
인 체로 SDA
가 LOW → HIGH
로 바뀌면 I2C 통신의 종료를 의미한다.SCL
을 LOW
로 유지해서 트랜잭션을 의도적으로 폴링할 수 있다.SCL
을 HIGH
로 바꾸려고 시도할 것이기 때문에 결국 트랜잭션은 다시 재개(resume)된다.