I2C总线协议程序

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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);

}

相关文档
最新文档