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);
}
关键字:C51代码 I2C总线协议『本文转载自网络,版权归原作者所有,如有侵权请联系删除』