📄 i2c.h
字号:
#ifndef _I2C_H_
#define _I2C_H_
sbit I2C_SCL = P1^0;
sbit I2C_SDA = P1^1;
bit ack;
void I2CStart ()
{
I2C_SDA = HIGH; //起始信号
_nop_ ();
I2C_SCL = HIGH;
_nop_ (); //建立时间大于4.7us
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SDA = LOW;
_nop_ (); //锁定时间大于4us
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SCL = LOW; //钳住总线
_nop_ ();
_nop_ ();
}
void I2CStop ()
{
I2C_SDA = LOW; //发送结束条件数据信号
_nop_ ();
I2C_SCL = HIGH;
_nop_ (); //建立时间大于4us
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SDA = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void I2CAck (bit a)
{
if (a == FALSE)
I2C_SDA = LOW;
else
I2C_SDA = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SCL = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SCL = LOW;
_nop_ ();
_nop_ ();
}
void SendByte (unsigned char c)
{
unsigned char data i;
for (i = 0; i < 8; i ++)
{
if ((c << i) & 0x80)
I2C_SDA = HIGH;
else
I2C_SDA = LOW;
_nop_ ();
I2C_SCL = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SCL = LOW;
}
_nop_ ();
_nop_ ();
I2C_SDA = HIGH;
_nop_ ();
_nop_ ();
I2C_SCL = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
if (I2C_SDA == HIGH)
ack = FALSE;
else
ack = TRUE;
I2C_SCL = LOW;
_nop_ ();
_nop_ ();
}
unsigned char RcvByte ()
{
unsigned char data ret,i;
ret = 0;
I2C_SDA = HIGH;
for (i = 0; i < 8; i ++)
{
_nop_ ();
I2C_SCL = LOW;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
I2C_SCL = HIGH;
_nop_ ();
_nop_ ();
ret <<= 1;
if (I2C_SDA == HIGH)
ret ++;
_nop_ ();
_nop_ ();
}
I2C_SCL = LOW;
_nop_ ();
_nop_ ();
return ret;
}
bit I2CSend (unsigned char sla, unsigned char suba, unsigned char c)
{
I2CStart ();
SendByte (sla);
if (ack == FALSE)
return FALSE;
SendByte (suba);
if (ack == FALSE)
return FALSE;
SendByte (c);
if (ack == FALSE)
return FALSE;
I2CStop ();
return TRUE;
}
/*
bit I2CReceive (unsigned char sla, unsigned char *c)
{
I2CStart ();
SendByte (sla + 1);
if (ack == FALSE)
return FALSE;
*c = RcvByte ();
I2CAck (TRUE);
I2CStop ();
return TRUE;
}
*/
bit I2CSendBuf (unsigned char sla,unsigned char suba,unsigned char *buf,unsigned char num) reentrant
{
unsigned char data i;
I2CStart (); //启动总线
SendByte (sla); //发送器件地址
if (ack == FALSE)
return FALSE;
SendByte (suba); //发送器件子地址
if (ack == FALSE)
return FALSE;
for (i = 0; i<num; i ++)
{
SendByte (*buf); //发送数据
if (ack == FALSE)
return FALSE;
buf ++;
}
I2CStop(); //结束总线
return TRUE;
}
bit I2CRcvBuf (unsigned char sla,unsigned char suba,unsigned char *buf,unsigned char num) reentrant
{
unsigned char data i;
I2CStart (); //启动总线
SendByte(sla); //发送器件地址
if (ack == FALSE)
return FALSE;
SendByte(suba); //发送器件子地址
if (ack == FALSE)
return FALSE;
I2CStart ();
SendByte (sla + 1);
if (ack == FALSE)
return FALSE;
for (i = 0; i < num - 1; i++)
{
*buf = RcvByte (); //发送数据
I2CAck (FALSE); //发送就答位
buf ++;
}
*buf = RcvByte ();
I2CAck (TRUE); //发送非应位
I2CStop (); //结束总线
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -