우선 ATmega328p의 Block Diagram을 보면서 전체적인 구조를 파악해보자.
여기서, AVR Core의 경우는 AVR CPU로 abstraction 되어 있다. 이 그림에서 중요한 것은 AVR의 주변기기(peripheral)이다. 아직 AVR을 처음 배우는 입장에서 뭔가 많은 peripheral이 있지만, 이럴수록 Top-Down 방식으로 차근차근 접근하는게 좋다. 우선 점선으로 표시된 부분 밖에서 오는 외부 신호에 주목해보면, 저번에 배웠던 내용을 복습할 수 있다.
- PD, PB, PC로 input ouput을 조절할 수 있다.
- RESET으로 clock block을 리셋시킬 수 있다.
- AVcc, AREF, ADC[6..7] 로 Analog Digital Converter에 전원을 공급하고, input output을 조절할 수 있다.
- XTAL은 PortB를 통해 보낼 수 있는 신호로, 외부 오실리에이터를 clock으로 받을 수 있다.
이제 세세한 모듈을 분석해보자. 우선 보이는것부터 보면,
AVR에서는 USART, SPI, TWI(=I2C) 방식의 통신 프로토콜을 모두 지원하는 모습을 볼 수 있다. UART는 PD, SPI는 PB, TWI는 PC를 통해서 통신하는 것 같다.
우선 USART는 Universal Synchronous/Asynchronous Receiver/Transmitter의 약자로, 범용 동기/비동기 송수신기를 의미한다. 동기식 통신은 별도의 clk 신호를 사용해서 데이터 전송의 타이밍을 맞춘 후에 통신을 시작하고, 비동기식 통신은 clk 신호가 없는 대신 시작 비트와 정지 비트를 사용해서 데이터를 전송한다. 우선 UART는 간단하지만 많은 것을 "미리" 정해놓아야 한다. 그 이유는 다음 그림을 통해 알 수 있다.
그림과 같이 통신의 시작을 알리는 START와 끝을 나타내는 STOP을 보내야 하는데, 이는 각각 falling edge와 rising edge로 detect할 수 있다. 그 이후, 비트를 보낼건데 문제는 어느 정도로 sampling을 해야할지를 전혀 모른다는 것이다! 예를 들어 TX 쪽에서 "0011"을 보낸다고 가정하자. 그런데 RX 쪽에서 두 배로 sampling한다면, 00001111이 되는 것이다. 따라서 이를 막기 위해 baud rate를 정해놓고, 추가로 데이터 프레임의 크기도 정해 놓아야 한다. stop signal이 1인데, 이게 데이터인지 stop signal인지 모르기 때문이다.
SPI통신은 동기식 통신 방식으로, 마스터가 제공하는 클럭(SCLK)을 통해 데이터 전송이 이루어진다. SCLK로 동기화하고, MOSI(master output slave input)을 통해 slave에 신호를 보내고, 이걸 slave가 받아서 MISO(master input slave output)을 통해 리턴 신호를 보내는 방식이다. 즉 master-slave 구조를 가지고 있다. 그런데 slave가 여러 개라면, 어떤 slave에게 지시를 보내는지 모른다. 왜냐하면 MOSI선은 하나(즉, 버스 구조)이기 때문이다. 따라서 slave를 구문하기 위해 SSn(Slave Select n)선을 추가로 연결해야 한다.
한편 I2C 통신은 SPI 통신의 단점을 보완하기 위해 만들어졌다. SPI 통신은 하나의 slave가 추가될 때마다 4개의 핀이 추가로 필요하다는 문제점이 생기고, MCU의 핀은 무한하지 않다. 따라서 이를 보완하기 위해 마스터가 clk을 제공하고,(SCL)이를 이용해 데이터를 송신+수신(SDA)하는 I2C 통신이 고안되었다.
I2C에서는 다수의 master가 다수의 slave와 묶여 있지만, 중요한 건 bus 상에서 하나의 master와 하나의 slave만 통신이 가능해야 한다. 따라서 지금 다른 통신이 일어나고 있지 않아서, 신호를 보낼 수 있는 상황인지 파악해야 한다는 점인데, 이를 Open-Drain 방식으로 해결한다.
base(사실 MOSFET에서는 gate임) 에서 input이 발생했을때 즉 high일 때, MOSFET에서는 gate와 source 사이에 전압차로 인해 전자의 길이 열리면서 drain->source로 전류가 발생한다. 따라서 drain에서 풀업 저항을 단다면, 핀에 찍히는 전압은 0, 즉 LOW가 될 것이다. 따라서 Open Drain이란, 정상 상태일 때 안정적으로 HIGH를 유지하다가, 신호를 주면 LOW가 되는 상태를 의미한다.
그러면 왜 Open Drain 방식으로 bus 내 신호를 sensing할 수 있을까? 예를 들어 다음과 같은 방식으로 풀업 저항이 연결된 Open Drain의 bus가 있다고 치면,
만약 어떤 master와 slave 간의 통신이 일어나면 핀 상태가 LOW가 될 것이므로, 이를 다른 master가 sensing할 수 있다. 이를 통해 하나의 bus에서 여러개의 마스터와 슬레이브가 안정적으로 통신할 수 있다. 일반적으로 모든 신호는 broadcasting 형식으로 통신한다고 보면 되고, 당연히 master가 특정 slave에 보내고, 나머지 slave는 내 신호가 아니라는 걸 알기 위해 SDA선에서 해당 slave의 주소를 보내야 하며, slave는 ACK신호를 보내서 통신할 준비가 되었음을 전송해야 한다. 이후 통신을 진해앟고, 최종적으로 마스터가 통신을 마치고 SCL을 HIGH 로 바꾸고 SDA 를 HIGH로 바꿈으로써 다른 master-slave가 통신할 수 있도록 한다.
이제 저장 장치를 보면,
위와 같이 물리적인 메모리로 EEPROM, Flash, SRAM을 기용함을 알 수 있다. 뒤 페이지의 설명에도 자세히 적혀있다.
EEPROM은 Electrically Erasable Programmable Read Only Memory로, 비휘발성 데이터를 가지고 있지만, 바이트 단위로 데이터를 지울 수 있어 소규모 데이터를 저장하는 데에 유용한 Read only memory이다.
Flash는 펌웨어나 코드 저장 등 대용량 데이터 저장에 사용되는 Read only memory이다. 실제로 datasheet에서도 본인들 flash memory가 좋다고 자랑하고 있다.
SRAM은 휘발성이 있지만, 고속으로 access가 가능해서 주로 cache로 사용되는 고성능 메모리이다.
이렇게 Overview를 통해서도 좋은 정보들을 알 수 있었다. ATmega328p는 임베디드에서 사용하는 유용한 통신 방식을 모두 사용하고, ADC block도 잘 만들어져 있어 다양한 좋은 프로젝트에 사용할 수 있겠다는 생각이 든다. 실제 임베디드 MCU를 선정할 때는 원하는 기능만 탑재된 MCU를 탑재하는 것이 좋다(대신 저렴한). 왜냐하면 임베디드의 알파이자 오메가는 원가절감이기 때문이다.
'Embedded SW > ATmega328p Datasheet' 카테고리의 다른 글
[Datasheet] 6. AVR CPU Core (0) | 2025.02.27 |
---|---|
[Datasheet] 1. Pin Configurations (0) | 2025.02.23 |
[Datasheet] 0. Datasheet는 최고의 과외선생이다. (0) | 2025.02.22 |