?? iic.h
字號:
/*------------------------------------------------------------------------------------------
[文件名] IIC.H
[版本] 1.0
[作者] 陳彬
[最后修改時(shí)間] 2007年5月01日
[版權(quán)所有] www.mcucore.com
===========================================================================================*/
#ifndef IIC_H
#define IIC_H
extern unsigned char SystemError;
sbit SCL= P1^3; //定義串行時(shí)鐘線
sbit SDA= P1^4; //定義串行數(shù)據(jù)線
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
調(diào)用方式:void I2CStart(void) 2007/05/01
函數(shù)說明:私有函數(shù),I2C專用
---------------------------------------------------------------------------------*/
void I2cStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//數(shù)據(jù)線保持高,時(shí)鐘線從高到低一次跳變,I2C通信開始
SDA=0; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:void I2CStop(void) 2007/05/01
函數(shù)說明:私有函數(shù),I2C專用
---------------------------------------------------------------------------------*/
void I2cStop(void)
{
SCL=0; SDA=0; SomeNOP(); //數(shù)據(jù)線保持低,時(shí)鐘線從低到高一次跳變,I2C通信停止
SCL=1; SomeNOP();
SDA=1; SomeNOP();
EA=1;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:void SendAck(void) ﹫2007/05/01
函數(shù)說明:私有函數(shù),I2C專用,主器件為接收方,從器件為發(fā)送方時(shí),應(yīng)答信號。
---------------------------------------------------------------------------------*/
void SendAck(bit a)
{
if(a==0)SDA=0; /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
else SDA=1;
SomeNOP();
SCL=1;
SomeNOP(); /*時(shí)鐘低電平周期大于4μs*/
SCL=0; /*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/
// _Nop();
// _Nop();
}
/*--------------------------------------------------------------------------------
調(diào)用方式:bit I2CAck(void) ﹫2007/05/01
函數(shù)說明:私有函數(shù),I2C專用,等待從器件接收方的應(yīng)答
---------------------------------------------------------------------------------*/
WaitAck(void)
{
BYTE errtime=20;//因故障接收方無ACK,超時(shí)值為255。
SDA=1;SomeNOP();
SCL=1;SomeNOP();
//while(SDA) {errtime--;if (!errtime) {I2cStop();SystemError=0x11;}}
SCL=0;
SomeNOP();
}
/**--------------------------------------------------------------------------------
調(diào)用方式:void SendByte(uchar ch) ﹫2007/05/01
函數(shù)說明:私有函數(shù),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();
}
/**----------------------------------------------------------------
調(diào)用方式:uchar I2CReceive(void) ﹫2007/05/01
函數(shù)說明:私有函數(shù),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;
}
/*******************************************************************
用戶接口函數(shù)
*******************************************************************/
bit ISendStr(BYTE sla,BYTE suba,BYTE *s,BYTE no)
{
BYTE i;
I2cStart(); /*啟動(dòng)總線*/
SendByte(sla); /*發(fā)送器件地址*/
SendByte(suba); /*發(fā)送器件子地址*/
for(i=0;i<no;i++)
{
SendByte(*s); /*發(fā)送數(shù)據(jù)*/
s++;
}
I2cStop(); /*結(jié)束總線*/
return(1);
}
IRcvStr(BYTE sla,BYTE suba,BYTE *buff,BYTE no)
{
BYTE i;
I2cStart(); /*啟動(dòng)總線*/
SendByte(sla); /*發(fā)送器件地址*/
SendByte(suba); /*發(fā)送器件子地址*/
I2cStart(); /*重新啟動(dòng)總線*/
SendByte(sla+1);
for(i=0;i<no-1;i++)
{
*buff=RcvByte(); /*發(fā)送數(shù)據(jù)*/
SendAck(0); /*發(fā)送就答位*/
buff++;
}
*buff=RcvByte();
SendAck(1);
/*發(fā)送非應(yīng)位*/
I2cStop(); /*結(jié)束總線*/
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -