기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요

제가 낸드플래쉬를 제어하고 싶은데 인터넷에서 본 소스는 제가 하려는 메모리와 Spec상에 차이가 있어 고치려고 하는데 소스중에 이해가 되지 않는 부분이 있어 글을 올리게 되었습니다.


아래는
K9K2G16U0M 용 Page Read 코드인데
{{{

static int NF16_ReadPage(U32 block,U32 page,U32 *buffer)
{
    int i;
    unsigned int blockPage;    
    U32 Mecc0, Mecc1, Secc;    
    U32 *bufPt=buffer;    
    
    blockPage=(block<<6)+page;

    NF_RSTECC();    // Initialize ECC
    NF_MECC_UnLock();
    
    NF_nFCE_L();    

    NF_CLEAR_RB();
    NF_CMD(0x00); // Read command
    NF_ADDR(0);  // Column (A[7:0]) = 0
    NF_ADDR(0);  // A[10:8]
    NF_ADDR((blockPage)&0xff); // A[18:11]
    NF_ADDR((blockPage>>8)&0xff); // A[26:19]
    NF_ADDR((blockPage>>16)&0xff);  // A27
    NF_CMD(0x30); // 2'nd command
    NF_DETECT_RB();

}}}
좀 이해가 되지 않는 부분은 바로
{{{
    NF_ADDR(0);  // Column (A[7:0]) = 0  <----- 무슨 용도인지 설명을 부탁드립니다.
    NF_ADDR(0);  // A[10:8]                    <----- 왜 0을 넣죠 ?
    NF_ADDR((blockPage)&0xff); // A[18:11]
    NF_ADDR((blockPage>>8)&0xff); // A[26:19]
    NF_ADDR((blockPage>>16)&0xff);  // A27
}}} 입니다.


고현철

2007.11.19 00:36:17
*.70.26.87

어떤 hw를 사용하시는지.....

controller가 있는 녀석이면 위의 코드가 필요없습니다.
CPLD나 FPGA 혹은 로직을 가지고 접근할때 쓰는 코드일 듯 싶네요.

저도 오래되어서 까먹었는데, 유영창씨가 kelp에서 했던 강좌에 보면 자세한 내용이 있을겁니다.

nand에 대해 공부를 했었도, 직접 저런 방식으로 쓰지를 않다보니 다 까먹네요....ㅎㅎ

임종환

2007.11.19 02:11:21
*.233.31.85

시중에 볼 수 있는 평가보드가 아니라서 HW를 설명드리지 못하겠구요.

일단 NAND FLash Controller가 있습니다.
삼숭 SPEC에 보면 5 cycle 동안 row Column 3주소를 준다고 하는데
row가 Block column이 page address 라고 생각했는데
생각지도 못한 0값을 넣고 있어서 질문드렸습니다.

KELP가서 해당 문서좀 봐야겠네요.

감사합니다.
profile

김재훈

2007.11.19 04:37:32
*.46.168.40

말씀하신 Row Column 3 주소는 블록 번호를 말씀 하시는 것 같군요. 이경우 세번째~다섯번째 사이클에 접근하고자 하는 블록 번호를 넣는 것이 맞습니다.
첫번째와 두번째 싸이클에 0을 넣는 이유는, Block 내부의 페이지를 억세스 하기 위한 주소 값 입니다. 보통은 한 블록당 페이지의 첫번째 데이터부터 끝까지 억세스를 하니깐, 여기에는 0을 주는 것이지요. ^^

임종환

2007.11.19 06:42:41
*.233.31.85

가만히 연습장에 저게 뭐지하며 있다가 "페이지 단위 억세스니까 하게 되네요." 하고 완료글 붙이러 오니, 친절하게 설명해주셨네요.
감사합니다.
가끔씩 이렇게 멍청해질때가 .. 부끄 부끄
List of Articles
번호 제목 글쓴이 날짜 조회 수

사용자 로그인