📄 iic.h
字号:
/*------------------------------------------------------------------------------------------
[文件名] IIC.H
[版本] 1.0
[作者] 陈彬
[最后修改时间] 2007年5月01日
[版权所有] www.mcucore.com
===========================================================================================*/
#ifndef IIC_H
#define IIC_H
extern unsigned char SystemError;
sbit SCL= P1^3; //定义串行时钟线
sbit SDA= P1^4; //定义串行数据线
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
调用方式:void I2CStart(void) 2007/05/01
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2cStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
SDA=0; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStop(void) 2007/05/01
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2cStop(void)
{
SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
SCL=1; SomeNOP();
SDA=1; SomeNOP();
EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2007/05/01
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(bit a)
{
if(a==0)SDA=0; /*在此发出应答或非应答信号 */
else SDA=1;
SomeNOP();
SCL=1;
SomeNOP(); /*时钟低电平周期大于4μs*/
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
// _Nop();
// _Nop();
}
/*--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫2007/05/01
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
WaitAck(void)
{
BYTE errtime=20;//因故障接收方无ACK,超时值为255。
SDA=1;SomeNOP();
SCL=1;SomeNOP();
//while(SDA) {errtime--;if (!errtime) {I2cStop();SystemError=0x11;}}
SCL=0;
SomeNOP();
}
/**--------------------------------------------------------------------------------
调用方式:void SendByte(uchar ch) ﹫2007/05/01
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void SendByte(BYTE ch)
{
BYTE i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
SomeNOP();
WaitAck();
}
/**----------------------------------------------------------------
调用方式:uchar I2CReceive(void) ﹫2007/05/01
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
BYTE RcvByte(void)
{
BYTE i=8;
BYTE ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}
/*******************************************************************
用户接口函数
*******************************************************************/
bit ISendStr(BYTE sla,BYTE suba,BYTE *s,BYTE no)
{
BYTE i;
I2cStart(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
SendByte(suba); /*发送器件子地址*/
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
s++;
}
I2cStop(); /*结束总线*/
return(1);
}
IRcvStr(BYTE sla,BYTE suba,BYTE *buff,BYTE no)
{
BYTE i;
I2cStart(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
SendByte(suba); /*发送器件子地址*/
I2cStart(); /*重新启动总线*/
SendByte(sla+1);
for(i=0;i<no-1;i++)
{
*buff=RcvByte(); /*发送数据*/
SendAck(0); /*发送就答位*/
buff++;
}
*buff=RcvByte();
SendAck(1);
/*发送非应位*/
I2cStop(); /*结束总线*/
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -