|
本帖最后由 zyp000 于 2012-5-16 19:01 编辑
看过几个版本的例子,仿照着做了,却总不成功,求教下各位朋友。运行的时候好像产生了软件中断,不知为何。
以下是我的NandFlash.c,整个测试工程代码在附件里,搞了很久都没有搞定这个问题,求各位大神帮帮忙吧。
#include "S3C2440.h"
#include "NandFlash.h"
int NandFlash_Reset( void )
{
/*使能片选*/
NandFlash_nCE_L;
//清RnB信号
NandFlash_ClrRnB;
/*发出复位指令*/
NandFlash_CMD( 0xFF );
/*等待NandFlash复位*/
/*Bit0: 0-NF存储器忙; 1-NF存储器就绪 */
NandFlash_WaitForReady;
/*禁止片选*/
NandFlash_nCE_H;
return 0;
}
void NandFlash_Init( void )
{
NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0); //配置Nand时序
NFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
//13禁止紧锁 12禁止上锁 10禁止中断 9禁止RnB中断 8RnB传输检测上升沿
//6锁定备份ECC 5锁定主数据区ECC产生 4初始化ECC编码器/译码器
//1禁止片选 0控制器使能
NFSTAT = 0; //清零状态寄存器
NandFlash_Reset();
}
static void NandFlash_WriteAddr( unsigned long addr )
{
// 设置Bit0~Bit10
// Bit11设置为0,选择64字节OOB时设置为1.即0~2047,2048~2111.
NFADDR = (unsigned char)addr;
NFADDR = (unsigned char)( ( addr >> 8 ) & 0x7 );
//设置Bit11~Bit27
NFADDR = (unsigned char)( addr >> 11 );
NFADDR = (unsigned char)( addr >> 19 );
NFADDR = (unsigned char)( ( addr >> 27 ) & 0x1 );
}
int NandFlash_ReadPage( unsigned char *data, unsigned long addr )
{
unsigned int i;
//判断地址参数是否合法
//要求data字对齐,addr也对齐.
if( ( (unsigned long)data & 0x3 ) || ( addr & 0x7FF ) ) return -1;
//复位
NandFlash_Reset();
//使能片选
NandFlash_nCE_L;
//清RnB信号
NandFlash_ClrRnB;
//写入1st读命令
NandFlash_CMD( 0x00 );
//写入地址
NandFlash_WriteAddr( addr );
//写入2nd读命令
NandFlash_CMD( 0x30 );
//等待数据准备好
NandFlash_WaitForReady;
//读数据
for( i = 0 ; i < 2048 ; i++ )
*( data + i ) = NFDATA8 ;
//ECC校验
//禁止片选
NandFlash_nCE_H;
//读取成功返回0
return 0;
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|