?? i2c.h
字號:
#ifndef _I2C_H_
#define _I2C_H_
#define I2C_ACK 0
#define I2C_NOACK 1
#define I2C_RD_ERROR 0x20
#define I2C_RD_BUSY 0x30
#define I2C_WR_ERROR 0x10
#define EVENT_COM 0xe0
#define IC24C02_DEVICE_NUM 0xA0
sbit P_SDA = P2^3;
sbit P_SCL = P2^2;
typedef unsigned char BYTE;
//聲明函數
void I2cDelay(void);
void I2cStart(void);
void I2cStop(void);
unsigned char I2cGetAck(void);
void I2cWaitAck(void);
void I2cSetAck(unsigned char Hi);
void I2cWriteByte(BYTE nData);
BYTE I2cReadByte(void);
unsigned char I2cWrite(BYTE nDev,BYTE nAddr,BYTE nData);
unsigned char I2cRead(BYTE nDev,BYTE nAddr,BYTE *val);
//===================================================
// I2C延時
//===================================================
void I2cDelay(void)
{
BYTE i;
for(i = 0; i < 50; i++);
}
//===================================================
// I2c開始
//===================================================
void I2cStart(void)
{
P_SDA = 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
P_SDA = 0;
I2cDelay();
P_SCL = 0;
I2cDelay();
}
//===================================================
// I2c停止
//===================================================
void I2cStop(void)
{
P_SDA = 0;
I2cDelay();
P_SCL = 1;
I2cDelay();
P_SDA = 1;
I2cDelay();
}
//===================================================
// I2c讀應答
//===================================================
unsigned char I2cGetAck(void)
{
unsigned char iAck = 0;
P_SDA = 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
iAck = ((P_SDA)?0:1);
I2cDelay();
P_SCL = 0;
I2cDelay();
return iAck;
}
//===================================================
// I2c讀應答
//===================================================
void I2cWaitAck(void)
{
P_SDA = 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
while(P_SDA)
{
I2cDelay();
}
P_SCL = 0;
I2cDelay();
}
//===================================================
// I2c 主應答
//===================================================
void I2cSetAck(unsigned char Hi)
{
P_SDA = Hi;
I2cDelay();
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
}
//===================================================
// I2C 寫入一個字節
//===================================================
void I2cWriteByte(BYTE nData)
{
BYTE i;
for(i = 0;i < 8;i ++)
{
if(nData & 0x80)
{
P_SDA = 1;
}
else
{
P_SDA = 0;
}
I2cDelay();
nData <<= 1;
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
}
//===================================================
// I2c讀取一個字節
//===================================================
BYTE I2cReadByte(void)
{
BYTE nData = 0;
BYTE i = 0;
for(i = 0;i < 8;i ++)
{
nData <<= 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
if(P_SDA)
{
nData |= 1;
}
else
{
nData &= 0xfe;
}
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
return nData;
}
//===================================================
// 寫I2C設備
//===================================================
unsigned char I2cWrite(BYTE nDev,BYTE nAddr,BYTE nData)
{
unsigned char iAck = 0;
I2cStart();
I2cWriteByte(nDev);
iAck = I2cGetAck();
if(!iAck)
return 0;
I2cWriteByte(nAddr);
iAck = I2cGetAck();
if(!iAck)
return 0;
I2cWriteByte(nData);
iAck = I2cGetAck();
if(!iAck)
return 0;
I2cStop();
return 1;
}
//===================================================
// 讀I2C設備
//===================================================
unsigned char I2cRead(BYTE nDev,BYTE nAddr ,BYTE *val)
{
unsigned char iAck = 0;
*val = 0;
I2cStart();
I2cWriteByte(nDev);
iAck = I2cGetAck();
if(!iAck)
return 0;
I2cWriteByte(nAddr);
iAck = I2cGetAck();
if(!iAck)
return 0;
I2cStart();
I2cWriteByte(nDev | 0x01);
iAck = I2cGetAck();
if(!iAck)
return 0;
*val = I2cReadByte();
I2cSetAck(0);
I2cStop();
return 1;
}
#endif
/*EOF*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -