이번 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)된다.