검색결과 리스트
글
낸드으 플래시_1
Learning stuff
2012. 3. 13. 10:48
낸드 플래시 메모리는 주로 대용량 자료를 deal with 할떄 쓰인다.
우선 낸드 플래시는 바이너리 데이터를 가지고 있다고 하더라도 자체에서 실행이 안된다. 그러면 어떻게 해주냐 Main binary를 SDRAM 으로 복사를 하고 난 후 SDRAM 에서 돌아간다는거.... 그러면 이 복사는 또 누가 해주냐 그건 부트로더(Boot loader)가 해 줍니다. 그래서 낸드 플래시로 지원 해 주는 임베디드 시스템을 들여다 보면 보통 낸드 플래시 부트로더와 internal RAM 이 함께 있게 된다는거. 즉 임베디드를 ON 해주면 Flash에 있는 부트 로더를 internal RAM으로 자동 복사 해 주고 그 안에서 로드된 부트 로더가 나머지 일을 해 줍니다.
그렇다면 낸드 플레시는 왜 위와 같은 스펙을 가지게 되었는것인가... NOR 와는 달리!
제가 Orcad로 Nand flah 가 mount 된 딤형태의 머시기 그 .... 여튼 그런걸 제작할때도 그렇던데 얘는 Address 를 안 쓰더라고요. 즉 노어 플래시와 에스디램은 주소를 표현하기 위해서 시피유와 메모리 사이에 데이터와 어드레스 라인을 연결하지만 낸드 플래시는 데이터 라인과 어드레스 라인을 연결하지 않아요. 그리고 그만큼의 space도 줄일 수 있겠지요.
위와 같이 만드니까 작아져서 크기도 줄일 수 있고 라인도 몇개 연결 안되니 간단하고 용량까지 훨씬 크고 또한 중요한건 얘가 단가가 싸다는거.... 그니까 대충 어떤 스타일인지 감이 잡힌다. 대용량용(?)이라 해야되나
낸드 플레시 컨트롤러를 간단히 정리 해 보자면 다음과 같아요
page -> block -> plane -> device 순이지요
읽기 쓰기는 page단위로, 지우기는 block 단위로 동작을 합니다. 그래서 낸드 플레시는 노어와는 달리 배드 블럭 처리를 해 줘야 해요. 베드 블럭 처리는 일반적으로 XSR 방식으로 해 줍니다. 아 참 배드 블럭이란 그냥 쉽게 말해서 고장난 블럭 부분을 찾아내서 씨피유한테 가르쳐 주는 거에요.
그리고 지우기 동작
지우기 동작은 ALE 로 주소를 주고(참고로 낸드는 주소가 없으니 낸드 플래시 컨트롤러에 죠야 합니다) 다음과 같이 두 싸이클에 통해서 명령어가 들어가게 되어 있어요.
그리고 낸드 플래시의 페이지 정보를 주기 위해서는 3사이클이 필요 하네요.
페이지 정보는 2번째 3번째 사이클에서 정해 진다고 하니 명령어 2번 페이지 정보 2번 총 4번의 동작을 하면 됩니다.
하드웨어 디버거로 동작하는건 잘 모르겠고
씨 프로그램으로 구현을 하면 다음과 같네여
#define NFCMD *(volatile unsigned char *)(0x4E000004)
#define NFADDR *(volatile unsigned char *)(0x4E000008)
#define NFDATA *(volatile unsigned char *)(0x4E00000C)
#define NFSTAT *(volatile unsigned char *)(0x4E000010)
#define NFEnable() *(volatile unsigned long *)(0x4E000000) &= ~(1<<11)
#define NFDisable() *(volatile unsigned long *)(0x4E000000) |= (1<<11)
#define CMD_READ0 0x00
#define CMD_READ1 0x01
#define CMD_READ2 0x50
#define CMD_BLOCK_ERASE 0x60
#define CMD_READ_STATUS 0x70
void erase (void)
{
우선 낸드 플래시는 바이너리 데이터를 가지고 있다고 하더라도 자체에서 실행이 안된다. 그러면 어떻게 해주냐 Main binary를 SDRAM 으로 복사를 하고 난 후 SDRAM 에서 돌아간다는거.... 그러면 이 복사는 또 누가 해주냐 그건 부트로더(Boot loader)가 해 줍니다. 그래서 낸드 플래시로 지원 해 주는 임베디드 시스템을 들여다 보면 보통 낸드 플래시 부트로더와 internal RAM 이 함께 있게 된다는거. 즉 임베디드를 ON 해주면 Flash에 있는 부트 로더를 internal RAM으로 자동 복사 해 주고 그 안에서 로드된 부트 로더가 나머지 일을 해 줍니다.
그렇다면 낸드 플레시는 왜 위와 같은 스펙을 가지게 되었는것인가... NOR 와는 달리!
제가 Orcad로 Nand flah 가 mount 된 딤형태의 머시기 그 .... 여튼 그런걸 제작할때도 그렇던데 얘는 Address 를 안 쓰더라고요. 즉 노어 플래시와 에스디램은 주소를 표현하기 위해서 시피유와 메모리 사이에 데이터와 어드레스 라인을 연결하지만 낸드 플래시는 데이터 라인과 어드레스 라인을 연결하지 않아요. 그리고 그만큼의 space도 줄일 수 있겠지요.
위와 같이 만드니까 작아져서 크기도 줄일 수 있고 라인도 몇개 연결 안되니 간단하고 용량까지 훨씬 크고 또한 중요한건 얘가 단가가 싸다는거.... 그니까 대충 어떤 스타일인지 감이 잡힌다. 대용량용(?)이라 해야되나
낸드 플레시 컨트롤러를 간단히 정리 해 보자면 다음과 같아요
ALE
- Address Latch Enable
- 낸드의 몇번째 페이지인지 알려주기 위해서 필요
CLE
- Command Latch Enable
- Erase, Read, Write 같은 command를 보내기 위해서 필요
RE
- Read Enable
CE
WE
- Write Enable
근데 주소가 없으면 데이터에 어떻게 접근을 할까??
낸드 플래시는 주소를 표현할 때 블럭으로 표시를 해줍니다. 블럭은 작은 페이지로 이루어 져 있고 한 페이지는 각각 256byte 2Kbyte 4Kbyte 짜리로 나눌 수 있습니다.
page -> block -> plane -> device 순이지요
읽기 쓰기는 page단위로, 지우기는 block 단위로 동작을 합니다. 그래서 낸드 플레시는 노어와는 달리 배드 블럭 처리를 해 줘야 해요. 베드 블럭 처리는 일반적으로 XSR 방식으로 해 줍니다. 아 참 배드 블럭이란 그냥 쉽게 말해서 고장난 블럭 부분을 찾아내서 씨피유한테 가르쳐 주는 거에요.
그리고 지우기 동작
지우기 동작은 ALE 로 주소를 주고(참고로 낸드는 주소가 없으니 낸드 플래시 컨트롤러에 죠야 합니다) 다음과 같이 두 싸이클에 통해서 명령어가 들어가게 되어 있어요.
그리고 낸드 플래시의 페이지 정보를 주기 위해서는 3사이클이 필요 하네요.
페이지 정보는 2번째 3번째 사이클에서 정해 진다고 하니 명령어 2번 페이지 정보 2번 총 4번의 동작을 하면 됩니다.
하드웨어 디버거로 동작하는건 잘 모르겠고
씨 프로그램으로 구현을 하면 다음과 같네여
#define NFCMD *(volatile unsigned char *)(0x4E000004)
#define NFADDR *(volatile unsigned char *)(0x4E000008)
#define NFDATA *(volatile unsigned char *)(0x4E00000C)
#define NFSTAT *(volatile unsigned char *)(0x4E000010)
#define NFEnable() *(volatile unsigned long *)(0x4E000000) &= ~(1<<11)
#define NFDisable() *(volatile unsigned long *)(0x4E000000) |= (1<<11)
#define CMD_READ0 0x00
#define CMD_READ1 0x01
#define CMD_READ2 0x50
#define CMD_BLOCK_ERASE 0x60
#define CMD_READ_STATUS 0x70
void erase (void)
{
row = theParam->start_addr;
len=theParam->size>>14;
NFEnable();
NFCMD = CMD_BLOCK_ERASE;
NFADDR = (row >> 9) & 0xFF;
NFADDR = (row>>17)&0xFF;
NFCMD = 0xD0;
}
ㅇ
'Learning stuff' 카테고리의 다른 글
schmitt trigger (0) | 2012.04.11 |
---|---|
Monostable (0) | 2012.03.24 |
SDK axi_timer_ds764 (0) | 2012.03.05 |
Bypass Capacitor (0) | 2012.02.07 |
Mutual Information (0) | 2012.02.07 |