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

📄 eeprom.c

📁 at91rm9200 的rom程序
💻 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           : TWI EEPROM driver//* Object              ://* Translator          ://* 1.0 19/03/01 HI		: Creation//*--------------------------------------------------------------------------------------#include "appli\includes\main.h"#include "services\obj_romboot.h"#include "appli\includes\eeprom.h"//*=========================================================//*		INIT//*=========================================================//*----------------------------------------------------------------------------//* Function Name       : EEPROM_Init//* Object              ://* Input Parameters    ://* Output Parameters   ://*----------------------------------------------------------------------------void EEPROM_Init(const AT91PS_TWIDesc pTwiDesc){	int sclock;	at91_TWI_open(APMC_BASE, pTwiDesc, 0);	pTwiDesc->TWI_base->TWI_CR	= TWI_SWRST;					// SWRST	pTwiDesc->TWI_base->TWI_CR	= (TWI_SVDIS + TWI_MSEN);		// SVDIS + MSEN	pTwiDesc->TWI_base->TWI_MMR	= (TWI_MREAD | TWI_IADRSZ_2INT_ADDR | 0x00500000);	/* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/	sclock = (10*MASTER_CLOCK /EEPROM_CLOCK);	if (sclock % 10 >= 5)		sclock = (sclock /10) - 5;	else		sclock = (sclock /10)- 6;	sclock = (sclock + (4 - sclock %4)) >> 2;	// div 4    pTwiDesc->TWI_base->TWI_CWGR	= 0x00010000 | sclock | (sclock << 8);}//*=========================================================//*		WRITE//*=========================================================//*----------------------------------------------------------------------------//* Function Name       : TWI_WriteByte//* Object              ://* Input Parameters    ://* Output Parameters   ://*----------------------------------------------------------------------------int TWI_WriteByte(const AT91PS_TWIDesc pTwiDesc ,int address, char data2send){	int Status;	unsigned int tick;    pTwiDesc->TWI_base->TWI_MMR		= (TWI_MWRITE | TWI_IADRSZ_2INT_ADDR | 0x00500000);	// 0x00500200: Write with 2 internal @        pTwiDesc->TWI_base->TWI_IADR	= address;			// Write avec 2 internal @	pTwiDesc->TWI_base->TWI_THR		= data2send;		// Internal add high    pTwiDesc->TWI_base->TWI_CR		= TWI_START + TWI_STOP;		// START+STOP    Status = pTwiDesc->TWI_base->TWI_SR;		tick = GetTickCount();    while (!(Status  & TWI_TXCOMP) && (GetTickCount() < (tick + EEPROM_TIMEOUT_WRITE) )) 		// Wait TXcomplete ...    {		if (Status  & TWI_ERROR)		{		// Si Under run OR NACK Start again	    	pTwiDesc->TWI_base->TWI_CR	= TWI_START + TWI_STOP;	// START again		}		Status = pTwiDesc->TWI_base->TWI_SR;    }	if (Status  & TWI_TXCOMP)		return EEPROM_WRITE_OK;	return ERR_EEPROM_WRITE;}//*----------------------------------------------------------------------------//* Function Name       : TWI_WritePage//* Object              ://* Input Parameters    ://* Output Parameters   ://*----------------------------------------------------------------------------int TWI_WritePage(const AT91PS_TWIDesc pTwiDesc, int address, char *buffer){	int	Status,count ;	unsigned int tick;    pTwiDesc->TWI_base->TWI_MMR		= (TWI_MWRITE | TWI_IADRSZ_2INT_ADDR | 0x00500000);			// Write with 2 internal @    pTwiDesc->TWI_base->TWI_IADR	= address;				// Write with 2 internal @    pTwiDesc->TWI_base->TWI_CR		= TWI_START;			// START    count = 0;    	tick = GetTickCount();	    while ((count < EEPROM_PAGE_SIZE) && (GetTickCount() < (tick + EEPROM_TIMEOUT_WRITE) ) )    {		Status = pTwiDesc->TWI_base->TWI_SR;		if (Status & TWI_ERROR)		{	    	pTwiDesc->TWI_base->TWI_THR	= (char)*buffer;	   	 	pTwiDesc->TWI_base->TWI_CR	= TWI_START;		// START	    	count = 0;		}		else		{		    if (Status & TWI_TXRDY)		    {				pTwiDesc->TWI_base->TWI_THR	= (char)*buffer;				count ++;			    buffer++;				tick = GetTickCount();			    	    	}		}    }    pTwiDesc->TWI_base->TWI_CR	= TWI_STOP;				// STOP	if (count < EEPROM_PAGE_SIZE)		return ERR_EEPROM_WRITE;	while(!(pTwiDesc->TWI_base->TWI_SR & TWI_TXCOMP)) ;	return EEPROM_WRITE_OK;}//*=========================================================//*		READ//*=========================================================//*----------------------------------------------------------------------------//* Function Name       : TWI_ReadByte//* Object              ://* Input Parameters    ://* Output Parameters   ://*----------------------------------------------------------------------------int TWI_ReadByte(const AT91PS_TWIDesc pTwiDesc , int address, char *data){	int Status;	unsigned int tick;    pTwiDesc->TWI_base->TWI_MMR		= (TWI_MREAD | TWI_IADRSZ_2INT_ADDR | 0x00500000);	//0x00501200: Read with 2 internal @    pTwiDesc->TWI_base->TWI_IADR	= address;	pTwiDesc->TWI_base->TWI_CR		= TWI_START + TWI_STOP;	// START+STOP    Status = pTwiDesc->TWI_base->TWI_SR;		//* Wait TXcomplete ...	tick = GetTickCount();    while (!(Status  & TWI_TXCOMP) && (GetTickCount() < (tick + EEPROM_TIMEOUT_READ) )) 		// Wait TXcomplete ...    	Status = pTwiDesc->TWI_base->TWI_SR;	if (Status  & TWI_TXCOMP) {		*data = (char)(pTwiDesc->TWI_base->TWI_RHR);		return (EEPROM_READ_OK);	}	return ERR_EEPROM_READ;}//*----------------------------------------------------------------------------//* Function Name       : EEPROM_SeqRead//* Object              ://* Input Parameters    ://* Output Parameters   ://*----------------------------------------------------------------------------int EEPROM_SeqRead(const AT91PS_TWIDesc pTwiDesc, int address, char *buffer, int size){	int	Status,count ;	unsigned int tick;		TWI_ReadByte(pTwiDesc , address, &buffer[0]);    pTwiDesc->TWI_base->TWI_MMR		= (TWI_MREAD | TWI_IADRSZ_2INT_ADDR | 0x00500000);			// Write with 2 internal @        pTwiDesc->TWI_base->TWI_IADR	= address;				// Write avec 2 internal @    pTwiDesc->TWI_base->TWI_CR		= TWI_START;			// START    count = 0;	tick = GetTickCount();    while ((count < size) && (GetTickCount() < (tick + EEPROM_TIMEOUT_READ)))    {		Status = pTwiDesc->TWI_base->TWI_SR;	    if (Status & TWI_RXRDY)	    {			*buffer = (char)(pTwiDesc->TWI_base->TWI_RHR);			count ++;		    buffer++;   			tick = GetTickCount();    	}    	else    	{    		if( Status & TWI_ERROR)    			break;    	}    }    pTwiDesc->TWI_base->TWI_CR	= TWI_STOP;				// STOP	if (count < size)		return ERR_EEPROM_READ;	while(!(pTwiDesc->TWI_base->TWI_SR & TWI_TXCOMP) );	if (pTwiDesc->TWI_base->TWI_SR & TWI_TXCOMP)		return EEPROM_READ_OK;	return ERR_EEPROM_READ;}//*----------------------------------------------------------------------------//* Function Name       : TWI_ReadPage//* Object              ://* Input Parameters    :AT91PS_TWIDesc, address, *buffer//* Output Parameters   :result //*----------------------------------------------------------------------------int TWI_ReadPage(const AT91PS_TWIDesc pTwiDesc, int address, char *buffer){	int j;		for (j = 0; j < EEPROM_PAGE_SIZE ; j ++)	{		if(TWI_ReadByte(pTwiDesc, j, &buffer[j]) != EEPROM_READ_OK)			return ERR_EEPROM_READ_PAGE;	}	return EEPROM_READ_PAGE_OK;}

⌨️ 快捷键说明

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