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