📄 main.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 + -