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

📄 main.c

📁 at91rm9200的两线接口控制spi器件的例子
💻 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 + -