요즘 회사일이 좀 바쁩니다.
흠..

그래서 ..

그냥 그렇다구요.. 쩝

NAND 쓰기

자 이제 대망에 마지막...

NAND 에 쓰기 입니다.

지금까지의 강좌를 읽어 보신분들이라면 대충 눈치 채시겠지만 쓰기 역시 페이지 단위로 써 집니다.

자 여기서 우리는 외쳐 봅시당.

NAND 는 페이지 단위로 생각하자!!!

이제 NAND 에 페이지 단위로 써 넣어어야 하는데..

NAND 에 쓰는 것을 PROGRAM 이라고 합니다.

이 쓰기 명령은 2 Cycle 명령으로 0x80 과 0x10을 조합합니다.

왜 이렇게 나누어져 있냐?

우선 써 넣을 페이지를 지정해야죠?

그리고 읽기와 달리 쓰기는 쓸 데이터를 지정해야죠?

이게 끝나야 쓰기를 하라고 할수 있지 않겠습니까?

그래서 0x80 명령은 페이지 주소와 데이터를 버퍼에 써 넣기 위해서 필요한 명령이고요

0x10은 실제로 페이지 버퍼에 내용을 플래쉬 메모리에 쓰라는 명령이죠...

물론 다 쓴 다음에는 지우기와 동일한 방법으로 잘 써 져 있는지 검사 합니다.

일단 그림을 봅시당...


[그림 3-16] 쓰기 타이밍

이제 타이밍도에 익숙해 지셨습니까?

그림을 보듯이

0x80 을 쓰고 페이지 버퍼 주소와 페이지 주소를 ( 총 4 바이트 ) 써 넣고
데이터 528개를 쭈욱 밀어 넣습니다...
물론 이 데이터들은 페이지 버퍼에 써 넣어지게 되는 것이구요

그 이후에 페이지 버퍼의 내용을 플래쉬에 써 넣으라는 명령인 0x10을 씁니다.

물론 쓰고 난 이후에는 NAND 플래쉬가 쓰는 동안 기달려야죠..

이 기다리는 시간은 대략 500 u Sec 정도 됩니다.

좀 길죠?

그러므로 무식하게 기달리는 방식으로 짜면 안되겠죠? ^^

예 상태를 읽어서 종료 되기를 기다리는 것이 좋습니다.

왜냐 500 u Sec는 최대란 의미고 실제로는 200 u Sec 정도 되거든요..

귀찮으면 그냥 기달리시고요..

뭐 스피드 광들에게 혼날지 모릅니다.

아 ...

이 방식일 경우 페이지 버퍼 주소를 지정하는 첫번째 주소 값은
항상 0 으로 쓰셔야 할겁니다. .

왜냐?

중간을 지정하면 528 개를 모두 써 넣지 못하고 그 위치 만큼 뺴 주어야 하잖아요

또 ...

이게 제일 중요한건데

버퍼에는 이전에 지정된 값이 있거든요..

근데 0x10 명령은 페이지 버퍼의 내용을 플래쉬 메모리에 써 넣으라는 명령이잖아요

그러면 이전 내용과 이번에 쓴 내용이 짬뽕되잖아요...

그러면 원하는 결과와 다른 내용이 써 질수 있거든요..

그래서 이 방식으로 쓰기를 할 경우에는

페이지 버퍼 주소는 0x00 으로 지정하고 528 단위로 써 넣어야 한다는 거죠...

흠..

또 하나의 문제는 버퍼 주소값이 어디를 가리키냐는 문제가 있죠...
A 영역? B 영역 ? C 영역?

모드죠.. 아무도... 쩝

눈치를 채신분이 있을지 모르지만...

이걸 해결하기 위해서

이전에 사용했던 읽기 명령을 붙입니다.

첫번째 영역인 A 영역 부터 데이터를 쓰려면 0x00
두번째 영역인 B 영역 부터 데이터를 쓰려면 0x01
세번째 영영깅 C 영역 스페어 영역에 데이터를 쓰려면 0x50

이걸 설명한 것이 바로 다음 그림입니다.


[그림 3-17] 쓰기 영역 지정 타이밍

여기서 특이한 것은 처음에는 지정해야 하지만 다음번에는
생략해도 된다는 겁니다.

단 B 영역은 아니죠....

어쩄든 여기서 기억해야 하실것은...

현실적인 이유에서 데이터를 쓸 때

페이지 버퍼 지정 위치는 0 으로 하고
첫번째 영역부터 쓰기 시작하고
써 넣는 데이터는 528 바이트를 기준으로 합니다.

앗 여기서 우리가 조심해야 할 점은
만약 스페어 영역을 건들지 않고 싶다면?

예 맞습니다. 해당 영역을 미리 읽어 버리면 되겠죠?
만약 그렇게 하고 싶지 않다면?

잔머리를 조금 굴리면 됩니다.

이전 강좌에서 이런 이야기 했죠?
지우고 나면 모두 1 로 바뀌는데 0 으로 끊는 거라구요..

그렇습니다. 모두 1 값으로 쓰면 이전값을 유지 하게 됩니다.

그러므로 스페어 영역을 건들고 싶지 않다면 512 이후에는
모두 0xFF 로 스페어 공간만큼 밀어 버리면

이전 값을 유지 하게 됩니다.

 

근데요...

이거 귀찮지 않습니까?

또 매번 528 바이트씩 밀어 넣는 것도 조금 못 마땅 하죠?

그래서 이걸 제한적으로나마 풀어 놓은것이 카피 백 프로그램 이라는

조금 뭔가 있어 보이는 방법입니다. ^^

NAND 읽고 계속 쓰기 카피 백 프로그램

뭐 이름은 그럴듯 하지만 실제로는 간단합니다.

페이지 읽고 읽은거 계속 쓰기

허무하죠... 쩝

뭐 세상 다 그렇지 않습니까?

원래 다 그럴듯 해 보이는 것들이 실제로 다가가서 익숙해져 버리면 별거 없죠..

인생 다 그렇습니다.

이거 어디다 쓰느냐?

예 그렇습니다.

별로 쓸데가 없습니다.

단지 똑같은 데이터를 써 넣을 필요가 있을 때 사용하는 거지요

근데 이런 방식으로 할때 명령이 좀 틀립니다.

읽기 명령이야 0x00 인걸 알았겠지만요..
쓰기 명령은 0x8A 입니다.

아래 그림이 그 타이밍도 입니다.



[그림 3-18] 읽고 연속 쓰기 타이밍

솔찍하게 이런식으로 사용할 일은 별로 없구요...

차라리 읽고서 다시 쓰는 방식을 사용하죠...

물론 일기 명령 처리 흐름과 쓰기 명령 처리 흐름을 조합하는 겁니다.

어쨌든 이렇게 쓰기에 대한 이야기를 종료 합니다.

다음에는 리눅스로 바로 가는 것이 아니고

마지막 남은 배드 블럭이라는

숨겨진 난제를 해결해야죠...

그럼 다음 강좌에 보죠..