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

📄 main.c

📁 1、程序目的:介绍AT91SAM7A3 SPI0的基本用法: 2、 功能说明: 利用SPI0接口读写外部DATAFLASH的数据
💻 C
字号:
//*----------------------------------------------------------------------------
//* 文件名         : main.c
//* 功能           : main application written in C
//* 创建人         : 张正锋 2005-11-20 embed_tech@126.com
//*----------------------------------------------------------------------------
// Include Standard files
#include "Board.h"
#include   "dataflash.h"
#include "Main.h"
#include "Dataflash.h"
#include "dbgu.h"

//定义全局变量
char message[300];
char write_data[256];
char read_data[256];

/*---------------------------- 对DataFlash操作的全局变量,在dataflash.c中定义------------------*/
extern AT91S_DataflashFeatures	        DeviceAT45DCB008;          //define a struct for AT45DB321C
extern AT91S_DataflashDesc		        DataflashDesc;             //define  a struct for DataflashDesc
extern AT91S_DataFlash			        DataFlash;                 //define  a struct for DataFlash
extern  unsigned char   Buffer_Dataflash[BUFFER_SIZE_DATAFLASH];   //define  a buffer for DataFlash


unsigned char Buffer_Write_Dataflash[BUFFER_SIZE_DATAFLASH];
unsigned char Buffer_Read_Dataflash[BUFFER_SIZE_DATAFLASH];

/*--------SPI_Dataflah handle---in dataflash.c-----------------------------------*/
extern  void AT91F_CfgSPIForDataFlash(void);  //dataflash 初始化
extern  AT91S_DataFlashStatus AT91F_DataFlashPageRead (//读FLASH的一页
	AT91PS_DataFlash pDataFlash,
	unsigned int src,
	unsigned char *dataBuffer,
	int sizeToRead );
extern  AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(//写一页
	AT91PS_DataFlash pDataFlash,
	unsigned char *src,
	unsigned int dest,
	unsigned int SizeToWrite);
extern  AT91S_DataFlashStatus AT91F_DataFlashPageErase(//擦除一页
	AT91PS_DataFlash pDataFlash,
	unsigned char *src,
	unsigned int address,
	unsigned int SizeToWrite);
extern  AT91S_DataFlashStatus AT91F_DataFlashWaitReady(//取得DATAFLASH的状态
        AT91PS_DataflashDesc pDataFlashDesc,
        unsigned int timeout);


static const char POLLING_header[]={"\n\r  *** zhangzhengfeng DATAFLASH card test ***\n\r"};

volatile int loop;
//*--------------------------------------------------------------------------------------
//* 函数名      : wait
//* 功能:      : Software waiting loop
//* 输入参数    : none. Waiting time is defined by the global variable LedSpeed.
//* 返回值      : none
//* 创建人      : 张正锋 2005-11-20 embed_tech@126.com
//*--------------------------------------------------------------------------------------
void wait ( unsigned int ms )
{//* Begin
	//Wait at least 10 ms before value is written into EEPROM
    for (loop=0; loop<10000*ms; loop++){};

}//* End

