📄 nandflash.c
字号:
/*
* Module: NandFlash.c NAND FLASH基本驱动子程序模块
* Programed by: ZHI-XIONG PENG
* Programed on: Date: 2005-4-28 10:30
* Modified by:
* Modified on: Date:
* Copyright (c) LONGFLY SHAOGUAN Inc. All rights reserved
*/
#define NANDFLASH_GLOBALS
#include "./SRC/includes.h"
//============================================================
//* 函数介绍:延时( 最少单位时间1.4uS )
//* 参数列表:dly 延时单位
//* 返回值 :无
//* 全局变量:
//* 调用模块:
//============================================================
void LoopNop( uint dly )
{
uint i;
while( dly-- )
{
i = MCKMHZ * 0.1 + 1; //47 Cycles
while( i-- );
}
}
//============================================================
//* 函数介绍:获取ID
//* 参数列表:无
//* 返回值 :0 失败 非零为芯片ID(高位为:Maker Code 低位为:Device Code)
//* 0xECE6-K9F6408 0xECE3-K9F3208 0xECEA-K9F1608
//* 全局变量:
//* 调用模块:
//============================================================
uint R_NandFlash_ID(void)
{
volatile char *pflash;
uint id;
pflash = (char *)NANDFCE;
*pflash = 0x01;
pflash = (char *)NANDFORD;
*pflash = 0x90;
pflash = (char *)NANDFADDR;
*pflash = 0x00;
pflash = (char *)NANDFLASH;
id = *pflash;
id = (id<<8) | *pflash;
pflash = (char *)NANDFCE;
*pflash = 0x00;
return( id );
}
//============================================================
//* 函数介绍:读一个页面
//* 参数列表:addr 待读数据的FLASH页地址
//* data 数据输出缓冲区指针 缓冲区长度必须至少保证能够存储一页数据:528/264
//* 返回值 :0 失败 非零成功(返回值为数据长度)
//* 全局变量:
//* 调用模块:
//============================================================
uint R_NandFlash_Page( uint addr, char *data )
{
AT91PS_PIO pPio;
volatile char *pflash;
uint i;
pPio = AT91C_BASE_PIO;
pPio->PIO_ODR = NANDFR_B;
pflash = (char *)NANDFCE;
*pflash = 0x01;
pflash = (char *)NANDFORD;
*pflash = 0x00;
pflash = (char *)NANDFADDR;
*pflash = 0x00;
*pflash = addr&0xff;
*pflash = addr/0x100;
for( i=0; i<3; i++ )
{
LoopNop( 10 ); //Delay 15us
if( pPio->PIO_PDSR & NANDFR_B )
break;
}
if( i == 3 )
return( 0 );
pflash = (char *)NANDFLASH;
for( i=0; i<NandPageSize; i++ )
*data++ = *pflash;
pflash = (char *)NANDFCE;
*pflash = 0x00;
return( NandPageSize );
}
//============================================================
//* 函数介绍:写一个页面
//* 参数列表:addr 待写数据的FLASH页地址
//* data 数据缓冲区指针 缓冲区长度必须至少保证能够存储一页数据:528/264
//* 返回值 :0成功 非零失败
//* 全局变量:
//* 调用模块:
//============================================================
uint W_NandFlash_Page( uint addr, char *data )
{
AT91PS_PIO pPio;
volatile char *pflash;
uint i;
pPio = AT91C_BASE_PIO;
pPio->PIO_ODR = NANDFR_B;
pflash = (char *)NANDFCE;
*pflash = 0x01;
pflash = (char *)NANDFORD;
*pflash = 0x80;
pflash = (char *)NANDFADDR;
*pflash = 0x00;
*pflash = addr&0xff;
*pflash = addr/0x100;
pflash = (char *)NANDFLASH;
for( i=0; i<NandPageSize; i++ )
*pflash = *data++;
pflash = (char *)NANDFORD;
*pflash = 0x10;
for( i=0; i<12; i++ )
{
LoopNop( 100 ); //Delay 150us
if( pPio->PIO_PDSR & NANDFR_B )
break;
}
if( i < 12 )
{
pflash = (char *)NANDFORD;
*pflash = 0x70;
pflash = (char *)NANDFLASH;
i = *pflash & 1;
}
pflash = (char *)NANDFCE;
*pflash = 0x00;
return( i );
}
//============================================================
//* 函数介绍:擦除一个块
//* 参数列表:addr 擦除块的首页地址
//* 返回值 :0成功 非零失败
//* 全局变量:
//* 调用模块:
//============================================================
uint E_NandFlash_Block( uint addr )
{
AT91PS_PIO pPio;
volatile char *pflash;
uint i;
pPio = AT91C_BASE_PIO;
pPio->PIO_ODR = NANDFR_B;
pflash = (char *)NANDFCE;
*pflash = 0x01;
pflash = (char *)NANDFORD;
*pflash = 0x60;
pflash = (char *)NANDFADDR;
*pflash = addr&0xff;
*pflash = addr/0x100;
pflash = (char *)NANDFORD;
*pflash = 0xD0;
for( i=0; i<10; i++ )
{
LoopNop( 1000 ); //Delay 1.5ms
if( pPio->PIO_PDSR & NANDFR_B )
break;
}
if( i < 10 )
{
pflash = (char *)NANDFORD;
*pflash = 0x70;
pflash = (char *)NANDFLASH;
i = *pflash & 1;
}
pflash = (char *)NANDFCE;
*pflash = 0x00;
return( i );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -