您的位置 首页 测评

C51单片机模仿I2C总线驱动程序设计(2)

************************************I2C_RcvB********************************函数名:ucharI2C_RcvB()入口:出口

/************************************ I2C_RcvB ********************************

函数名:uchar I2C_RcvB()
进口:
出口:uchar 型数据
功用描绘:
接纳从器材传来的数据,并判别总线过错(不发应对信号),收完后需求调用应对函数。
调用函数:
全局变量
*******************************************************************************
uchar I2C_RcvB()
{
uchar retc;
uchar BitCnt; //位
retc = 0;
SDA = 1; //置数据总线为输入方法,作为接纳方要开释 SDA.
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL = 0; //置时钟线为低预备接纳数据位
SomeNOP(); //时钟低电平周期大于 4.7us
SCL = 1; //置时钟线为高使数据有用
_nop_();
_nop_();
retc = retc<<1;
if(SDA==1)
{
retc = retc + 1;//读数据位,接纳的数据放入 retc 中
}
_nop_();
_nop_();
}
SCL = 0;
_nop_();
_nop_();
return(retc);
}
/************************************ I2C_Ackn ********************************
函数名:void I2C_Ackn(bit a)
进口:0 或 1
出口:
功用描绘:主控制器进行应对信号(可所以应对或非应对信号)
阐明:作为接纳方的时分,有必要依据当时自己的状况向发送器反应应对信号
调用函数:
全局变量:
*******************************************************************************
void I2C_Ackn(bit a)
{
if(a==0) //在此发送应对或非应对信号
{
SDA = 0;
}
else
{
SDA = 1;
}
SomeNOP();
SCL = 1;
SomeNOP(); //时钟电平周期大于 4 us
SCL = 0; //清时钟线钳住 I2C 总线以便持续接纳
_nop_();
_nop_();
}
/******************************** I2C_ISendB **********************************
函数名:bit I2C_ISendB(uchar sla, uchar suba,uchar c)
进口:从器材地址 sla,子地址 suba, 发送字节 c
出口:0(操作有误),1(操作成功)
功用描绘:从发动总线到发送地址、数据,完毕总线的全过程,
假如回来1:表明操作成功,不然操作有误。
调用函数:I2C_Start(),I2C_SendB(uchar c),I2C_Stop()
全局变量:I2C_Ack
*******************************************************************************
bit I2C_ISendB(uchar sla, uchar suba, uchar c)
{
I2C_Start(); //发动总线
I2C_SendB(sla); //发送器材地址
if(!I2C_Ack)
{
return(0);
}
I2C_SendB(suba); //发送器材子地址
if(!I2C_Ack)
{
return(0);
}
I2C_SendB(c); //发送数据
if(!I2C_Ack)
{
return(0);
}
I2C_Stop(); //完毕总线
return(1);
}
/********************************** I2C_IRcvB *********************************
函数名:bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
进口:从器材地址 sla, 子地址 suba, 收到的数据在 c
出口:1(操作成功),0(操作有误)
功用描绘:从发动总线到发送地址、读数据,完毕总线的全过程。
调用函数:
I2CS_tart(),
I2C_SendB(uchar c),
I2C_RcvB(),
I2C_Ackn(bit a),
I2C_Stop()
全局变量:I2C_Ack
*******************************************************************************
bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
{
I2C_Start(); //发动总线
I2C_SendB(sla);
if(!I2C_Ack)
{
return(0);
}
I2C_SendB(suba); //发送器材子地址
if(!I2C_Ack)
{
return(0);
}
I2C_Start(); //重复开始条件
I2C_SendB(sla+1); //发送读操作的地址
if(!I2C_Ack)
{
return(0);
}
*c = I2C_RcvB(); //读取数据
I2C_Ackn(1); //发送非应对位
I2C_Stop(); //完毕总线
return(1);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/258411.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部