?? eeprom.h
字號(hào):
//**********************************************************************//
// EEprom讀寫函數(shù) //
// //
// //
//**********************************************************************//
static bit _F0;
static volatile bit _SDA @ (unsigned)&PORTC*8+4;
static volatile bit _SCL @ (unsigned)&PORTC*8+3;
//***************************************
// 啟動(dòng)I2C總線的函
//***************************************
void I2C_Start(void)
{
//啟動(dòng)I2C總線的函數(shù),當(dāng)SCL為高電平時(shí)使SDA產(chǎn)生一個(gè)負(fù)跳變
_SDA=1;
_SCL=1;
DelayUs(DELAY_TIME);
_SDA=0;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 終止I2C總線
//***************************************
void I2C_Stop(void)
{
//終止I2C總線,當(dāng)SCL為高電平時(shí)使SDA產(chǎn)生一個(gè)正跳變
_SDA=0;
_SCL=1;
DelayUs(DELAY_TIME);
_SDA=1;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 發(fā)送0
//***************************************
void SEND_0(void) // SEND ACK
{
//發(fā)送0,在SCL為高電平時(shí)使SDA信號(hào)為低
_SDA=0;
_SCL=1;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 發(fā)送1
//***************************************
void SEND_1(void)
{
//發(fā)送1,在SCL為高電平時(shí)使SDA信號(hào)為高
_SDA=1;
_SCL=1;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 發(fā)送完一個(gè)字節(jié)后檢驗(yàn)設(shè)備的應(yīng)答信號(hào)
//***************************************
bit Check_Acknowledge(void)
{
//發(fā)送完一個(gè)字節(jié)后檢驗(yàn)設(shè)備的應(yīng)答信號(hào)
_SDA=1;
_SCL=1;
TRISC!=0x10; //改變端口的方向
DelayUs(DELAY_TIME/2);
_F0=_SDA;
DelayUs(DELAY_TIME/2);
_SCL=0;
DelayUs(DELAY_TIME);
TRISC&=0xEF;
if(_F0)
return FALSE;
return TRUE;
}
//***************************************
// 向I2C總線寫一個(gè)字節(jié)
//***************************************
void WriteI2CByte(char b)
{
//向I2C總線寫一個(gè)字節(jié)
char i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
//***************************************
// 從I2C總線讀一個(gè)字節(jié)
//***************************************
unsigned char ReadI2CByte(void)
{
//從I2C總線讀一個(gè)字節(jié)
char b=0,i;
for(i=0;i<8;i++)
{
_SDA=1; //釋放總線
TRISC|=0x10;
_SCL=1; //接受數(shù)據(jù)
DelayUs(10);
_F0=_SDA;
DelayUs(10);
_SCL=0;
if(_F0)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
TRISC&=0xEF; //改變端口的方向
DelayUs(10);
return b;
}
//**********以下為讀寫24c02的函數(shù)**********/
//*******************************************
// 向24C02寫一個(gè)字節(jié)
//*******************************************
void Write_One_Byte(char addr,char thedata)
{
static bit acktemp;
/*write a byte to mem*/
acktemp=1;
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata);/*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
}
//*******************************************
// 向24C02寫一個(gè)頁(8字節(jié))
//*******************************************
void Write_A_Page(char *buffer,char addr)
{
static bit acktemp;
// static bit wrtmp;
int i;
acktemp=1;
/*write a page to at24c02*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
for(i=0;i<8;i++)
{
WriteI2CByte(buffer[i]);
if(!Check_Acknowledge())
{
I2C_Stop();
}
}
I2C_Stop();
}
//***************************************
// 從24C02處讀取一個(gè)字節(jié)
//***************************************
char Read_One_Byte(char addr)
{
static bit acktemp;
char mydata;
//read a byte from mem*/
acktemp=1;
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
I2C_Stop();
return mydata;
}
//*******************************************
// 從24C02讀N個(gè)字節(jié)
//*******************************************
void Read_N_Bytes(char *buffer,char n,char addr)
{
static bit acktemp;
int i=0;
acktemp=1;
/*read 8 bytes from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
for(i=0;i<n;i++)
{
buffer[i]=ReadI2CByte();
if(i!=n-1)
SEND_0(); //發(fā)送應(yīng)答*/
else
SEND_1(); //發(fā)送非應(yīng)答*/
}
I2C_Stop();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -