본문 바로가기
WORK/HARDWARE

NAND 플래시의 구성

by KANG Stroy 2008. 6. 8.
728x90
728x90
NAND 플래시의 구성
삼성전자가 제공하는 매뉴얼을 보면 NAND 플래시의 내부 구성도는 <그림 4>와 같다.

<그림 4>를 보면 NAND 플래시 메모리의 주소를 대입하여야 데이터를 읽고 쓸 수 있다. 하지만 외부와 연결된 I/O 버스는 플래시 메모리 블럭과 직접 연결되어 있지 않고 여러 버퍼를 통해서 읽고 쓴다. 그래서 페이지 단위로 읽고 쓸 수 있는 구조로 구성된다. 하지만 구성도를 가지고 플래시 메모리를 설명하기에는 너무 어렵기 때문에 하나의 블랙박스로 보고 NAND를 접근하는 것이 더 편하다.
또한 NAND 플래시를 다루기 위해서는 ‘페이지(읽고 쓰기를 수행하기 위한 단위)’라는 개념과 ‘블럭(지우기를 수행하기 위한 단위)’이라는 개념에 익숙해져야 한다. NAND 플래시에서는 데이터를 읽거나 쓰기 위해서는 페이지 단위로 써넣거나 읽을 수 있다. 1페이지는 528바이트 단위의 크기를 갖는다. 이 페이지는 다시 크게 세 영역으로 나뉜다. A, B, C 영역이라고 하는데, A 영역은 256바이트, B 영역은 256바이트, 그리고 C 영역이 16바이트의 크기를 갖는다.

 
블럭은 NAND 플래시를 지울 때의 크기 단위로 32개의 페이지를 하나의 블럭으로 본다. 블럭의 구성은 <그림 6>과 같다. 또한 플래시 메모리는 블럭이 모여서 전체 메모리 시스템을 구성한다. 그러므로 플래시 메모리를 <그림 7>과 같은 형태로 정리해 볼 수 있다.

NAND 플래시와 NOR 플래시를 다루는 개념은 거의 같다. 지난 호에서 설명했지만 플래시 메모리를 처리하기 위한 내용을 다시 정리하면 플래시 메모리 ID읽기, 지우기, 쓰기, 읽기로 나눌 수 있다. 이 처리에 대한 소스의 구현이 되어야 NAND 플래시의 기본적인 처리가 가능하다. 이지부트에서 이를 위해 구현한 소스는 include/nand.h와 main/nand.c에 들어 있다. 이 소스를 분석하면서 NAND에 대한 처리를 이지부트에서 어떻게 구현하였는가를 차근차근 살펴보자.

NAND 플래시의 명령
NOR형 플래시와 마찬가지로 NAND형도 무언가의 처리를 하려면 명령을 주어야 한다. NAND형 플래시에서 사용하는 대표적인 명령은 다음과 같다.

◆ ID 읽기 명령 0x90
◆ 상태 읽기 명령 0x70
◆ 지우기 셋업 명령 0x60
◆ 지우기 실행 명령 0xD0
◆ 쓰기 시작 명령 0x80
◆ 쓰기 실행 명령 0x10
◆ A 영역 선택 및 읽기 명령 0x00
◆ B 영역 선택 및 읽기 명령 0x01
◆ C 영역 선택 및 읽기 명령 0x50

이 명령에 대한 자세한 설명은 이후에 다시 한번 설명될 것이다. 이 명령을 선언하기 위해서 이지부트 소스의 include/nand.h에서는 다음과 같이 선언하고 있다(이 명령은 단독으로 쓰이지 않고 각 명령에 따른 구성이 별도로 존재한다. 각 명령에 대한 것은 이지부트 소스를 참고하면서 살펴보기로 한다).

#define NAND_CMD_READ_ID 0x90 // ID 읽기 커맨드
#define NAND_CMD_READ_STATE 0x70 // 상태 읽기 커맨드
#define NAND_CMD_ERASE_SETUP 0x60 // 지우기 셋업 커맨드
#define NAND_CMD_ERASE_RUN 0xD0 // 지우기 실행 커맨드
#define NAND_CMD_WRITE_START 0x80 // 쓰기 시작 커맨드
#define NAND_CMD_WRITE_RUN 0x10 // 쓰기 실행 커맨드
#define NAND_CMD_READ_A 0x00 // A 영역 읽기
#define NAND_CMD_READ_B 0x01 // B 영역 읽기
#define NAND_CMD_READ_C 0x50 // C 영역 읽기

EZ-X5에서 하드웨어 제어 구성
NAND 플래시에 특정 처리를 하려면 다음과 같은 순서를 갖는다.

① 칩 셀렉터인 CE 신호를 LOW 상태로 만든다.
② 명령을 NAND 플래시에 써넣는다.
③ NAND 내부의 접근하고자 하는 주소를 써넣는다.
④ NAND에 데이터를 써넣거나 읽는다.
⑤ NAND의 상태를 감시한다.
⑥ 칩 셀렉터인 CE 신호를 HIGH 상태로 만든다.

이 순서에 따른 처리를 소프트웨어적으로 접근했을 때 하드웨어에서도 자동으로 수행하도록 EZ-X5는 다음과 같은 주소를 각 신호선에 맵핑하고 있다.

◆ 0x04000000 : CE 신호를 LOW로 만든다.
◆ 0x04000100 : CLE 신호를 HIGH로 만든다.
◆ 0x04000200 : ALE 신호를 HIGH로 만든다.
◆ 0x04000300 : CE 신호를 HIGH로 만든다.

각 번지의 의미를 정확하게 살펴보자. NAND 플래시에서 CE 신호는 원칙적으로 NAND 플래시에 접근했을 때만 LOW로 처리하여야 한다. 그런데 앞에서도 설명했지만 실제로 사용하면 프로세서 버스와 분리시키는 버퍼를 사용하고, NAND 플래시에 대한 접근이 시작될 때부터 CE를 LOW로 만든 후에 모든 처리가 끝나면 CE를 다시 HIGH 신호 상태로 만드는 것이 유리하다. 그래서 EZ-X5에서는 이를 CPLD 회로를 이용하여 구현하고 있다.
이때 CE 신호와 연관된 주소가 바로 0x04000000과 0x04000300이다. 0x04000000 번지를 읽거나 쓰면 CE 단자는 LOW 상태가 되고 유지된다. 반대로 0x04000300 번지에 데이터를 읽거나 쓰면 CE 단자는 HIGH 상태가 되고 유지된다. 소프트웨어 프로그래머 입장에서 보면 0x04000000 번지는 NAND 플래시를 이제부터 사용하겠다고 알려주는 번지가 되고, 0x04000300은 NAND 플래시를 더 이상 사용하지 않겠다고 알려주는 번지로 이해하면 된다. 이 중에서 0x04000000 번지는 데이터를 써넣거나 읽기 용도로도 사용되도록 하드웨어적으로 구성되어 있다.
NAND 플래시 메모리는 일반적인 데이터만 써넣고 읽는 것이 아니라 처리하고자 하는 명령과 접근하고자 하는 메모리의 주소를 써넣어 주어야 한다. 데이터 포트를 NAND 플래시가 공유하기 때문에 NAND 플래시에 써넣은 데이터가 명령으로 인식되기 위해서는 CLE 단자를 HIGH로 만들어 주어야 한다. 이런 처리를 한꺼번에 할 수 있도록 하드웨어적으로 맵핑시킨 주소가 0x04000100이다. 즉 0x04000100 번지에 데이터를 써넣으면 NAND 플래시는 데이터를 명령으로 인식하게 된다.
이와 마찬가지로 데이터를 주소로 인식시키기 위해서는 ALE 단자를 HIGH로 만들어 주고 데이터를 써넣어야 한다. 이런 처리를 한꺼번에 할 수 있도록 하드웨어적으로 맵핑시킨 주소가 0x04000200이다. 즉 0x04000200 번지에 데이터를 써넣으면 NAND 플래시는 데이터를 주소 데이터로 인식하게 된다. 이와 같은 주소를 소프트웨어적으로 처리하기 위해서 이지부트는 include/nand.h에 다음과 같은 매크로를 선언하고 있다.

#define NAND_ACCESS_START *((volatile short *)(NandDev->BaseAddress + 0x000 ))
#define NAND_DATA *((volatile short *)(NandDev->BaseAddress + 0x000 ))
#define NAND_CMD *((volatile short *)(NandDev->BaseAddress + 0x100 ))
#define NAND_ADDR *((volatile short *)(NandDev->BaseAddress + 0x200 ))
#define NAND_ACCESS_END *((volatile short *)(NandDev->BaseAddress + 0x300 ))

이 매크로에서 사용하는 NandDev->BaseAddress가 굳이 사용되는 이유는 NAND 플래시 메모리가 여러 개 사용될 수도 있기 때문에 동일한 소스를 이용하여 처리 가능하도록 하기 위한 것이다. EZ-X5에는 기본적으로 NAND 플래시가 생산시에 1개만 장착되기 때문에 NandDev->BaseAddress 값은 0x04000000이 된다. 
728x90

'WORK > HARDWARE' 카테고리의 다른 글

BT_core  (0) 2008.06.09
블루투스 약어  (0) 2008.06.09
AVR 128 쪽 보드 회로도  (0) 2008.06.09
RAM의 종류  (0) 2008.06.08
반도체 메모리의 종류와 제조과정  (0) 2008.06.08

댓글