历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | 以AT24C02为例的IIC通信协议

发布者:zeta16 来源: eefocus关键字:AT24C02  IIC  通信协议 手机看文章 扫描二维码
随时随地手机看文章

IIC通信协议:


双向二线制同步串行总线,只需要两根线即可在总线上器件之间传送信息,两根线分别是SDA和SCL


SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成"线与"关系。


SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。(边沿触发)


(在读写的时候,SCL = 1时,SDA保持数据,不能在获取数据;SCL = 0,SDA 可以改变,可以获取读或者写的一个字节。)


SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路是开楼输出,需通过上拉电阻接电源VCC,当总线空闲时,两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路,在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。


特征:

1、在硬件上,I2C总线只需要一根数据线和一根时钟线两根线,总线接口已经集成在芯片内部,而且片上接口电路的滤波器可以滤去总线数据上的毛刺.因此I2C总线简化了硬件电路PCB布线,降低了系统成本,提高了系统可靠性。因为12C芯片除了这两根线和少量中断线,与系统再没有连接的线,用户常用IC可以很容易形成标准化和模块化,便于重复利用。

2、I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工作。

3、I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也利于标准化和模块化,缩短开发时问。

4、连接到相同总线上的IC数量只受总线最大电容的限制,串行的8位双向数据传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。

5、)总线具有极低的电流消耗.抗高噪声干扰,增加总线驱动器可以使总线电容扩大10倍,传输距离达到15m;兼容不同电压等级的器件,工作温度范围宽。


1、主设备和从设备


主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件,在总线上主和从、发和收的关系是不恒定的,而取决于此时数据传送方向。


系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型(比如说AT24C02就是1010),由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。


2、数据传输


发送到SDA上的每个字节必须的8位,每次传输可以发送的字节数量不受限制。每个字节后面都有一个响应位。


首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后才能接收或发送下一个完整的数据字节,可以使时钟SCL保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。


3、工作原理


如果从机希望主机降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主机,当主机在准备下一次传送发现SCL的电平被拉低时就进行等待,直至从机完成操作并释放SCL线的控制控制权。这样以来,主机实际上受到从机的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步问题。


主机发送数据


1)主机在检测到空闲状态(SDA = 1,SCL = 1)时,发送一个启动信号S,开始第一次通信


2)主机发送一个字节,包含了7位的外围设备地址和1位读写控制位R/W组成,0为写,1位读


3)收到命令的从机返回一个ACK确认字节


4)主机接收到从机反馈的命令之后,发送一个存储地址


5)接受到的从机跳到相应的存储地址,然后返回一个ACK确认字节


6)主机收到应答字节之后,开始发送第一个字节的数据


7)从机收到后返回一个ACK


8)主机收到后在继续发下一个字节的数据


9)当主机发送了最后一个字节并且收到了从机的ACK后,发送一个停止信号P结束本次通信并释放总线,从机接到了P之后也退出与主机之间的通信。

注意:


①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;


②主机的一次发送通信,其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束,从机收到 P 信号后退出本次通信;


③主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发。


主机接收数据的流程


1)主机发送了启动信号之后,接着发送命令字节(R/W)


2)从机收到地址字节后,返回一个应答信号并向主机发送数据


3)主机收到数据后向从机返回一个确认字节


4)从机接受了确认字节之后,再向主机发送数据


5)当主机收到了最后一个数据之后,向从机发送一个“非应答”(ACK = 1),从机收到非应答之后便停止发送


6)主机发送了非应答之后,向从机发送一个停止信号P,释放总线,结束通信


4、起始信号和终止信号


起始信号:当SCL置1,SDA由高到低的转换,启动信号是一种电平跳变时序信号,而不是一个电平信号。


终止信号:当SCL为高,SDA由低到高的跳变,停止信号是一种电平跳变时序信号,而不是一个电平信号。


5、应答信号


发送器每发送一个字节,就砸时钟脉冲9期间释放数据线,由接收器反馈一个应答信号,应答信号为低电平时,规定为有效应答位,表示接收器已经成功的接受了该字节;应答信号为高电平时,规定为非应答位,一般表示接收器接受该字节没有成功。


对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在他接受最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送并释放SDA线,以便主控接收器发送一个停止信号P


6、数据的有效性


SCL为高电平时,SDA上的数据保持稳定,SCL为低电平时,SDA数据可以发生变化

数据在SCL上升沿之前就要准备好,数据是在SCL上升沿的时候打入到EEPROM中的


EEPROM:


电可擦除可编程的读写存储器,掉电后数据不丢失的存储芯片,可以在电脑上或者和专用设备上擦著已有的信息,重新编程

AT24C20是一个2k串行的CMOS EEPROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。在单片机上的应用广泛, 可以实现掉电数据不丢失功能。


例程:



#include

#include"./delay/delay.h"

 

#define succ 0

#define err 1

 

 

#define LCDPORT P0

#define LCD_WRITE_DATA 1

#define LCD_WRITE_COM 0

 

sbit RS = P2^4;

sbit RW = P2^5;

sbit E = P2^6;

 

sbit SCL = P2^0;

sbit SDA = P2^1;

bit ack = 0;

/*启示信号*/

void iic_start()

SDA = 1;//保证在SCL=1时有SDA的下降沿,所以先进行SDA =1 

SCL = 1;

delay_us(1);

SDA = 0;

delay_us(1);

SCL = 0;//SCL低电平,使主机处于等待状态

}

 

/*终止信号*/

void iic_stop()

{

SDA = 0;

        SCL = 1;

delay_us(1);

SDA = 1;

delay_us(1);

SCL = 0;

}

/*应答子函数*/

void iic_ack()

{

        SDA = 0;

SCL = 1;

delay_us(1);

SCL = 0;

}

 

void iic_noack()

{

        SDA = 1;

SCL = 1;

delay_us(1);

SCL = 0;

}

bit iic_send_byte(unsigned char byte)

{

        unsigned char i;

for(i = 0; i < 8; i++)

{

    SDA = byte & 0x80;

    SCL = 1;//保持数据不变,将数据打入到EEPROM

    delay_us(1);

    SCL = 0;//数据可变

    byte <<= 1;

}

SCL = 1;//准备接受应答信号,在SCL高电平期间,SDA拉低

SDA = 1;

delay_us(1);

if(0 == SDA)

{

     ack = 1;//数据传输正确,产生应答

}

else

{

    ack = 0;

}

SCL = 0;//SCL等待,SDA等待

return ack;

}

 

 

/*接收字节*/

unsigned char iic_rcv_byte()

{

        unsigned char a;

unsigned char temp = 0;

unsigned char i;

SDA = 1;//在上升沿到来之前,做好准备

for(i = 0; i < 8; i++)

{

    SCL = 0;

    delay_us(1);

    SCL = 1;//上升沿,表示可以接受数据啦

    if(SDA)

    {

a = 0x01;

    }

    else

    {

a = 0x0;//SDA为低电平时,读到的数据为0

    }

    temp |= (a << (7-i));

    delay_us(1);

       }

       SCL = 0;

       return temp;

}

 

unsigned char AT24C02_send_str(unsigned char devaaddr,unsigned char roomaddr,unsigned char *s,unsigned num)

{

unsigned char i;

        iic_start();

iic_send_byte(devaaddr);//EEPROM的地址

if(0 == ack)

{

return err;

}

iic_send_byte(roomaddr);

if(0 == ack)

{

     return err;

}

for(i = 0; i < num ; i++)

{

        iic_send_byte(*s);

if(0 == ack)

{

    return err;

}

s++;

}

iic_stop();

return succ;

}

 

unsigned char AT24C02_rcv_str(unsigned char devaddr,unsigned char roomaddr,unsigned char *s,unsigned num)

{

        unsigned char i;

iic_start();

iic_send_byte(devaddr);

if(0 == ack)

{

return err;

}

iic_send_byte(roomaddr);

if(0 == ack)

{

    return err;

}

iic_start();

iic_send_byte(devaddr+1);

for(i = 0; i < num-1; i++)

{

*s = iic_rcv_byte();

iic_ack();

s++;

}

*s = iic_rcv_byte();

iic_noack();

iic_stop();

return succ;

}

 

void lcd_write(unsigned char byte,unsigned char flag)

{

       if(flag)

       {

    RS = 1;

       }

       else

       {

    RS = 0;

}

RW = 0;

E = 1;

LCDPORT = byte;

delay_us(10);

E = 0;

}

void lcd_init()

{

        delay_ms(15);

lcd_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x08,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x01,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x06,LCD_WRITE_COM);

delay_ms(5);

lcd_write(0x0c,LCD_WRITE_COM);

delay_ms(5);

}

void dis_lcd_write(unsigned char x,unsigned char y,unsigned char byte)

{

unsigned char i = 0;

/*byte*/

if(y == 0)

{

lcd_write(0x80+x,LCD_WRITE_COM);

lcd_write(byte,LCD_WRITE_DATA);

}

if(y == 1)

{

lcd_write(0x80+0x40+x,LCD_WRITE_COM);

lcd_write(byte,LCD_WRITE_DATA);

}

}

void dis_lcd_src(unsigned char x,unsigned char y,unsigned char *src) 

{

if(y == 0)

{

lcd_write(0x80+x,LCD_WRITE_COM);

}

if(y == 1)

{

lcd_write(0x80+0x40+x,LCD_WRITE_COM);

}

while(*src != '')

{

lcd_write(*src,LCD_WRITE_DATA);

src++;

}

}

 

 

