📄 nandflash.c
字号:
//###########################################################################
// Original source by: GONGXIAOLIN.
// $TI Release: DSP280x, DSP2801x Header Files V1.41 $
// $Release Date: August 17th, 2007 $
//###########################################################################
#include "DSP280x_Device.h" // DSP280x Headerfile Include File
#include "DSP280x_Examples.h" // DSP280x Examples Include File
unsigned char badblocknum=0; //坏块计数
unsigned char badblock[10]; //先预设坏块数小于等于10块
unsigned char wData1, wData2; //ID
void delay_loop_ms(int MS) //延时函数ms
{
short i,j;
for(j=0;j<MS;j++)
for (i = 0; i < 1000; i++){}
}
void delay_loop_us(int US) //延时函数us
{
short i,j;
for(j=0;j<US;j++)
for (i = 0; i < 100; i++){}
}
void NF_Gpio_Init(void) //DSP的I/O口配置为GPIO口输出(NANDFLASH)。
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; // Enable Pull up on GPIO2 set ALE
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2 = GPIO2 set I/O port ALE
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // GPIO2 = output
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable Pull up on GPIO0 set CLE
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0 = GPIO0 set I/O port CLE
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 = output
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0; // GPIO23 = GPIO23 set I/O port WP
GpioCtrlRegs.GPADIR.bit.GPIO23 = 1; // GPIO23 = output
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // GPIO22 = GPIO22 set I/O port CE
GpioCtrlRegs.GPADIR.bit.GPIO22 = 1; // GPIO22 = output
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0; // GPIO21 = GPIO21 set I/O port RE
GpioCtrlRegs.GPADIR.bit.GPIO21 = 1; // GPIO21 = output
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0; // GPIO20 = GPIO20 set I/O port R/B
GpioCtrlRegs.GPADIR.bit.GPIO20 = 0; // GPIO20 = input 观察是否繁忙
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable Pull up on GPIO3 set WE
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO3 = GPIO3 set I/O port WE
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; // GPIO3 = output
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; // Enable Pull up on GPIO11 set D7
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0; // GPIO11 = GPIO11
GpioCtrlRegs.GPADIR.bit.GPIO11 = 1; // GPIO11 = output
GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0; // Enable Pull up on GPIO10 set D6
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0; // GPIO10 = GPIO10
GpioCtrlRegs.GPADIR.bit.GPIO10 = 1; // GPIO10 = output
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; // Enable Pull up on GPIO9 set D5
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 0; // GPIO9 = GPIO9
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1; // GPIO9 = output
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; // Enable Pull up on GPIO8 set D4
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0; // GPIO8 = GPIO8
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1; // GPIO8 = output
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable Pull up on GPIO7 set D3
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0; // GPIO7 = GPIO7
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1; // GPIO7 = output
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; // Enable Pull up on GPIO6 set D2
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; // GPIO6 = GPIO6
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; // GPIO6 = output
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable Pull up on GPIO5 set D1
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0; // GPIO5 = GPIO5
GpioCtrlRegs.GPADIR.bit.GPIO5 = 1; // GPIO5 = output
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; // Enable Pull up on GPIO4 set D0
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO4 = GPIO4
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1; // GPIO4 = output
EDIS;
}
void NF_Init(void) //NANDFLASH使能信号初始化
{
GpioDataRegs.GPASET.bit.GPIO21= 1; //I/O set high FLASH_RE=1;
GpioDataRegs.GPASET.bit.GPIO3= 1; //I/O set high FLASH_WE=1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; //I/O set low FLASH_CLE=0;
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1; //I/O set low FLASH_ALE=0;
GpioDataRegs.GPASET.bit.GPIO22= 1; //I/O set high FLASH_CE=1;
GpioDataRegs.GPASET.bit.GPIO23= 1; //I/O set high FLASH_WP=1;
}
void NF_Port_Out(unsigned char Data) //将待写的数据写到DSP的I/O口上,这两个函数可以再考虑,直接写32位寄存器
{
//output data
if(Data&0x80)
GpioDataRegs.GPASET.bit.GPIO11 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO11 = 1; //I/O set low
if(Data&0x40)
GpioDataRegs.GPASET.bit.GPIO10 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1; //I/O set low
if(Data&0x20)
GpioDataRegs.GPASET.bit.GPIO9 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO9 = 1; //I/O set low
if(Data&0x10)
GpioDataRegs.GPASET.bit.GPIO8 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO8 = 1; //I/O set low
if(Data&0x08)
GpioDataRegs.GPASET.bit.GPIO7 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO7 = 1; //I/O set low
if(Data&0x04)
GpioDataRegs.GPASET.bit.GPIO6 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO6 = 1; //I/O set low
if(Data&0x02)
GpioDataRegs.GPASET.bit.GPIO5 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO5 = 1; //I/O set low
if(Data&0x01)
GpioDataRegs.GPASET.bit.GPIO4 = 1; //I/O set high
else
GpioDataRegs.GPACLEAR.bit.GPIO4 = 1; //I/O set low
}
unsigned char NF_Port_In() //将从NANDFLASH读出的数据从IO口上取回
{
//input data
unsigned char data=0x0;
// if(GpioDataRegs.GPADAT.bit.GPIO11==1) //I/O has set high
// data|= 0x80;
// if(GpioDataRegs.GPADAT.bit.GPIO10==1) //I/O has set high
// data|= 0x40;
// if(GpioDataRegs.GPADAT.bit.GPIO9==1) //I/O has set high
// data|= 0x20;
// if(GpioDataRegs.GPADAT.bit.GPIO8==1) //I/O has set high
// data|= 0x10;
// if(GpioDataRegs.GPADAT.bit.GPIO7==1) //I/O has set high
// data|= 0x08;
// if(GpioDataRegs.GPADAT.bit.GPIO6==1) //I/O has set high
// data|= 0x04;
// if(GpioDataRegs.GPADAT.bit.GPIO5==1) //I/O has set high
// data|= 0x02;
// if(GpioDataRegs.GPADAT.bit.GPIO4==1) //I/O has set high
// data|= 0x01;
data=(GpioDataRegs.GPADAT.all&0x00000FF0)>>4;
return data;
}
void NF_ShiftDIR_Out() //转换DSP的I/O口为输出
{
GpioCtrlRegs.GPADIR.all=GpioCtrlRegs.GPADIR.all|0x00000FF0; //1为输出
}
void NF_ShiftDIR_In() //转换DSP的I/O口为输入
{
GpioCtrlRegs.GPADIR.all=GpioCtrlRegs.GPADIR.all&0xFFFFF00F; //0为输入
}
void NF_WaitRb() //NANDFLASH忙时则等待
{
while (1)
{
if(GpioDataRegs.GPADAT.bit.GPIO20) //准备/忙R/B
break; //非忙跳出
}
}
void NF_WriteByte(unsigned char uType) //写数据
{
NF_ShiftDIR_Out(); //数据口转向输出方向
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1; //I/O set low FLASH_WE=0;
delay_loop_us(1); //延时时间要确定
NF_Port_Out(uType); //写数据
delay_loop_us(1); //延时时间要确定
GpioDataRegs.GPASET.bit.GPIO3= 1; //I/O set high FLASH_WE=1;
}
unsigned char NF_ReadByte() //读数据
{
unsigned char utemp =0;
NF_ShiftDIR_In(); //数据口转向输入方向
GpioDataRegs.GPACLEAR.bit.GPIO22 = 1; //I/O set low FLASH_CE=0;failling edge
GpioDataRegs.GPACLEAR.bit.GPIO21 = 1; //I/O set low FLASH_RE=0;
delay_loop_ms(50); //延时时间要确定
utemp = NF_Port_In(); //读数据
GpioDataRegs.GPASET.bit.GPIO21= 1; //I/O set high FLASH_RE=1;
//read
//NF_CE_H;
return utemp;
}
unsigned char NF_ReadStatue() //读状态积存器
{
unsigned char utemp;
GpioDataRegs.GPASET.bit.GPIO0= 1; //I/O set high FLASH_CLE=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -