⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nandflash.c

📁 nflash 读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//###########################################################################
// 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 + -