📄 eeprom.c
字号:
/**********************************************************************
*File Name : eeprom.c
*Creat Time : 2002/02/11
*Program Author : mqli
*File Discreption :
*
************************************************************************/
#include "common.h"
#include "Var.h"
#include "main.h"
#include "eeprom.h"
BOOL IICWriteWaitAcknowlodge(void);
unsigned char IICrxbyte(void);
void IICstart(void);
void IICstop(void);
void IICReadAcknowledge(void);
void IICtxbyte(U8 DateByte);
void Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value);
void IICstart(void)
{
#if 0
EEPROM_CLK_1;
EEPROM_DATA_1;
Delay_xuS(1);
EEPROM_DATA_0;
Delay_xuS(1);
#else
EEPROM_CLK_0;
Delay_xuS(1);
EEPROM_DATA_1;
Delay_xuS(1);
EEPROM_CLK_1;
Delay_xuS(1);
EEPROM_DATA_0;
Delay_xuS(1);
EEPROM_CLK_0;
Delay_xuS(1);
#endif
}
void IICstop(void)
{
#if 0
EEPROM_CLK_0;
EEPROM_DATA_0;
Delay_xuS(1);
EEPROM_CLK_1;
Delay_xuS(1);
EEPROM_DATA_1;
#else
Delay_xuS(1);
EEPROM_CLK_0;
Delay_xuS(1);
EEPROM_DATA_0;
Delay_xuS(1);
EEPROM_CLK_1;
Delay_xuS(1);
EEPROM_DATA_1;
Delay_xuS(1);
#endif
}
void IICReadAcknowledge(void)
{
EEPROM_CLK_0;
EEPROM_DATA_0;
Delay_xuS(1);
EEPROM_CLK_1;
Delay_xuS(1);
EEPROM_CLK_0;
EEPROM_DATA_1;
}
BOOL IICWriteWaitAcknowlodge(void)
{
BOOL WriteSuccessFlag=FALSE;
EEPROM_CLK_1;
WriteSuccessFlag=(EEPROM_DATA)?FALSE:TRUE;
EEPROM_CLK_0;
if ( WriteSuccessFlag==FALSE )
{
Delay_xuS(1);
}
return WriteSuccessFlag;
}
void IICtxbyte(U8 DataByte)
{
EX_DATA U8 BitMast;
for(BitMast=0x80;BitMast>0;BitMast>>=1)
{
if (DataByte&BitMast)
EEPROM_DATA_1;
else
EEPROM_DATA_0;
Delay_xuS(1);
Delay_xuS(1);
EEPROM_CLK_1;
Delay_xuS(1);
Delay_xuS(1);
EEPROM_CLK_0;
}
EEPROM_DATA_1;
// IIC_SDA=1; // data high, ask for acknowledge signal
// IIC_SCL=1; // clock high
// btmask=IIC_SDA; // btmask=0:ok,otherwise not ok.
// IIC_SCL=0; // clock low
// return btmask;
}
unsigned char IICrxbyte(void)
{
EX_DATA U8 ReceiveByte=0,i;
EEPROM_DATA_1;
for(i=0;i<8;i++)
{
EEPROM_CLK_1;
ReceiveByte<<=1;
ReceiveByte|=EEPROM_DATA;
EEPROM_CLK_0;
Delay_xuS(1);
}
return ReceiveByte;
}
/* Read EEPROM content */
void ReadXEEprom(U8 * bufptr, U16 eepadr, U8 cnt)
{
DE_DATA unsigned char errcnt;
errcnt=0;
while(1)
{
IICstart(); // IIC start condition
IICtxbyte(0xa0+((U8)(eepadr/128)&0x0e)); // transmit EEPROM IIC address //the eeprom is below 512 bits
if (IICWriteWaitAcknowlodge()==TRUE) break;
errcnt++;
if (errcnt>5)
{
IICstop();
return;
}
}
IICtxbyte((U8)eepadr);
IICWriteWaitAcknowlodge(); // acknowledge
IICstart(); // IIC start condition
IICtxbyte(0xa1+((U8)(eepadr/128)&0x0e)); // transmit EEPROM IIC address
IICWriteWaitAcknowlodge(); // acknowledge
while (1)
{
*bufptr=0;
*bufptr=IICrxbyte();
cnt--;
if (cnt==0) break;
IICReadAcknowledge(); // acknowledge
bufptr++;
}
Delay_xuS(1);
IICstop();
}
void WriteEEprom(U16 eeaddr, U8 dat)
{
DE_DATA unsigned char errcnt;
errcnt=0;
while(1)
{
IICstart(); // IIC start condition
IICtxbyte(0xa0+((U8)(eeaddr/128)&0x0e)); // transmit EEPROM IIC address //the eeprom is below 512 bits
if (IICWriteWaitAcknowlodge()==TRUE) break;
errcnt++;
if (errcnt>5)
{
IICstop();
return;
}
}
/* IICtxbyte((U8)eepadr);
IICstart(); // IIC start condition
IICtxbyte(0xa0+((U8)(eeaddr/128)&0x0e)); // transmit EEPROM IIC address
IICWriteWaitAcknowlodge();*/ // acknowledge
IICtxbyte((U8)eeaddr); //write the address onchip
IICWriteWaitAcknowlodge(); // acknowledge
IICtxbyte(dat); // transmit EEPROM data
IICWriteWaitAcknowlodge(); // acknowledge
IICstop(); // IIC stop condition
Delay_xmS(10);
}
/*******************************************************
for fast write fuction
care that some chip limit the total bytes of one write cycle
1K,2K=8 4K,8K,16K=16
************************************************************/
void WriteXEEprom(U8 * bufptr, U16 eepadr, U8 cnt)
{
DE_DATA unsigned char errcnt,temp;
errcnt=0;
while(1)
{
IICstart(); // IIC start condition
IICtxbyte(0xa0+((U8)(eepadr/128)&0x0e)); // transmit EEPROM IIC address //the eeprom is below 512 bits
if (IICWriteWaitAcknowlodge()==TRUE) break;
errcnt++;
if (errcnt>5)
{
IICstop();
return;
}
}
IICtxbyte((U8)eepadr); //write the address onchip
IICWriteWaitAcknowlodge(); // acknowledge
while(cnt)
{
temp=*bufptr;
IICtxbyte(temp); // transmit EEPROM data
IICWriteWaitAcknowlodge(); // acknowledge
bufptr++;
cnt--;
}
IICstop(); // IIC stop condition
Delay_xmS(10);
}
//save the preset var
void Write_Preset_Channel_Information(U8 channel,U16 frequence,U8 radio_band,BOOL is_stereo)
{
WriteEEprom(EEPAddress_Preset_channal_Freq_Base+channel*2 ,(U8)(frequence) );
WriteEEprom(EEPAddress_Preset_channal_Freq_Base+channel*2+1,(U8)(frequence>>8));
WriteEEprom(EEPAddress_Preset_channal_Band_Base+channel,radio_band);
WriteEEprom(EEPAddress_Preset_channal_Stereo_Base+channel,is_stereo);
}
void Check_EEProm_Var_Validity(void)
{
}
void Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value)
{
if( (*var_address>Max_Value)||(*var_address<Min_Value) )
*var_address=Normal_Value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -