微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机—IIC—EEPROM(CAT24WCXX)—03

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

时间:11-25 来源:互联网 点击:
今天没事做,突然想起来了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 IIC_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_();
}

主控器件每次传送的信息的第一个字节必须是器件的地址码,第二个字节为器件的单元地址,用于实现选择所操作的器件的内部单元,从第三个字节开始为传送的数据(这里器件的地址码自己可以上网上搜,高四位为器件的类型码,最低位为读写位,其他三位你懂得,自己的设置位~~~,然后就是器件的单元地址,这个就看你的器件的存储器地址了,最后就是数据~~~呵呵)。

4.IIC的总线读写操作

先介绍一下在IIC读写一个字节的数据~~~这样以后说起来就方便了

发送字节子程序:

先是asm文件形式:

;字节

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top