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

📄 main.c

📁 AT91SAM7SE系列IAR编程中外扩NAND的源码。
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C to SDRAM
//* 1.0 18/Dec/06 WG	: Creation
//*----------------------------------------------------------------------------

// Include Standard files
#include "project.h"
#include "AT91SAM7SE-EK.h"
#include "NandFlash.h"

//#include <String.h>



//*--------------------------------------------------------------------------------------
//* Function Name       	: Main
//* Object              	: Software entry point
//* Input Parameters    : none.
//* Output Parameters  : none.
//*--------------------------------------------------------------------------------------
int main()
{

      SNandInfo NandInfo; // Create a Device Structure


      unsigned char Bad_Block_Table [NB_OF_BLOCKS];

      unsigned char Page_Buffer [MAIN_AREA_SIZE + SPARE_AREA_SIZE];

      unsigned char DBGU_Message[DBGU_BUFFER] ;

      volatile unsigned short i;

      volatile unsigned int Temp_Register;


       // Initialize the DBGU port
       Init_DBGU(AT91B_MASTER_CLOCK);

       // Initialize the NAND Flash Device
       AT91F_NandFlash_Init();

       // Reset the NAND Flash Device
        AT91F_NandFlash_Reset();

       // Read NAND Flash Device Identification Number and fill the NandInfo Structure
       AT91F_NandFlash_Read_ID (&NandInfo);


        //Create a Bad block(s) table and return the number of Bad block(s)
       Temp_Register = AT91F_NandFlash_Create_Bad_Block_Table (&NandInfo,&Bad_Block_Table [0]);
       sprintf(DBGU_Message,"%d bad block(s) found in the NAND Flash device \n\r", Temp_Register);
       AT91F_DBGU_Printk(DBGU_Message);

       // Initialize the ECC controller
       AT91C_BASE_HECC ->ECC_CR = 0x01; //ECC Software Reset
       AT91C_BASE_HECC ->ECC_MR = 0x02; //PAGE = 2048 bytes

  for(;;)
  {
       AT91F_DBGU_Printk("*******************************************************************\n\r");
       AT91F_DBGU_Printk("***   Welcome to Atmel NAND Flash support application example   ***\n\r");
       AT91F_DBGU_Printk("*******************************************************************\n\r");
       AT91F_DBGU_Printk("\n\r");
       AT91F_DBGU_Printk("                *** Command Menu ***\n\r");
       AT91F_DBGU_Printk("Please send 'E' ASCII character to start a block erase operation\n\r");
       AT91F_DBGU_Printk("Please send 'W' ASCII character to start a page write operation\n\r");
       AT91F_DBGU_Printk("Please send 'R' ASCII character to start a block read operation\n\r");


       do
       {
          AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
          while (!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU));
          DBGU_Message[0] = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
          if((DBGU_Message[0] != 'E') && (DBGU_Message[0] != 'W') && (DBGU_Message[0] != 'R'))
          {
            AT91F_DBGU_Printk("Invalid character,please try again\n\r");
          }
       }
       while ((DBGU_Message[0] != 'E') && (DBGU_Message[0] != 'W') && (DBGU_Message[0] != 'R'));

       switch (DBGU_Message[0])
       {
       case 'E': AT91F_DBGU_Printk("Please choose the block you wish to erase\n\r");
                 AT91F_DBGU_Printk("1 : Block 1\n\r");
                 AT91F_DBGU_Printk("2 : Block 1024\n\r");
                 AT91F_DBGU_Printk("3 : Block 2048\n\r");


                 do
                 {
                    AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
                    while (!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU));
                    DBGU_Message[0] = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
                    if ((DBGU_Message[0] != '1') && (DBGU_Message[0] != '2') && (DBGU_Message[0] != '3'))
                    {
                      AT91F_DBGU_Printk("Invalid value,please try again\n\r");
                    }
                 }
                 while ((DBGU_Message[0] != '1') && (DBGU_Message[0] != '2') && (DBGU_Message[0] != '3'));

                 switch (DBGU_Message[0])
                 {
                  case '1':
                    AT91F_NandFlash_Block_Erase (&NandInfo,&Bad_Block_Table [0],0);
                  break;

                  case '2':
                    AT91F_NandFlash_Block_Erase (&NandInfo,&Bad_Block_Table [0],0x3FF);
                  break;

                  case '3':
                    AT91F_NandFlash_Block_Erase (&NandInfo,&Bad_Block_Table [0],0x7FF);
                  break;
                 }

          break;

       case 'R': AT91F_DBGU_Printk("Please choose the page you wish to read\n\r");
                 AT91F_DBGU_Printk("1 : Page 1 within Block 1\n\r");
                 AT91F_DBGU_Printk("2 : Page 32 within Block 1024\n\r");
                 AT91F_DBGU_Printk("3 : Page 64 within Block 2048\n\r");


                 do
                 {
                    AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
                    while (!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU));
                    DBGU_Message[0] = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
                    if ((DBGU_Message[0] != '1') && (DBGU_Message[0] != '2') && (DBGU_Message[0] != '3'))
                    {
                      AT91F_DBGU_Printk("Invalid value,please try again\n\r");
                    }
                 }
                 while ((DBGU_Message[0] != '1') && (DBGU_Message[0] != '2') && (DBGU_Message[0] != '3'));

                 switch (DBGU_Message[0])
                 {
                  case '1':
                    AT91F_NandFlash_Page_Read (&NandInfo,&Page_Buffer[0],0,0);
                    AT91F_DBGU_Printk("Data content:\n\r");
                    for(i=0;i<2048;i++)
                    {
                      while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		      AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, Page_Buffer[i]);
                    }
                    AT91F_DBGU_Printk("\n\r");
                    AT91F_DBGU_Printk("Spare area content:\n\r");
                    for(i=2048;i<2112;i++)
                    {
                      while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		      AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, Page_Buffer[i]);
                    }
                    AT91F_DBGU_Printk("\n\r");
                  break;

                  case '2':
                    AT91F_NandFlash_Page_Read (&NandInfo,&Page_Buffer[0],0x3FF,0x1F);
                    for(i=0;i<2048;i++)
                    {
                      while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		      AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, Page_Buffer[i]);
                    }
                    AT91F_DBGU_Printk("\n\r");
                    AT91F_DBGU_Printk("Spare area content:\n\r");
                    for(i=2048;i<2112;i++)
                    {
                      while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		      AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, Page_Buffer[i]);
                    }
                    AT91F_DBGU_Printk("\n\r");
                  break;

                  case '3':
                    AT91F_NandFlash_Page_Read (&NandInfo,&Page_Buffer[0],0x7FF,0x3F);
                    for(i=0;i<2048;i++)
                    {
                      while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		      AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, Page_Buffer[i]);
                    }
                    AT91F_DBGU_Printk("\n\r");
                    AT91F_DBGU_Printk("Spare area content:\n\r");
                    for(i=2048;i<2112;i++)
                    {
                      while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		      AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, Page_Buffer[i]);
                    }
                    AT91F_DBGU_Printk("\n\r");
                  break;
                 }

       break;

       case 'W': AT91F_DBGU_Printk("Please choose the page you wish to write\n\r");
                 AT91F_DBGU_Printk("1 : Page 1 within Block 1\n\r");
                 AT91F_DBGU_Printk("2 : Page 32 within Block 1024\n\r");
                 AT91F_DBGU_Printk("3 : Page 64 within Block 2048\n\r");


                 do
                 {
                    AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
                    while (!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU));
                    DBGU_Message[0] = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
                    if ((DBGU_Message[0] != '1') && (DBGU_Message[0] != '2') && (DBGU_Message[0] != '3'))
                    {
                      AT91F_DBGU_Printk("Invalid value,please try again\n\r");
                    }
                 }
                 while ((DBGU_Message[0] != '1') && (DBGU_Message[0] != '2') && (DBGU_Message[0] != '3'));

                 switch (DBGU_Message[0])
                 {
                  case '1':

                    AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
                    for(i=0;i<2048;i++)
                    {
                      Page_Buffer[i] = i;
                    }

                    AT91F_NandFlash_Page_Write (&NandInfo,&Bad_Block_Table [0],&Page_Buffer[0],0,0);
                  break;

                  case '2':

                    AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
                    for(i=0;i<2048;i++)
                    {
                      Page_Buffer[i] = i;
                    }

                    AT91F_NandFlash_Page_Write (&NandInfo,&Bad_Block_Table [0],&Page_Buffer[0],0x3FF,0x1F);
                  break;

                  case '3':

                    AT91F_US_ResetRx ((AT91PS_USART) AT91C_BASE_DBGU);
                    for(i=0;i<2048;i++)
                    {
                      Page_Buffer[i] = i;
                    }

                    AT91F_NandFlash_Page_Write (&NandInfo,&Bad_Block_Table [0],&Page_Buffer[0],0x7FF,0x3F);
                  break;
                 }

       break;

       }

  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -