nanflash 驱动读写擦除 问题?
用的芯片是三星K9F8G08X0M1 Block = 64 Pages
(256K + 8K) Bytes
1 Page = (4K + 128)Bytes
1 Block = (4K + 128)B x 64 Pages
= (256K + 8K) Bytes
1 Device = (4K + 128)B x 64 Pages x 4,096 Blocks
= 8,448 Mbits
1st Cycle A0 A1 A2 A3 A4 A5 A6 A7 Column Address
2nd Cycle A8 A9 A10 A11 A12 *L *L *L Column Address
3rd Cycle A13 A14 A15 A16 A17 A18 A19 A20 Row Address
4th Cycle A21 A22 A23 A24 A25 A26 A27 A28 Row Address
5th Cycle A29 A30 *L *L *L *L *L *L Row Address
我自己的写函数往nand中写数据,读出来不正确?请高手指点 static voidbs_nand_status(struct bs_nand_status *nandp)
{
BS_NAND_CMD = 0x70;
nandp->status = BS_NAND_DATA & (1<<6);//0 busy , 1 ready
nandp->pass_fail = BS_NAND_DATA & (1<<0);//0 pass ,1 fail
}
static void bs_nand_send_addr(unsigned int addr)
{
unsigned int col_addr = addr & 0xfff;
unsigned int row_addr = (addr >> 12) & 0x3ffff;
BS_NAND_ADDR = col_addr & 0xff;
BS_NAND_ADDR = (col_addr >> 8) & 0xf;
BS_NAND_ADDR = row_addr & 0xff;
BS_NAND_ADDR = (row_addr >> 8) & 0xff;
BS_NAND_ADDR = (row_addr >> 16) & 0x3;
}
static void bs_nand_send_block_addr(unsigned int addr)
{
unsigned int row_addr = (addr >> 12) & 0x3ffff;
BS_NAND_ADDR = row_addr & 0xff;
BS_NAND_ADDR = (row_addr >> 8) & 0xff;
BS_NAND_ADDR = (row_addr >> 16) & 0x3;
}
void bs_nand_read(unsigned char *buff,unsigned int nand,unsigned int size)
{
unsigned int nand_addr = nand;
unsigned int i;
for( ; nand_addr < nand + size ; nand_addr += 2048){
BS_NAND_CMD = 0x00;
bs_nand_send_addr(nand_addr);
BS_NAND_CMD = 0x30;
for(i = 0 ; i < 2048 ; i++)
*(buff++) = BS_NAND_DATA;
}
}
int bs_nand_write(unsigned char *buff,unsigned int nand,unsigned int size)
{
unsigned int i;
unsigned int nand_addr = nand;
struct bs_nand_status nand_st;
for(;nand_addr < nand + size; nand_addr += 4096){
//BS_NAND_CMD = 0x0;
BS_NAND_CMD = 0x80;
bs_nand_send_addr(nand_addr);
for(i=0;i<2048;i++){
BS_NAND_DATA = *(buff++);
}
BS_NAND_CMD = 0x10;
while(1){
bs_nand_status(&nand_st);
if(!nand_st.status)
continue;
if(nand_st.pass_fail)
return -1;
break;
}
}
return 0;
}
int bs_nand_erase(unsigned int nand,unsigned int size)
{
unsigned int nand_addr = nand;
struct bs_nand_status nand_st;
for( ; nand_addr < nand + size ; nand_addr += 64*4096){
BS_NAND_CMD = 0x60;
bs_nand_send_block_addr(nand_addr);
BS_NAND_CMD = 0xd0;
while(1){
bs_nand_status(&nand_st);
if(!nand_st.status)
continue;
if(nand_st.pass_fail)
return -1;
break;
}
}
return 0;
}
这是我写的源码 求指导
地址发送不对 地址应该是怎么样的?
页:
[1]