当前位置:文档之家› I2C总线协议程序

I2C总线协议程序

C程序代码]I2C总线协议程序

程序代码 2009-10-11 14:05 阅读48 评论0

/****************************************************************

I2C总线协议程序

****************************************************************/

#define NOP {_nop_();_nop_();_nop_();_nop_();}

sbit SDA=P1^2; /*模拟I2C数据传送位*/

sbit SCL=P1^3; /*模拟I2C时钟控制位*/

bit ack; /*应答标志位*/

void Start_I2c()

{

SDA=1; NOP;

SCL=1; NOP;

SDA=0; NOP;

SCL=0; NOP;

}

void Stop_I2c()

{

SDA=0; NOP;

SCL=1; NOP;

SDA=1; NOP;

}

void Senduchar(uchar c)

{

uchar i;

for(i=0;i<8;i++)

{

c<<=1;

SDA=CY; NOP;

SCL=1; NOP;

SCL=0; NOP;

}

SDA=1; NOP;

SCL=1; NOP;

if(SDA==1) ack=0;

else ack=1;

SCL=0; NOP;

}

uchar Rcvuchar()

{

uchar i,x=0;

SDA=1;

for(i=0;i<8;i++)

{

SCL=0; NOP;

SCL=1; NOP;

x=x<<1;

if(SDA) x=x+1;

NOP;

}

SCL=0; NOP;

return(x);

}

void Ack_I2c(bit a)

{

SDA=a; NOP;

SCL=1; NOP;

SCL=0; NOP;

}

bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)

{

uchar i;

Start_I2c(); /*启动总线*/

Senduchar(sla); /*发送器件地址*/

if(ack==0)return(0);

Senduchar(suba); /*发送器件子地址*/

if(ack==0)return(0);

for(i=0;i

{

Senduchar(*s); /*发送数据*/

if(ack==0)return(0);

s++;

}

Stop_I2c(); /*结束总线*/

return(1);

}

bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)

{

uchar i;

Start_I2c(); /*启动总线*/

Senduchar(sla); /*发送器件地址*/

if(ack==0)return(0);

Senduchar(suba); /*发送器件子地址*/

if(ack==0)return(0);

Start_I2c();

Senduchar(sla+1);

if(ack==0)return(0);

for(i=0;i

{

*s=Rcvuchar(); /*发送数据*/

Ack_I2c(0); /*发送就答位*/

s++;

}

*s=Rcvuchar();

Ack_I2c(1); /*发送非应位*/

Stop_I2c(); /*结束总线*/

return(1);

}

相关主题