void main()

{

unsigned char temp[10];

        unsigned char test[10] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40};

lcd_init();

 

AT24C02_send_str(0xae,100,test,3);

delay_s(1);

 

AT24C02_rcv_str(0xae,100,temp,3);

dis_lcd_src(0,0,temp);

while(1);

}



关键字:AT24C02  IIC  通信协议 引用地址:以AT24C02为例的IIC通信协议

上一篇:单片机驱动为什么要设置为低电平有效?
下一篇:单片机串口发送和接受程序

推荐阅读

机器人在金融领域能做什么?在刚刚落幕的2018世界机器人大会上,专家指出,越来越多的企业在探索应用场景的创新,特别是在金融等垂直领域,不断涌现出新的成功案例,开拓出一片“新大陆”。机器人到底能替代哪些复杂的工作?今年7月底,微软把最新的智能机器人“小冰”投放到金融领域试水。 “超级员工”大显身手“我们用小冰人工智能的金融文本生成一种...
随着全球环境问题的日渐凸显,作为温室气体主要“制造商”之一的燃油车终是迎来了关乎其未来生存的“判决书”。近日,工信部发布了对《关于研究制定禁售燃油车时间表加快建设汽车强国的建议》的答复(以下简称《答复》),其中明确指出,“我国将支持有条件的地方建立燃油汽车禁行区试点,在取得成功的基础上。并统筹研究制定燃油汽车退出时间表。” “燃...
据外媒 AppleInsider 报道,配件生产商开始发售第四代 iPad Air 的保护套,距离传闻中的周二发布时间已经十分接近了。随着有关 iPad 即将发布的传言曝光,在苹果正式宣布推出新硬件之前,一些保护套生产商正通过在亚马逊上出售新保护套来获得关注。国外网友报告的产品清单显示了在德国亚马逊网站上由制造商 ZtotopCase 和 TiMOVO 销售的产品。...
  电力工作中,经常需要对高压电力设备的介质损耗参数进行测试,需要用到介质损耗测试仪,那么介质损耗测试仪现场试验发生故障怎么办?下面来详细介绍。  1、接地接触不良  接地不良会引起仪器保护或数据的严重波动,接地点的油漆、铁锈应刮除,并保证零电阻接地!  2、搭钩接触不良  在现场测量中使用钩子连接测试产品时,挂钩需与测试产品保持...

史海拾趣

问答坊 | AI 解惑

好东西,由你来说。

需要安装PDF阅读器阅读…

查看全部问答∨

为什么单片机开发板国内外有明显差异?

为什么单片机开发板国内外有明显差异?                 文章内容: 初学者遍寻国内各地开发板,已经形成了基本概念 偶然查阅国外网站 发现至少外观形式有明显差异-- 1.-国外使用“面包板 ...…

查看全部问答∨

晶振计算工具

晶振计算工具 晚上补充附件…

查看全部问答∨

求助C8051f930的中文资料

哪位达人能给点资料, C8051f930的中文资料. 或者相关的中文资料也可.…

查看全部问答∨

WINCE6下自动运行程序和任务栏相关问题

WINCE6下开机自动运行自己的应用程序,但偶尔会出现CE6的任务栏,怎么才能把任务栏给disable呢?…

查看全部问答∨

wince下的c# winfrom程序如果防止多重启动

wince下的c# winfrom程序如果防止多重启动…

查看全部问答∨

C#中调用Windows API的要点

C#中调用Windows API的要点?…

查看全部问答∨

cc2430组网

毕业设计要做zigbee的组网实验,之前完全没接触过,用的是cc2430学习版。在做协调器组网实验时,下载程序后,打开协调器,理论上是LED3点亮表示建网成功,但实际上是LED2亮了(下图),换成路由器或终端设备,仍然是LED2灯亮,希望大家能帮忙指点迷 ...…

查看全部问答∨

提议:免费申请DIY套件----关于建立DIY活动机制的建议

建议网站支持自发的DIY活动,为DIY活动提供必要的元器件等尽可能多的支持。 一、提倡申请DIY套件。凡在网站注册的、具有一定DIY能力的网友均可申请DIY套件。 二、DIY项目以器件应用、创意制作为主 三、网站根据申请人的项目,作全面衡量,决定是 ...…

查看全部问答∨

提议收到launchpad的朋友们来个竞赛

可以由EEWORLD出题,或者由各人自拟题目给EEWORLD审核发布,重在有目标的实践,活跃论坛气氛。对于创作优秀的坛友,可以获得小小奖品什么的,比如TI样片。。。 因为已经有好多好多的people收到板子了,怕学着学着觉得枯燥,就板子扔在那里不弄了, ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved