📄 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
//* Creation : FB 21/11/2002
//* 1.1 31/03/03 JPP : Add test ready in AT91F_Test
//*----------------------------------------------------------------------------
#include <stdio.h>
#include "AT91C_SPI_DataFlash.h"
#define AT91C_SPI_PCS0_SERIAL_DATAFLASH 0xE /* Chip Select 0 : NPCS0 %1110 */
#define AT91C_SPI_PCS3_DATAFLASH_CARD 0x7 /* Chip Select 3 : NPCS3 %0111 */
#define AT91C_DATAFLASH_TIMEOUT 10000 /* For AT91F_DataFlashWaitReady */
#define BUFFER_SIZE_DATAFLASH 1056
#define MASTER_CLOCK 60000000
//* External Functions
extern void AT91F_DBGU_Printk(char *);
extern void AT91F_ASM_SPI_Handler(void);
extern AT91S_DataFlashStatus AT91F_DataFlashGetStatus(AT91PS_DataflashDesc);
extern void AT91F_DataFlashHandler(AT91PS_DataflashDesc,unsigned int);
extern AT91S_DataFlashStatus AT91F_DataFlashPageRead(AT91PS_DataFlash,unsigned int,unsigned char*,int);
extern AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(AT91PS_DataFlash,unsigned char *,unsigned int,unsigned int);
//* Global Variables
AT91S_DataflashFeatures DeviceAT45DB;
AT91S_DataflashFeatures DeviceAT45DCB;
AT91S_DataflashDesc DataflashDesc;
AT91S_DataFlash DataFlash;
char Buffer_Dataflash[BUFFER_SIZE_DATAFLASH];
//*----------------------------------------------------------------------------
//* \fn AT91F_DataFlashWaitReady
//* \brief wait for dataflash ready (bit7 of the status register == 1)
//*----------------------------------------------------------------------------
AT91S_DataFlashStatus AT91F_DataFlashWaitReady(AT91PS_DataflashDesc pDataFlashDesc, unsigned int timeout)
{
unsigned int i;
pDataFlashDesc->DataFlash_state = IDLE;
do
{
AT91F_DataFlashGetStatus(pDataFlashDesc);
timeout--;
// dummy waiting time
for(i=0;i<10;i++);
}
while( ((pDataFlashDesc->DataFlash_state & 0x80) != 0x80) && (timeout>0) );
if((pDataFlashDesc->DataFlash_state & 0x80) != 0x80)
return DATAFLASH_ERROR;
return DATAFLASH_OK;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Test
//* \brief Test Functions
//*----------------------------------------------------------------------------
void AT91F_Test(void)
{
int i;
//* Wait DataFlash Ready
AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT);
//* Read Page 1
for(i=0;i<BUFFER_SIZE_DATAFLASH;i++) Buffer_Dataflash[i] = 0x00;
AT91F_DataFlashPageRead(&DataFlash,(1*DataFlash.pDevice->pages_size),(unsigned char*)Buffer_Dataflash,(DataFlash.pDevice->pages_size) );
//* Wait end of Read
AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT);
//* Write Page 1
sprintf(Buffer_Dataflash,"\n\rThis sentence is written in your DataFlash... Congratulations\n\r");
AT91F_DataFlashPagePgmBuf(&DataFlash,(unsigned char*)Buffer_Dataflash,(1*DataFlash.pDevice->pages_size),(DataFlash.pDevice->pages_size) );
//* Wait end of Write
AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT);
//* Read Page 1
for(i=0;i<BUFFER_SIZE_DATAFLASH;i++) Buffer_Dataflash[i] = 0x00;
AT91F_DataFlashPageRead(&DataFlash,(1*DataFlash.pDevice->pages_size),(unsigned char*)Buffer_Dataflash,(DataFlash.pDevice->pages_size) );
//* Wait end of Read
AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT);
//* End Of Test
AT91F_DBGU_Printk("\n\rTests Completed: !!!\n\r");
if (Buffer_Dataflash[0]!= 0xff)
{
AT91F_DBGU_Printk(Buffer_Dataflash);
}
else
{
AT91F_DBGU_Printk("\n\rData flash NOT Ready: !!!\n\r");
}
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Test_AT45DB
//* \brief Configure SPI for Serial DataFlash init, then jump to Test Functions
//*----------------------------------------------------------------------------
void AT91F_Test_AT45DB(void)
{
//* Switch on DataFlash Card AT45DB:
//* 1. On CS0 for AT91F_SPI_CfgPCS
//* 2. On DeviceAT45DB for AT91S_DataflashFeatures structure
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,AT91C_SPI_PCS0_SERIAL_DATAFLASH);
DataFlash.pDevice = &DeviceAT45DB;
//* Wait DataFlash Ready
AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT);
// Enter Main Tests
AT91F_Test();
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Test_AT45DCB
//* \brief Configure SPI for DataFlash Card init, then jump to Test Functions
//*----------------------------------------------------------------------------
void AT91F_Test_AT45DCB(void)
{
//* Switch on DataFlash Card AT45DCB:
//* 1. On CS3 for AT91F_SPI_CfgPCS
//* 2. On DeviceAT45DCB for AT91S_DataflashFeatures structure
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,AT91C_SPI_PCS3_DATAFLASH_CARD);
DataFlash.pDevice = &DeviceAT45DCB;
//* Wait DataFlash Ready
AT91F_DataFlashWaitReady(DataFlash.pDataFlashDesc,AT91C_DATAFLASH_TIMEOUT);
// Enter Main Tests
AT91F_Test();
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SPI_CfgSPI
//* \brief Config SPI IP
//*----------------------------------------------------------------------------
void AT91F_SPI_CfgSPI(void)
{
//* Reset the SPI
AT91F_SPI_Reset(AT91C_BASE_SPI);
//* Configure SPI in Master Mode with No CS selected !!!
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCS);
//* Configure SPI CS0 for Serial DataFlash AT45DBxx
AT91F_SPI_CfgCs(0, AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & 0x100000) | ((MASTER_CLOCK / (2*DATAFLASH_CLK)) << 8));
//* Configure SPI CS3 for DataFlash Card AT45DCBxx
AT91F_SPI_CfgCs(3, AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & 0x100000) | ((MASTER_CLOCK / (2*DATAFLASH_CLK)) << 8));
//* Enable the SPI
AT91F_SPI_Enable(AT91C_BASE_SPI);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_CfgDataFlash
//* \brief Config DataFlash Structures
//*----------------------------------------------------------------------------
void AT91F_CfgDataFlash (void)
{
// Init AT91S_DataflashFeatures Structure for AT45DB642
DeviceAT45DB.pages_number = 8192;
DeviceAT45DB.pages_size = 1056;
DeviceAT45DB.page_offset = 11;
DeviceAT45DB.byte_mask = 0x700;
// Init AT91S_DataflashFeatures Structure for AT45DCB004 <=> AT45DB321B
DeviceAT45DCB.pages_number = 8192;
DeviceAT45DCB.pages_size = 528;
DeviceAT45DCB.page_offset = 10;
DeviceAT45DCB.byte_mask = 0x300;
// Init AT91S_DataflashFeatures Structure for AT45DCB002 <=> AT45DB161B
/* DeviceAT45DCB.pages_number = 4096;
DeviceAT45DCB.pages_size = 528;
DeviceAT45DCB.page_offset = 10;
DeviceAT45DCB.byte_mask = 0x300; */
// Init AT91S_DataflashDesc Structure
DataflashDesc.state = IDLE;
DataflashDesc.DataFlash_state = IDLE;
// Init AT91S_DataFlash Global Structure, by default AT45DB choosen !!!
DataFlash.pDataFlashDesc = &DataflashDesc;
DataFlash.pDevice = &DeviceAT45DB;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_CfgSPIForDataFlash
//* \brief This function initialize SPI for Two ranges of DataFlash:
//* \brief SeriAl DataFlash AT45DB on CS0 AND DataFlash Card AT45DCB on CS3
//*----------------------------------------------------------------------------
void AT91F_CfgSPIForDataFlash()
{
// ============================= Init SPI Interface =============================
AT91F_DBGU_Printk("\n\rInit SPI Interface\n\r");
// Set up PIO SDC_TYPE to switch on DataFlash Card and not MMC/SDCard
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91C_PIO_PB7);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,AT91C_PIO_PB7);
// Init SPI for DataFlash interface
AT91F_SPI_CfgPIO();
AT91F_SPI_CfgPMC();
AT91F_SPI_CfgSPI();
AT91F_PDC_Open(AT91C_BASE_PDC_SPI);
AT91F_CfgDataFlash();
// Configure SPI interrupt
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
AT91C_ID_SPI,
AT91C_AIC_PRIOR_HIGHEST,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
AT91F_ASM_SPI_Handler);
// Enable SPI interrupt
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SPI);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SPI_Handler
//* \brief SPI Handler
//*----------------------------------------------------------------------------
void AT91F_SPI_Handler(void)
{
int status;
status = ( AT91C_BASE_SPI->SPI_SR & AT91C_BASE_SPI->SPI_IMR );
AT91F_DataFlashHandler(DataFlash.pDataFlashDesc, status);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_DBGU_getc
//* \brief This function is used to receive a character to the DBGU channel
//*----------------------------------------------------------------------------
char AT91F_DBGU_getc(void)
{
while (!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU));
return AT91F_US_GetChar((AT91PS_USART) AT91C_BASE_DBGU);
}
//*----------------------------------------------------------------------------
//* \fn main
//* \brief main function
//*----------------------------------------------------------------------------
int main()
{
unsigned char caractere;
AT91F_DBGU_Printk("\n\n\r======================================");
AT91F_DBGU_Printk("\n\rAT91RM9200 SPI DataFlash Test\n\r");
AT91F_DBGU_Printk("======================================\n\r");
//* Init SPI for DataFlash Devices
AT91F_CfgSPIForDataFlash();
///////////////////////////////////////////////////////////////////////////////////////////
// Enter Test Menu
///////////////////////////////////////////////////////////////////////////////////////////
// Enable Receiver
AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
while(1)
{
AT91F_DBGU_Printk("\n\rTest SPI Device\n\r1:Test Serial DataFlash AT45DB\n\r2:Test DataFlash Card AT45DCB\n\r");
// Wait for User Choice : 1 <=> Enter Test Serial DataFlash , 2 <=> Enter Test DataFlash Card
caractere = AT91F_DBGU_getc();
switch(caractere)
{
case '1':
AT91F_DBGU_Printk("\n\rEnter Test Serial DataFlash\n\r");
AT91F_Test_AT45DB();
break;
case '2':
AT91F_DBGU_Printk("\n\rEnter Test DataFlash Card in SD/MMC Card Interface Connector\n\r");
AT91F_Test_AT45DCB();
break;
default:
AT91F_DBGU_Printk("\n\rBad choice, Retry please\n\r");
break;
}
}
}
//* EOF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -