I2C串行總線標(biāo)準(zhǔn)驅(qū)動(dòng)程序(C51)-萬(wàn)能程序
[文件名] I2C.c
[版本] 1.1b
[作者] 鞠春陽(yáng)
===========================================================================================*/#include "reg51.h"
#include "intrins.h"
unsigned char SystemError;
sbit SCL= P1^6; //定義串行時(shí)鐘線所在口 使用時(shí)根據(jù)自己的需要來(lái)定義
sbit SDA= P1^7; //定義串行數(shù)據(jù)線所在口 使用時(shí)根據(jù)自己的需要來(lái)定義
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
調(diào)用方式:void AD7416_I2CStart(void) 2003/05/04
函數(shù)說(shuō)明:私有函數(shù),I2C專用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//數(shù)據(jù)線保持高,時(shí)鐘線從高到低一次跳變,I2C通信開始
SDA=0; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:void AD7416_I2CStop(void) 2003/05/04
函數(shù)說(shuō)明:私有函數(shù),I2C專用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //數(shù)據(jù)線保持低,時(shí)鐘線從低到高一次跳變,I2C通信停止
SCL=1; SomeNOP(); SDA=1;
EA=1;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:I2CAck(void) 2003/05/13
函數(shù)說(shuō)明:私有函數(shù),I2C專用,等待從器件接收方的應(yīng)答
ACK BY AD7416
---------------------------------------------------------------------------------*/
WaitAck(void)
{
unsigned char errtime=255;//因故障接收方無(wú)ACK,超時(shí)值為255。
SDA=1;
SCL=1;
SystemError=0x10;
while(SDA)
{ errtime--;
if(!errtime)
{ AD7416_I2CStop();
AD7416_SystemError=0x11; //出錯(cuò)后給全局變量賦值
return;
}
}
SCL=0;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:void SendAck(void) ﹫2003/05/13
函數(shù)說(shuō)明:私有函數(shù),I2C專用,主器件為接收方,從器件為發(fā)送方時(shí),應(yīng)答信號(hào)。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP(); //數(shù)據(jù)線保持低,時(shí)鐘線發(fā)生一次從高低的跳變 發(fā)送一個(gè)應(yīng)答信號(hào)
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:void SendAck(void) ﹫2003/05/13
函數(shù)說(shuō)明:私有函數(shù),I2C專用,主器件為接收方,從器件為發(fā)送方時(shí),非應(yīng)答信號(hào)。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP(); //數(shù)據(jù)線保持高,時(shí)鐘線發(fā)生一次從高低的跳變 沒有應(yīng)答
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
調(diào)用方式:void I2CSend(uchar ch) 2003/05/13
函數(shù)說(shuō)明:私有函數(shù),I2C專用
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
unsigned char i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch
評(píng)論