[에이콘][요약] 임베디드 시스템 아키텍처 사물인터넷을 위한 임베디드 시스템의 기초 Chapter 7 - Local Bus Interface

Embedded June·2021년 8월 8일
0

Chapter 7. Local Bus Interface

이번 chapter에서는 대표적인 serial bus protocol인 UART, SPI, I2C에 대해 배운다.

프로토콜와이어 수Clock비트 순서통신 모드
UART2개 (TX/RX)비동기LSB1:1, 1:多
SPI3개 (MOSI/MISO/CLK)동기MSB/LSB1:1, 1:多
I2C2개 (SDA/SCL)동기MSB1:1, 1:多

7.1. UART (Universial Asynchronous Receiver/Transmitter)

  • Serial communication을 위해서는 receiver와 transmitter 사이에 반드시 clock 동기화가 이뤄져야 한다. 하지만, UART는 clock 신호를 통해 동기화를 하지 않고, 상호간에 정해진 전송속도(Baud Rate)를 통해 동기화를 구현한다.

(인간적으로 번역 진짜 너무할 정도라 이해가 전혀 안감. 추가 자료조사로 이 부분은 보충해야겠음.)

  • UART는 일반적으로 printf()를 통해 host PC로 디버깅 문구를 출력할 때 사용한다.
  • UART는 내부적으로 FIFO 형태 buffer를 사용해서 한 번에 하나 이상의 문자가 쓰여지지 않음을 보장한다. 이때 busy waiting이 발생할 수 있으므로 인터럽트 방식으로 구현하는 것이 cpu time을 낭비하지 않고 시스템 응답성을 유지하는 데 좋다.

7.2. SPI (Serial Peripheral Interface)

image-20210808175155306
  • Bus master의 clock 신호를 통한 동기화로 UART보다 빠르며 다수의 주변장치가 같은 버스를 공유할 수 있다.
  • SPI 통신의 일련의 과정은 다음과 같다.
    1. Master는 SPI_CLK을 활성화한다.
    2. Master는 SPI_MOSI에 명령어를 slave로 전송한다.
    3. Slave는 SPI_MISO로 데이터를 master로 전송한다.
  • Slave로 전송할 데이터가 더 없더라도, clock을 유지하기 위해 master는 slave에게 dummy bytes를 SPI_MOSI로 계속 보낸다. Slave는 이 dummy bytes를 무시한다.
image-20210808175633774
  1. Master는 SPI_CLK를 활성화한다.
  2. Master는 slave에게 0x8F라는 명령어를 SPI_MISO를 통해 보낸다. 이 명령어는 slave(가속도계)의 데이터를 읽는 명령어다. Master가 slave로부터 처음에 SPI_MOSI로 받은 데이터 0xFF는 slave의 dummy bytes로 무시한다.
  3. 명령을 받은 slave가 데이터를 준비하고, SPI_MOSI0x3B라는 데이터를 master에게 전송한다. 이때 master는 더 이상 보낼 데이터가 없으므로 slave에게 0xFF라는 dummy bytes를 SPI_MISO로 보냈지만, slave는 무시한다.
  • SPI 역시 UART처럼 내부 FIFO buffer를 사용하고, busy waiting을 막기 위해 인터럽트 방식을 사용하는 것이 좋다.

7.3. I²C (Inter-Integrated Circuit)

image-20210808194316337

I2C는 전송속도가 느린만큼 저전력 통신이 가능한 serial communication protocol이다. SPI와 공통점이 많지만, 고정 주소로 slave를 선택할 수 있기 때문에 I2C_SDA 핀 하나만으로 통신이 가능하다. 이 과정에 대해서는 후술한다.

I2C는 두 가지 핀을 가지고있다.

  1. I2C_SCL: master와 slave 사이에 동기화된 통신을 진행.
  2. I2C_SDA: Address와 명령 그리고 데이터와 ACK/NACK 신호를 주고받음.

I2C 프로토콜 상세는 다음과 같다.

image-20210808194343540

  1. START 조건

    • 전송의 시작을 알리는 특수 조건이다. SCLHIGH로 고정된 상태에서 SDAHIGH → LOW로 바뀌는 경우를 통신의 시작이라 간주한다.
  2. 1st frame - Address frame

    image-20210808195241037
    • 통신은 최소 두 가지 frame으로 구성되며, 첫 frame은 address frame이다.
    • Address는 slave 하나를 특정하는 주소이며 7bit로 구성돼있고, 끝에서 2번째 bit는 WRITE(0), READ(1)을 의미한다.
    • 마지막 ACK/NACK bit는 slave에 의해 결정되며 0이면 ACK, 1이면 NACK를 의미한다.
  3. 2nd frame - Data frame

    • READ 연산이라면, address에 매칭되는 slave가 데이터를 master에게 보낸다. 마지막에 master는 잘 받았다는 ACK 신호를 slave에게 보낸다.
    • WRITE 연산이라면, address에 매칭되는 slave에게 데이터를 보낸다. 마지막에 slave는 잘 받았다는 ACK 신호를 master에게 한 번 더 보낸다.
  4. END 조건

    • 전송의 끝을 알리는 종료 조건이다. SCLHIGH인 체로 SDALOW → HIGH로 바뀌면 I2C 통신의 종료를 의미한다.

image-20210808195528111

  • I2C의 가장 독특한 특징은 바로 slave의 clock stretching(클럭 늘리기)다.
  • Master가 특정 데이터를 요청했는데, slave가 무언가의 이유로 아직 그 데이터를 전송할 준비가 안됐다면, clock stretching을 사용해서 SCLLOW로 유지해서 트랜잭션을 의도적으로 폴링할 수 있다.
  • 하지만 master는 계속해서 SCLHIGH로 바꾸려고 시도할 것이기 때문에 결국 트랜잭션은 다시 재개(resume)된다.
  • 이때 slave가 데이터가 준비됐다면 데이터를 보내고 master는 ACK를,
    데이터가 준비되지 않았다면 master는 NACK 신호를 보내고 STOP 조건으로 통신을 종료한다.
  • I2C의 이 기능은 전송속도가 느린 주변기기와 통신을 할 때 아주 적절하고 중요하다.
profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글