모든 I/O device (GPIO, UART, Timer...)는 크게 3가지 종류의 레지스터를 가지고 있다.
1. Configuration (or control, mode) Register
- UART을 통해 CPU와 노트북이 서로 데이터를 주고받는데. 정의해야 할 부분들이 있다. 가령 속도는 얼마로 할지
어떤 패킷 format을 사용할지와 같은 Configuration를 서로 정의해야 한다. 이런 정보가 Configuration register들에 들어있다. ex) control reg..
2. Data Register
- 데이터를 저장하는 레지스터이다. ex) TxFIFO, RxFIFO..
3. Status Register
- 상황에 따라 달리 세팅되어 동작을 관리한다. CPU는 이 레지스터를 읽어서 어떤 상태인지 확인하고 이에 따라 동작한다. 가령, Checksum bit 같은 것이 있다.
UART (Universal Asynchronous Receiver / Transmitter)
Asynchronous에서 볼 수 있듯이 clk이 존재하지 않는다. UART는 간단히 말해 병렬 데이터를 직렬 데이터로 변환하여 통신 시스템이다. 예를 들어 그림과 같은 선들을 말한다. 요즘은 대부분 USB로 대체됐다.
이때 통신 속도를 어떻게 할지 정하는데 이 속도를 Baud rate라고 부른다. 즉 bit rate다.
어떻게 통신하는지 간단히 예를 들어보자, Hello를 보낸다고 하면, UART에 있는 64byte에 하나하나의 char를 저장하고 하나의 byte를 뽑아서 bit단위로 전송한다. 이때의 bit는 6, 7 or 8bit 단위로 보낸다.
Packet format부터 보자. 8bit를 보낸다고 했을 때, 어떻게 전송할까? 비동기식이라 clk이 존재하지 않는다. 이에 명시적으로 시작과 끝을 알려줘야 한다. 시작 bit를 세팅하고 보낼 8bit 데이터를 보낸 다음 parity bit로 정확한 데이터가 왔는지 확인한다. 마지막으로 stop bit를 설정한다.
받았을 때 어떻게 확인할 수 있을까?? UART는 clk이 없이 통신하지만 내부에는 clk이 있다. 통신 속도의 약 16배에 달하는 clk이 이라고 한다면, 들어오는 신호 하나하나의 sampling을 거쳐서 어떤 데이터인지 알 수 있다. 16배라면 16번의 sampling을 진행한다. 내가 정하기 나름이다.
Baud rate
- 간단히 말해 하나의 문자(symbol)를 초당 얼마나 보내냐이다. 문자는 8bit로 이루어져 있기 때문에 bps / 8을 하여 계산한다.
50 MHz의 clk이 들어왔을 때의 목표가 115,200Hz의 출력을 발생하는 거라고 하자. 어떻게 계산할까??
sel_clk / CD * (BDIV + 1) = 115,200Hz로 계산할 수 있다
sel_clk은 50 MHz다. 하지만 CD와 BDIV를 조정해서 출력을 만들 수 있을까?? 수식적으로는 가능하다 115.200을 하기 위해선 CD = 62.004, BDIV = 6으로 한다면 말이다. 하지만 우린 integer를 사용하기 때문에 소수점을 표시할 수 없다.
이에 실제 CD = 62로 계산된다. 이때 결괏값은 115,207.37이라는 값이 나온다. 원하는 출력은 115,200인데 약 7.37이라는 에러가 발생한다. 확률은 0.0064의 확률로 발생한다는 의미다.
Data Register
- 먼저 종류에는 TxFIFO, RxFIFO가 있다. 간단히 말해 TxFIFO는 데이터를 전송할 때 쓰는 레지스터이고 RxFIFO는 데이터를 받을 때 사용하는 레지스터이다.
근데 신기하게 TxFIFO RxFIFO는 같은 주소를 사용한다 어떻게 가능할까?? 먼저 FIFO이니 같은 주소에 계속 업데이트하면 원래 있던 데이터는 옆으로 밀려나는 구조다. 이러니 하나의 주소만 가져도 무방하다. 또힌 AIX에서 control 신호를 보고 UART에서 어떤 레지스터를 선택할지 결정한다. AIX에서 어떤 레지스터를 선택할 건지, 어떤 데이터인지, 데이터를 받는 건지 보내는 건지 통제한다. AIX는 Arm에서 제공하는 통신 ptotocol이다. 어떻게 칩끼리 통신하는지 결정하는 것이다.
예를 들면, Hello를 보낸다고 했을 때, H가 있는 byte를 transmitter가 가져온다. H는 ASCII 코드로 48이라 48을 bit 단위로 쪼갠다. 그리고는 시작과 끝을 표시하여 bit by bit로 보낸다. 그러면 받는 PC에서 clk을 이용하여 sampling 하며 데이터를 수신한다.
이런 식으로 UART는 통신한다는 걸 알 수 있다.
'시스템 반도체 > Arm' 카테고리의 다른 글
Arm Interrupt & Exception ( 인터럽트, 예외, 차이점 ) (0) | 2022.05.31 |
---|---|
Arm Thumb ( blx, bx, Thumb2, IT명령어, if then ) (0) | 2022.04.26 |
Arm SWAP Instruction ( 메모리 접근, SWP, MESI protocol, LDREX, STREX ) (0) | 2022.04.07 |
Arm Memory Map ( 메모리 맵, 메모리 공간 분할, I/O ) (0) | 2022.04.07 |
Arm Memory Access instruction (메모리 접근 명령어, LDR, SRT, LDM, STM, Stack operation) (0) | 2022.04.07 |
댓글