📄 eeprom.c
字号:
#ifndef _EEPROM_C_
#define _EEPROM_C_
#include "api.h"
#if _LCD_MENU_
/*E2PROM的读写操作*/
void _delay(void)
{
_nop_();_nop_();
}
void E2PROM_Delay()
{
BYTE delaytime;
for(delaytime=0x00;delaytime<0xf0;delaytime++)
_nop_();
for(delaytime=0x00;delaytime<0xf0;delaytime++)
_nop_();
for(delaytime=0x00;delaytime<0xf0;delaytime++)
_nop_();
for(delaytime=0x00;delaytime<0x80;delaytime++)
_nop_();
}
void I2C_start(void)
{
SDA=HIGH; _delay();
SCL=HIGH; _delay(); _nop_();
SDA=LOW; _delay();
SCL=LOW; _delay();
}
void I2C_stop(void)
{
SDA=LOW; _delay();
SCL=HIGH; _delay(); _nop_();
SDA=HIGH; _delay();
SCL=LOW; _delay();
}
BYTE I2C_clock(void)
{
BYTE sample;
SCL = HIGH; _delay(); _nop_();
sample = SDA;
SCL = LOW; _delay();
return sample;
}
BYTE I2C_send(BYTE I2C_data)
{
register BYTE i;
for(i=0; i<8; i++)
{
SDA = (I2C_data&0x80) ? HIGH : LOW;
I2C_data <<= 1;
I2C_clock();
}
SDA = HIGH;
return ~I2C_clock();
}
BYTE I2C_receive(void)
{
register BYTE i;
BYTE I2C_data = 0;
for(i=0; i<8; i++)
{
I2C_data <<= 1;
if(I2C_clock())
I2C_data++;
}
return I2C_data;
}
void I2C_Ack(void)
{
SDA = LOW;
I2C_clock();
SDA = HIGH;
}
BYTE I2C_ReadData(WORD MemAddr, WORD DatLen, BYTE* DatBuf)
{
BYTE idata I2C_DevAddr = 0, res = 0,temp;
WORD idata i;
I2C_start();
I2C_DevAddr = 0xa0;
I2C_DevAddr |= ((MemAddr/0x100)&0x07)<<1;
if(I2C_send(I2C_DevAddr) && I2C_send((BYTE)(MemAddr&0xff)))
{
I2C_start();
I2C_DevAddr |= 0x01;
if(I2C_send(I2C_DevAddr))
{
for(i=0; i<DatLen; i++)
{
DatBuf[i] = I2C_receive();
temp= DatBuf[i] ;
if(i==DatLen-1)
{
SDA = HIGH;
I2C_clock();
I2C_stop();
}
else
I2C_Ack();
}
res = 1;
}
else res = 0;
}
else res = 0;
if(res==0) I2C_stop();
return res;
}
BYTE I2C_Write16BData(WORD MemAddr, BYTE DatLen, BYTE* DatBuf)
{
BYTE idata I2C_DevAddr = 0, res = 0, i = 0;
I2C_start();
I2C_DevAddr = 0xa0;
I2C_DevAddr |= ((MemAddr/0x100)&0x07)<<1;
if(I2C_send(I2C_DevAddr) && I2C_send((BYTE)(MemAddr&0xff)))
{
do res = I2C_send(DatBuf[i++]);
while(res && i<DatLen);
I2C_stop();
}
else res = 0;
if(res==0) I2C_stop();
return res;
}
void I2C_WriteData(WORD MemAddr, WORD DatLen, BYTE* DatBuf)
{
WORD idata bMemAddr = 0;
BYTE idata i = 0 , Temp;
BYTE idata iCnt, DataCnt, DataiCnt, jCnt;
BYTE idata DataBuff[0x10];
DataCnt = (BYTE)(DatLen/0x10);
DataiCnt = (BYTE)(DatLen%0x10);
jCnt = 0;
for(iCnt=0; iCnt<(DataCnt+1); iCnt++,jCnt++)
{
bMemAddr = MemAddr+iCnt*0x10;
if(jCnt < DataCnt)
Temp = 0x10;
else Temp = DataiCnt;
for(i=0; i<Temp; i++)
DataBuff[i] = DatBuf[i+iCnt*0x10];
I2C_Write16BData(bMemAddr, Temp, DataBuff);
E2PROM_Delay();//16字节需要一个10ms延时
E2PROM_Delay();//16字节需要一个10ms延时
}
}
/*E2PROM读写操作*/
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -