오늘은 들어가는 잡설은 없이 바로 강좌 들어 갑니다.

NAND 지우기

여러분이 혹시 NAND를 제어할 일이 있다면 개발 함수 작성 및 순서를
제 강좌 순서를 따라 하시면 좋을 듯 합니다.

제어 순서 이기도 하고요...

지우기 쓰기 보다 읽기를 먼저 설명한 이유도 이 이유입니다.

NAND 가 지워 졌나 알아 보려면 읽기 부터 해야 하거든요 ^^

자...

원래는 읽기에서 BAD 블록 체크와 관련된 부분을 설명해야 하는데
이 부분은 나중에 설명하고 먼저 지우기 부터 해야 할듯 합니다.

뭐 아시겠지만( 모르실려나?) 강좌 쓸 양이 짧거든요 쩝..

우선 지우기에 대한 설명을 하기 전에 여러분이 기억해야 할 것중 하나는
지우기는 블록 단위로 해야 한다는 겁니다.

물론 지우기의 블록의 크기는 페이지의 배수이고 이전 강좌를 기억하시는 분들이
있겠지만 저같은 건망증이 심한 분들을 위해서 현재 강좌에서 다루는
플래쉬 기준으로 다시 알려 드리죠...

1 Block = 32 Page

이렇게 32 Page 단위로 지울수 있습니다.

일단 지우기를 어떻게 하는 가를 보기 위해서 그림을 봅시당.


[그림 3-14] 지우기 타이밍

이전 강좌에서 명령에 대한 것을 잠깐 언급할 때 1 Cycle 이니 2 Cycle 니 하는 것들을
나중에 이야기 한다고 했죠?

예..

지금이 이 이야기를 할 시점입니다.

위 타이밍도를 보면 아시겠지만

지우기 위해서는 두개의 명령이 필요 합니다.

0x60 : Auto Block Erase Setup 명령
0xD0 : Erase 명령

이렇게 하나의 행위를 하기 위해서 두개의 명령이 필요하면 2 Cycle이라고 하고요
읽기와 같이 하나의 행위를 하기 위해서 한개의 명령이 필요하면 1 Cycle이라고 합니당.

왜 두개의 명령이 필요하냐?

제 생각입니다만...

지울 주소 지정과 진짜 지워라 하는 명령으로 나누어져 있다고 보시면 됩니다.

0x60 명령이 지울 주소를 지정하기 위해서 사용되고요

0xD0 이 지정된 주소를 지우라는 명령이라는 의미죠..

NAND 플래쉬는 0xD0 이 명령으로 입력되면 즉시 지우기 시작한다는 거죠..

0x60으로 지울 주소는 페이지 단위로 지정하는데 1 블록은 32 페이지 이므로

페이지 주소의 하위 5 비트는 무시됩니다.

물론 프로그램에서는 이 비트를 항상 0 으로 클리어 해서 처리하도록 합니다.
실제로 영향은 미치지 않지만 혹시나 하는 마음으로 그렇게 합니다. ㅋㅋ

지울때는 버퍼에서 데이터를 읽거나 쓰지를 않기 때문에 주소를 써 넣을때
버퍼 위치가 필요하지 않으므로 페이지 주소만 써 넣으면 됩니다.

또 지울 경우에 버퍼와 관련된 첫번째 영역이니 두번째 영역이니 스페어 영역이니
하는 것이 해당 되므로 당근 ...

지우기 위한 주소 지정 명령도 0x60 하나면 되는 거죠...

이런 고로 주소 지정은 0x60으로 한후 페이지 주소 3 바이트를 역순으로 써 넣으면 됩니다.

지울 블록 주소가 지정된 후 바로 0xD0 명령을 써 넣어 NAND 플래쉬의 페이지를 지우면
NAND 플래쉬는 지우기를 시작합니다.

지우기는 프로세서 입장에서 보면 무척 긴 시간입니다.

현재 사용되는 칩의 지우기를 위한 최대 시간이 3 m sec 인데

흠...

이전에 읽기 처럼 무작정 3 m sec 기달리면 ....

쩝... 안되겠죠....

이번에는 귀찮더라도 다 지워 졌는지를 체크 해야 합니다.

또 혹시라도 ( 별로 그럴 가능성이 거의 없지만 )
지우라고 했는데 안 지워져 버리면 다시 한번 시도해야 하니깐...

현재 지워진 상태를 읽어 보는 것이 좋지 않겠습니까?

그래서리...

상태 읽기에 대한 이야기도 이번에 한꺼번에 해야 합니당...

(쯥... 귀찮은데.. 퍽~~~ )

NAND 상태 읽기

NAND 플래쉬의 상태 읽기는 두 경우 이외에는 할 필요가 없습니다.

지우기가 종료되었는지와 에러가 없는지 확인
데이터 쓰기가 종료 되었는지와 에러가 없는지 확인

이 두가지 경우 포맷은 갖습니다.

일단 이것도 명령 으로 처리하는데 워낙 간단해서리 타이밍도는 필요 없습니다. ( 휴~~~ )

그냥 상태 읽기 명령인 0x70 명령을 써 넣고 한 바이트 읽어 내면 됩니다. (진짜 간단하죠 ㅋㅋ)

근데 이 상태 읽기 명령의 비트는 각각 의미가 있으므로 다음과 같은 표로 보시는 것이 좋습니다.

일단 표를 봅시당...


[그림] 상태 읽기 테이블.bmp

이중에 가장 먼저 보아야 할 것은 Bit 6 입니다. 이 비트가 바로 현재 NAND 플래쉬가
먼가 하는가를 표시하는 놈이죠...

이 놈이 있기 땜시 굳이 하드웨어에서 RnB 핀을 사용하지 않는 거죠...

그냥 소프트웨어 적으로 처리가 가능하고 별로 시간도 안먹으므로
이렇게 처리해서 하드웨어에 따른 소프트웨어의 변화가 적도록 만드는 거죠..

일단 상태는 계속적으로 읽어 봅니다. 그래서 Bit 6 가 1로 되면
현재 진행되던 일이 끝났다는 것이므로

지우기와 쓰기의 경우에 Bit 0 를 보고 0 이 아니면 실패한것으로 판단합니다.

쉽죠?

그러면 Bit 7 은 뭘까요?

뭐 간단합니당...

NAND 플래쉬 핀 중 쓰기 금지 핀이 있지 않습니까?

그 상태를 읽어 오는 겁니다.

쓰기 금지가 되어 있지 않다면 쓰면 안되겠죠?
당근 쓰기나 지우기도 실패 합니당...

그냥 핀 상태를 돌려 주므로 쓰기 금지가 0 입니다.
이점 기억 하십시오

아....

다음번 강좌에 쓰기에 관련된 이야기 하고
전체적인 제어에 대한 이야기만 하면

드...뎌... 리눅스와 관련된 이야기를 할수 있겠네요..

두려워 집니다. ㅜㅜ

그래도 열라 쓸테니 기둘려 주시기 바랍니다. 쩝...

그럼 오늘도 바바이..