您的位置 首页 软件

I2C总线学习感触总结(一)

一:起始与终止1:I2C起始条件SCL高电平期间,SDA从高电平向低电平切换。2:I2C终止条件SCL高电平期间,SDA从低电平向高电平切换。二:

一:开始与停止

1:I2C开始条件

SCL高电平期间,SDA从高电平向低电平切换。

2:I2C停止条件

SCL高电平期间,SDA从低电平向高电平切换。

二:数据传输

1:进行数据传送时,在SCL出现高电平期间,SDA上的电平有必要保持稳定

SDA上的数据只能在SCL为低电平期间改变。

2:I2C总线每个CLK发送或接纳一个位的数据(或地址)

在CLK上升沿,把数据bit(或地址)送到SDA线上

在CLK下降沿,从SDA线上读取数据bit

C程序实例:

void Start_I2c()

{
SDA=1;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}

void Stop_I2c()
{
SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
}

void SendByte(uchar c)
{
uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<
else SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
}

_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_Nop();
_Nop();
}

uchar RcvByte()
{
uchar retc;
uchar BitCnt;

retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1;
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部