您的位置 首页 5G

51单片机—IIC—EEPROM(CAT24WCXX)—03

今天没事做,突然想起来了IIC,所以决定回顾一下下,呵呵,忘记了不少,所以打算写出来,便于以后记忆。。。,这里的例子就拿CAT24WCXX的EE

今日没事做,忽然想起来了IIC,所以决议回忆一下下,呵呵,忘记了不少,所以计划写出来,便于今后回忆。。。,这儿的比如就拿CAT24WCXX的EEPROM来解说吧~~(我也是边写文章,边写代码~~~累啊)

一、IIC总线简介

1.IIC总线的主要特点

IIC总线是一种简略、双向二线制同步串行总线。

(1)总线只要两根线,既串行时钟线(SCL)和串行数据线(SDA),这在规划中大大减少了硬件接口

(2)每个连接到总线上的器材都有一个用于辨认的器材地址,(留意,器材地址由芯片内部硬件电路和外部地址引脚一起决议,这样就避免了~~你懂得)然后树立了简略的主从关系,然后每个器材都能够作为发送器,也能够作为接纳器。

(3)同步时钟答应器材以不同的波特率进行通讯。

(4)同步时钟能够作为中止和重新启动串行口发送的握手电路(便是开端和完毕信号)。

(5)串行的速率不定(规范100kb/s。。。其它的就不必关怀了)。

(6)连接到同一总线的%&&&&&%只受400pf的最大总线%&&&&&%。

2.IIC总线的根本结构

机构图网上一推推的~~~

每个器材都有仅有的地址,器材两两之间都能够进行信息传送。当某个器材向总线上发送信息时,它便是发送器(也叫做主控制器),而当其从总线上接纳信息时,它又成为接纳器(从控制器)。在信息的传送过程中,主控制器发送的信号分为器材地址码、器材单元地址和数据3部分(这儿你完全能够联络EEPROM,它们三个的功能看姓名也能才出来,我就不写了)。

3.IIC总线的信息传送(这儿才它XX的是要点,上边的都是废话)

当IIC总线没有数据传送时,数据线(SDA)和时钟线(SCL)都为高电平。当主控制器向某个器材传送信息时,首要应向总线传送开端信号,然后才干传送信息(这儿信息包含地址啊,数据啊~~)当信息传送完毕时还应该传送个完毕信号,开端信号和完毕信号的规则如下:

~~~~~~~~~~开端信号:SCL为高电平时,SDA由高变为低的跳变,开端传送数据。

汇编的代码:

START:SETBSDA
NOP
SETBSCL;开端条件树立大于4.7us
NOP
NOP
NOP
NOP
CLRSDA;开端条件确定大于4.7us
NOP
NOP
NOP
NOP
NOP
CLRSCL;钳住总线,预备好发送数据
NOP
RET

当然然后便是c的代码了:

void IIC_start()
{
sda=1;
_nop_();
scl=1;//开端信号树立时刻大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=0; //开端信号确定大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;//钳住IIC总线,预备发送或许接纳数据
_nop_();
_nop_();
}

~~~~~~~~~~~完毕信号:SCL为高电平时,SDA由低变为高的跳变,完毕传送数据。

仍是先是汇编:(这儿就不注释了,太烦了)

STOP:CLRSDA
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
SETBSDA
NOP
NOP
NOP
NOP
NOP
RET

c文件:

voidIIC_stop()
{
sda=0;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

开端信号和完毕信号之间的传送的是信息,信息的字节没有约束,但每个字节有必要为8位,高位在前,低位在后。数据线SDA上每一位信息状况的改动只能发生在时钟线SCl为低电平期间(这儿由于方才开端信号和完毕信号,SCl为高电平的期间SDA状况的改动现已被用来表明开端信号和完毕信号)。一起每个字节后边有必要承受一个应对信号(ACK),ACK是从器材接纳到8位数据后向主控制器宣布的特定的低电平脉冲,用来表明现已接纳到数据(留意是在SCL为高,检测SDA是否为低电平,之前SDA要拉高),假如主器材没有遭到应对信号,转到犯错处理~~

~~~~~~~检测应对位的程序:

汇编程序:

;回来值ACK=1时表明应达
CACK:
SETBSDA
NOP
NOP
SETBSCL
CLRACK
NOP
NOP
MOVC,SDA
JCCEND
SETBACK;应对方位1,既回来应对位为1
CEND:
NOP
CLRSCL
NOP
c程序(这儿面有ack这个bit型的变量,提早设置为全局变量,所以函数类型为void)

void I%&&&&&%_ack()
{
_nop_();
_nop_();
sda=1;//8位数据发送完后,预备接纳数据
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda==1)
ack=0;
else ack=1;//接纳到应对位,ack为1,不然置0
scl=0;
_nop_();
_nop_();
}

主控器材每次传送的信息的第一个字节有必要是器材的地址码,第二个字节为器材的单元地址,用于完成挑选所操作的器材的内部单元,从第三个字节开端为传送的数据(这儿器材的地址码自己能够上网上搜,高四位为器材的类型码,最低位为读写位,其他三位你懂得,自己的设置位~~~,然后便是器材的单元地址,这个就看你的器材的存储器地址了,最终便是数据~~~呵呵)。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部