ATmega128 SPI W25Q64 EEPROM 제어하기 -1

2019. 7. 14. 01:30임베디드/ATmega128

SPI 방식의 EEPROM을 제어해보려고 한다. SPI는 고속의 데이터 전송을 위한 직렬 통신 방법 중 하나로 마스터-슬레이브 구조를 통해 1:n 연결이 가능하다는 점 외에도 UART 통신에 비해 여러 가지 장점이 있다. 하지만 SPI는 고속의 1:n 통신을 위해 4개의 연결선과 더불어 슬레이브 장치의 수에 비례하여 연결선의 개수가 증가하는 단점도 있다

 

 

그림에서 보듯이, SPI 연결은 총 4개의 연결선을 필요로 한다. SCK는 직렬 클록으로 SPI가 동기 전송 방식을 사용하므로 동기화를 위한 클록 전송에 사용한다. MOSI는 Master Out Slave In의 약자로 마스터 장치에서 슬레이브 장치로 데이터를 전송하기 위해 사용하며, 반대로 MISO는 Master In Slave Out으로 슬레이브 장치에서 마스터 장치로 데이터를 전송하기 위해 사용한다. SS는 Slave Select 핀으로 여러 개의 슬레이브 장치 중 마스터 장치가 데이터를 주고받을 슬레이브 장치를 선택하게 된다. 선택되지 않은 슬레이브 장치의 SS는 HIGH 상태로 놓고, 선택할 장치는 LOW로 놓게 된다. 그래서 SS의 상태에 따라서 연결할 슬레이브 장치가 결정되게 된다. 따라서 슬레이브 장치의 수가 늘어나면 SS 라인의 수가 역시 증가하게 된다

 

SPI의 데이터 전송은 항상 동시에 일어난다는 특징이 있다. UART 통신에서도 송신과 수신이 동시에 일어날 수 있지만, 항상 그런 것은 아니다. SPI는 동기 방식으로 클럭을 알 수 없다면 데이터 전송이 되지 않는다. 따라서 클럭은 마스터에서 내보내므로 슬레이브가 원할 때 데이터를 전송시킬 수 없다. 따라서 이와 같은 동기화의 문제점을 해결하기 위해 SPI에서는 항상 송신과 수신이 동시에 이뤄진다

 

 

SPI의 마스터와 슬레이브 장치의 데이터 버퍼는 다음과 같이 원형 큐 자료구조를 이루고 있다. 클럭 하나당 데이터들이 한 번씩 Shift 되게 된다. 총 8개의 클럭이 발생하면 마스터 장치의 1바이트 데이터를 슬레이브 장치로 전달하고, 슬레이브 장치의 1바이트 데이터는 마스터 장치로 전달하여 서로 1바이트의 데이터를 교환하는 결과를 얻을 수 있다

 

 

위의 설명에서 알 수 있듯 클럭의 역할이 매우 중요하다. SPI에서는 총 4개의 모드의 클럭에 따라서 데이터 비트 중앙에서 한 번의 샘플링을 통해 데이터를 받게 된다. UART의 경우 비동기적으로 데이터를 전송하므로, 한 비트의 데이터를 확인하기 위해 여러 번의 샘플링을 거쳐 실제 전송된 데이터를 파악했다(Baud Rate 계산 시 '16'으로 나눈 이유가 16번 샘플링을 하겠다는 의미) 

 

위의 그림에는 4개의 클럭 모드를 제공하는데 슬레이브 장치에 따라서 설정이 달라질 수 있다

CPOL: SPI 버스가 Idle 상태일 때의 클록 값을 결정한다. CPOL=0이면 비활성화 상태일 때, SCK는 LOW값을 가지며, CPOL=1이면 비활성화 상태일 때, SCK는 HIGH값을 가진다

CPHA: 데이터를 샘플링하는 시점을 결정한다. CPHA=0이면, 데이터는 비활성화 상태에서 활성 상태로 바뀌는 에지에서 샘플링하고, CPHA=1은 데이터는 활성 상태에서 비활성화 상태로 바뀌는 에지에서 샘플링한다

 

EEPROM은 기본적으로 바이트 단위의 읽기와 쓰기다. 읽기는 읽기에 대한 8비트 명령어를 전송하고, 이후에 읽을 EEPROM의 8비트 주소를 전송한다. 동기화를 위해 MCU에서도 임의의 8비트 값을 슬레이브 장치에 전달해야 한다. 쓰기를 위해선 Write Enable 명령어를 전송하여 쓰기가 가능하도록 설정해야 한다. 그 다음은 읽기 명령과 비슷하다. 다음은 바이트 크기의 읽고 쓰는 EEPROM 소스다

 

 

25LC EEPROM은 한 바이트를 읽고 쓰는데 5ms의 시간이 걸려 대용량의 데이터를 전달하는데 느리다는 단점이 있다. 이를 개선할 수 있는 방법이 페이지 단위로 데이터를 기록하는 방법이다. 보통은 주소 1바이트, 데이터 1바이트로 전달했지만, 한 번 주소를 지정하고 나면 지원되는 페이지 크기만큼 데이터를 연속적으로 전송하여 데이터를 저장할 수 있다. 단 페이지는 지정된 구간에서만 동작되며, 범위를 벗어나서 다른 페이지에 기록되지 않는다. 다음 코드는 16바이트의 데이터를 하나의 페이지로 단위로 기록되는 EEPROM에서 쓸 때의 코드다

 

 

이제 사용하려는 w25Q64의 데이터시트를 확인해보면 최대 SCK가 나오며, 현재 ATmega128의 클럭 주파수보다 크므로 따로 분주는 설정하지 않을 것이다

 

 

아래 그림은 EEPROM에 있는 Status Register 중 하나로 쓰기 대기 모드의 플래그로 사용될 것이다

 

다음은 제조자 ID와 장치 ID에 대한 정보다. 실습을 통해 이 정보들이 정상적으로 읽히는지 확인할 것이다

 

 

다음은 EEPROM 레지스터에 대한 설명이다