|
参考网上的2440的nandflash的读写,自己写了一个裸奔读取nandflash的程序,可是读出来的数据是错误的,希望大侠们帮忙查一下错误:
/************************* NAND FLASH Registers ***************/
// NAND FLASH CONFIGURATION REGISTER(NFCONF)
#define R_NFCONF (*((volatile unsigned long *)0x4e000000))
// CONTROL REGISTER
#define R_NFCONT (*((volatile unsigned long *)0x4e000004))
// COMMAND REGISTER
#define R_NFCMMD (*((volatile unsigned long *)0x4e000008))
// DATA REGISTER
#define R_NFDATA (*((volatile unsigned long *)0x4e000010))
// ADDRESS REGISTER
#define R_NFADDR (*((volatile unsigned long *)0x4e00000c))
// NFCON STATUS REGISTER
#define R_NFSTAT (*((volatile unsigned long *)0x4e000020))
/**************************************************************/
#define NAND_FLASH_BLOCK_SIZE 512 // nand flash bock size
#define NAND_FLASH_BLOCK_MASK (NAND_FLASH_BLOCK_SIZE -1)
void nandflash_reset(void);
/********************** NAND FLASH CONTROL **************/
/*
* Nand Flash Controls
*/
void nandflash_init(void)
{
R_NFCONT = (1<<0);
R_NFCONT |= (1<<1);
nandflash_reset();
}
/*
* Reset Nand Flash Control
*/
void nandflash_reset(void)
{
R_NFCONT &= ~(1<<1);
R_NFCMMD = 0xff;
while(!(R_NFSTAT & 0x1)); // waiting for busy
R_NFSTAT |= 1;
}
/*
* Nand Flash Controls
* return: readed size
*/
unsigned int nandflash_read(char *buf, unsigned long address, unsigned int size)
{
unsigned int read_size = 0;
unsigned int i;
// check address and size whether crosspounding the flash block size
if(NAND_FLASH_BLOCK_MASK & address || NAND_FLASH_BLOCK_MASK & size)
return -1;
// enable chip select
R_NFCONT &= ~(1<<1);
for(i = address; i < (address + size);)
{
int j;
R_NFSTAT |= (1<<2);
// send read command
R_NFCMMD = 0;
// set address to NFADDR register
R_NFADDR = i & 0xff;
R_NFADDR = (i >> 9) & 0xff;
R_NFADDR = (i >> 17) & 0xff;
R_NFADDR = (i >> 25) & 0xff;
// waiting controllor finished
while(!(R_NFSTAT & 0x1));
// read data
for( j = 0; j < NAND_FLASH_BLOCK_SIZE; j++, i++)
{
*buf = R_NFDATA & 0xff;
buf++;
read_size++;
}
}
// disable chip select
R_NFCONT |= 1 << 1;
return read_size;
}
int read(void)
{
nandflash_init();
nandflash_read((char *)0x30001000, 0x00000000, 0x1000);
while(1);
return 0;
}
我通过jlink读取内存,发现值都是错误的。
现在对nandflash是越来越迷糊了。。。。。 |
|