//*----------------------------------------------------------------------------
//* 函数名      : main
//*功能:       : Main function
//* 输入参数    : none.
//* 返回值      : none
//* 创建人      : 张正锋 2005-11-20 embed_tech@126.com
//*----------------------------------------------------------------------------
int main( void )
{
   unsigned int i;

   //unsigned int j,k;
   //First, enable the clock of the PIOB
     AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
   //* to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;
   //* Clear the LED's. On the EB55 we must apply a "1" to turn off LEDs
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ) ;

    //set users reset function (reset about 512*(1/32k)=16ms ok!)
    AT91F_RSTSetMode(AT91C_BASE_RSTC,(8<<8)|(1<<0)); //in lib_AT91SAM7A3.h
    ////////////////////////////////////////////////////////////////////////////
    //* Init DBGU
    AT91F_DBGU_Init();
    //* Polling
    AT91F_DBGU_Printk((char*)POLLING_header);

    ////////////////////////////////////////////////////////////////////////////
   //初始化SPI_DataFlash
    AT91F_DBGU_Printk("init SPI dataflash!\n\r");
    AT91F_CfgSPIForDataFlash();

    //##########################################################################
    //##########################################################################
    //写8192页 每页1056 BYTE
    /*
    for(j=0;j<8192;j++)
     {
      ////////////////////////////擦--写
       for(i=0;i<1056;i++) {Buffer_Dataflash[i]=0xcc;}
       //等待DATAFLASH准备好
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);
       //写数据到DATAFLASH
       while(AT91F_DataFlashPagePgmBuf(&DataFlash,(unsigned char*)Buffer_Dataflash,(j*DataFlash.pDevice->pages_size),(DataFlash.pDevice->pages_size) )!=DATAFLASH_OK);
       //等待写完
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);

       k++;  if(k>10){k=0;Trace_Toggel_LED(LED2);}
     }
  */
    //读出一页校验
     //---------------------------读 DATAFLASH的某一页(第1000页)-----------------------------
       AT91F_DBGU_Printk("Read one pages!\n\r");
       for(i=0;i<BUFFER_SIZE_DATAFLASH;i++) 	  Buffer_Dataflash[i] = 0x00;	
       //等待DATAFLASH准备好
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);
       //从DATAFLASH读数据
       while(AT91F_DataFlashPageRead(&DataFlash,(1000*DataFlash.pDevice->pages_size),(unsigned char*)Buffer_Dataflash,(DataFlash.pDevice->pages_size) )!=DATAFLASH_OK);
       //等待读完
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);

       for(i=0;i<BUFFER_SIZE_DATAFLASH;i++){Buffer_Read_Dataflash[i]=Buffer_Dataflash[i];}

       //通过超级终端打印出部分读出的数据
       AT91F_DBGU_Printk("the read data is (only display 1056 byte):\n\r");
       for(i=0;i<1056;i++)
       {
        read_data[i]=Buffer_Read_Dataflash[i];
        sprintf((char*) message,"0x%X",read_data[i]);
	    AT91F_DBGU_Printk((char*)message);
       }
       AT91F_DBGU_Printk("the read data is finish ( 1056 byte):\n\r");

      //######################################################################################
      //######################################################################################
      //测试擦除读写一页
      /*
      //----------------------------擦除 DATAFLASH的某一页(第20页)------------------------
       AT91F_DBGU_Printk("Erase one pages!\n\r");
       //等待DATAFLASH准备好
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);
       //擦除DATAFLASH
       while(AT91F_DataFlashPageErase (&DataFlash,(unsigned char*)Buffer_Dataflash,(20*DataFlash.pDevice->pages_size),(DataFlash.pDevice->pages_size) )!=DATAFLASH_OK);
       //等待擦除完
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);

       AT91F_DBGU_Printk("Erase is finish!\n\r");

       //---------------------------写 DATAFLASH的某一页(第20页)---------------------------
       AT91F_DBGU_Printk("Write one pages(1056 byte)!\n\r");
       for(i=0;i<255;i++)
       {Buffer_Write_Dataflash[i]=i; Buffer_Dataflash[i]=Buffer_Write_Dataflash[i]; write_data[i]=Buffer_Write_Dataflash[i];}

       //通过超级终端打印出部分写入DATASHEET的数据
       AT91F_DBGU_Printk("the write data is (only display 255 byte):\n\r");
       for(i=0;i<255;i++)
       {
        sprintf((char*) message,"0x%X",write_data[i]);
	AT91F_DBGU_Printk((char*)message);
       }

       //补充满一业1056字节
        for(i=255;i<BUFFER_SIZE_DATAFLASH;i++)
       {
        Buffer_Write_Dataflash[i]=0xcc; Buffer_Dataflash[i]=Buffer_Write_Dataflash[i];
       }

       //等待DATAFLASH准备好
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);
       //写数据到DATAFLASH
       while(AT91F_DataFlashPagePgmBuf(&DataFlash,(unsigned char*)Buffer_Dataflash,(20*DataFlash.pDevice->pages_size),(DataFlash.pDevice->pages_size) )!=DATAFLASH_OK);
       //等待写完
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);

       AT91F_DBGU_Printk("the write 528 byte is finish!\n\r");

       //---------------------------读 DATAFLASH的某一页(第20页)-----------------------------
       AT91F_DBGU_Printk("Read one pages!\n\r");
       for(i=0;i<BUFFER_SIZE_DATAFLASH;i++) 	Buffer_Dataflash[i] = 0x00;	
       //等待DATAFLASH准备好
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);
       //从DATAFLASH读数据
       while(AT91F_DataFlashPageRead(&DataFlash,(20*DataFlash.pDevice->pages_size),(unsigned char*)Buffer_Dataflash,(DataFlash.pDevice->pages_size) )!=DATAFLASH_OK);
       //等待读完
       while(AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT)!=DATAFLASH_OK);

       for(i=0;i<BUFFER_SIZE_DATAFLASH;i++){Buffer_Read_Dataflash[i]=Buffer_Dataflash[i];}

       //通过超级终端打印出部分读出的数据
       AT91F_DBGU_Printk("the read data is (only display 255 byte):\n\r");
       for(i=0;i<255;i++)
       {
        read_data[i]=Buffer_Read_Dataflash[i];
        sprintf((char*) message,"0x%X",read_data[i]);
	AT91F_DBGU_Printk((char*)message);
       }
       AT91F_DBGU_Printk("the read data is finish (1056 byte):\n\r");

      //比较写入,与读出的数据
       AT91F_DBGU_Printk("begin to compare data!\n\r");

       //比较写入与读出的数据,如果不相等,则数据出错
       for(i=0;i<BUFFER_SIZE_DATAFLASH;i++)
       {
       if(Buffer_Read_Dataflash[i]!=Buffer_Write_Dataflash[i]) {AT91F_DBGU_Printk("the data is error--test is failure!\n\r"); break;}
       }

       if(i==BUFFER_SIZE_DATAFLASH) { AT91F_DBGU_Printk("the test is right!\n\r");}//写入如读出的数据相等

       //测试完,关闭SPI口
       AT91F_SPI_Close(AT91C_BASE_SPI1);
    */
     //####################################################################################################
     //####################################################################################################
   while(1)
     {
      wait(20);
      Trace_Toggel_LED(LED1);
      wait(20);
     }// End while
 }//* End


⌨️ 快捷键说明

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