历史上的今天
返回首页

历史上的今天

今天是:2025年01月22日(星期三)

正在发生

2018年01月22日 | I2C总线原理与应用

2018-01-22 来源:eefocus

一.简介

I2C(Inter-Integrated Circuit)总线是一种由Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发。由于其简单性,如今方泛用于微控制器与各种功能模块的连接,可以说是学 单片机 的人,入门之后,必定要涉及到的。

I2C 总线实际上已经成为一个国际标准在超过100 种不同的IC 上实现,而且得到超过50 家公司的许可,正因为其简单和应用广泛,因此其功能也越来不满足人们的要求,其速度也从原来的100Kbit/S,增加了快速模式,其速度达400Kbit/S,再后来也增加了高速模式,其速度更达3.4Mbit/S。


二.功能和特点

I2C总线是一种用于IC器件之间连接的双向二线制总线,所谓总线它上面可以挂多少器件,并且通个两根线连接,占用空间非常的小,总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。它的另一优点是多主控,只要能够进行接收和发送的设备都可以成为主控制器,当然多个主控不能同一时间工作。

I2C总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。任何时候时钟信号都是由主控器件产生。

I2C总线在传送数据的过程中,主要有三种控制信号:起始信号,结不信号,应答信号

起始信号:当SCL为高电平时,SDA由高电平转为低电平时,开始传送数据

结束信号:当SCL为高电平时,SDA由低电平转为高电平时,结束数据传送

应答信号:接收数据的器件在接收到8bit数据后,向发送数据的器件发出低电平信号,表示已收到数据。这个信号可以是主控器件发出,也可以是从动器件发出。总之由接收数据的器件发出。

这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

三.基本操作

下面我们以ATMEL公司的AT24C02来介绍I2C的基本操作

AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8bit存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。他在系统中始终为从动器件。

对AT24C02的操作主要有:字节读,字节写,页面读,页面写

首先发送起始信号,如下图,起始信号后必须是控制字,

控制字格式如下,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,也就是三个地址位,最后一位为读写控制位,当为1(Input)时为读操作,为0(Output)时为写操作。

控制字后就是相应的操作,读或写,一定不要结束,因为这个操作还没有完成,如果结束就等于放弃操作。

先来看写操作,写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同,AT24C02为8字节,每写一个字节后,地址自动加1。关于页面写的地址、应答和数据传送的时序参见图3,字节写可以看成是只有一个字节的页面写,也就是写一个数据后停止。注意:写一次需要一定时间,一般为10ms,要等侍这个操作完成。时序如下图:

说明:对于AT24C02,在控制字后还必须写入地址,这个地址是以后读写的起始地址。

读操作有三种基本操作:当前地址读、随机读和顺序读。三种操作方法类似,只是读的数据个数不同,可连续读8个字节,图4给出的是顺序读的时序图,图中共读了四个数据,需要注意的是当前的地址,如果不是想要的,可以用写操作,重新写入地址。非常重要的是,每读一个数据后,必须置低SDA,作为应答,否则,只能读一个数据,后面的数据,因为收到不应答信号,AT24C02就会认为出错,停止操作。特别提醒的是,当SCL为低电平时,数据是可变的,因些只有SCL为高电平时,才能读数。(相关时序,请看例程序的,读功能函数)

四.例程序(51汇编,测试 单片机 为AT89C51,12M晶振)

电路连接如图5,其中A0,A1,A2为地址线,本例中全部接地,因此全部为0。由于SCL和SDA为漏极开路输出,所以在使用时,需加上拉电阻。

程序功是将数据66H写入AT24C02地址单元00,数据88H写01单元,再将00单元读出放入 单片机 的40H单元,01单元读出放入41H单元,再将其分别写入AT24C02的02和03地址单元,最后将00,02读出比较,01与03比较,如果相等,LED发光。以下是程序。可将本程序复制,编译后,烧录后测试。 (程序看似复杂,其实很多功能是重复的)

        SCL EQU P3.0        ;时钟
        SDA EQU P3.1        ;数据
        LED EQU P1.0        ;操作成功指示,低电平点亮
        ORG 0X0000        LJMP MAIN
        ;启动功能函数,NOP用于满足AT24C02的速度要求START:  CLR SCL             ;先将SCL置低才改变SDA,以免误操作
        NOP
        NOP
        SETB SDA        NOP
        NOP
        SETB SCL        NOP
        NOP
        CLR SDA        NOP
        NOP
        RET
        ;结束功能函数STOP:   CLR SCL             ;先将SCL置低才改变SDA,以免误操作
        NOP
        NOP
        CLR SDA        NOP
        NOP
        SETB SCL        NOP
        NOP
        SETB SDA        NOP
        NOP
        RET
        
        ;应答函数ACK:    CLR SCL             ;先将SCL置低才改变SDA,以免误操作
        NOP
        NOP
        CLR SDA             ;发低电平应答
        NOP
        NOP
        SETB SCL        NOP
        NOP
        RET
        
        ;写一个字节
        ;R2为要写的数据,R3为每字节的位数,这儿为8位
        ;返回时C为应答信号,可以不理会这个值WRITE:  MOV R3,#8        MOV A,R2WRLOOP: CLR SCL        RLC A
        NOP
        MOV SDA,C
        NOP
        NOP
        SETB SCL        NOP
        NOP
        DJNZ R3,WRLOOP
        CLR SCL             ;以下处理AT24C02的应答信号
        NOP
        NOP
        SETB SDA            ;置高SDA,用作输入,如果AT24C02拉低,表示正确
        NOP
        NOP
        SETB SCL        NOP
        NOP
        MOV C,SDA           ;读取应答信号
        RET
        
        ;读一个字节
        ;返回时R2为读得的数READ:   MOV R3,#8RDLOOP: CLR SCL        NOP
        NOP
        SETB SDA            ;拉高SDA,用作输入
        NOP
        NOP
        SETB SCL        NOP
        NOP
        MOV C,SDA        RLC A
        DJNZ R3,RDLOOP
        MOV R2,A
        RET
        
        ;延时,用以保证写操作完成,写地址信号不用延时DELAY:  MOV 0X31,#20AA:     MOV 0X32,#200        DJNZ 0X32,$        DJNZ 0X31,AA
        RET
        MAIN:   ACALL START         ;启动
        MOV R2,#0XA0        ;将控制字“1010 0000”传到R2,最后一位表示写
        ACALL WRITE         ;调用写函数
        MOV R2,#0X00        ;设置要写的地址
        ACALL WRITE
        MOV R2,#0X66        ;写入第一个字节,66H,写入到00单元
        ACALL WRITE
        MOV R2,#0X88        ;写入第一个字节,88H,写入到01单元
        ACALL WRITE
        ACALL STOP          ;停止操作
        ACALL DELAY         ;等待写完成
        
        ACALL START         ;启动
        MOV R2,#0XA0        ;写控制字
        ACALL WRITE
        MOV R2,#00          ;设置要读地址
        ACALL WRITE
        
        ACALL START
        MOV R2,#0XA1        ;将控制字“1010 0001”传到R2,最后一位表示读
        ACALL WRITE         ;写入控制字
        ACALL READ          ;调用读命令
        ACALL ACK           ;应答
        MOV 0X40,R2         ;将读得的数据传到40H
        ACALL READ          ;读下一位,将读得的数据传到41H
        ACALL ACK
        MOV 0X41,R2
        ACALL STOP          ;停止读操作
        
        ACALL START
        MOV R2,#0XA0        ;写控制字,表示以下这写操作
        ACALL WRITE
        MOV R2,#0X02        ;设置地址
        ACALL WRITE
        MOV R2,0X40         ;将上面读得的数写入到02单元
        ACALL WRITE
        MOV R2,0X41         ;将上面读得的数写入到03单元
        ACALL WRITE
        ACALL STOP          ;停止操作
        ACALL DELAY         ;等待写完成
        
        ACALL START         ;启动
        MOV R2,#0XA0        ;写入控制字,表示以下为写操作
        ACALL WRITE
        MOV R2,#00          ;写入读的起始地址
        ACALL WRITE
        
        ACALL START         ;启动
        MOV R2,#0XA1        ;写入控制字,表示以下为读操作
        ACALL WRITE
        ACALL READ
        ACALL ACK
        MOV 0X40,R2         ;以下连续读出四个字节
        ACALL READ
        ACALL ACK
        MOV 0X41,R2
        ACALL READ
        ACALL ACK
        MOV 0X42,R2
        ACALL READ
        ACALL ACK
        MOV 0X43,R2
        ACALL STOP
        
        MOV A,0X42          ;以下为比较读出结果与写入是否相等
        CJNE A,#0X66,ENDALL
        MOV A,0X43        CJNE A,#0X88,ENDALL
        CLR LEDENDALL: SJMP $        END


推荐阅读

史海拾趣

Eastron Corp公司的发展小趣事

Eastron Corp一直重视人才的培养和引进。公司建立了完善的人才培养和激励机制,鼓励员工不断学习和创新。同时,Eastron还积极引进国内外优秀人才,为公司的发展注入新的活力。正是凭借一支高素质、专业化的团队,Eastron在电子行业中不断取得新的突破。

Amprobe公司的发展小趣事

在电子产品同质化日益严重的今天,Eastron Corp深知品质对于品牌的重要性。公司严格把控产品质量,从原材料采购到生产过程,再到成品检验,每一个环节都经过严格把关。此外,Eastron还建立了完善的售后服务体系,为客户提供全方位的服务支持。正是凭借出色的品质和服务,Eastron赢得了客户的信赖和口碑。

Corsair Electrical Connectors Inc公司的发展小趣事

Corsair深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购、生产加工到产品出厂,每一个环节都进行严格的质量控制。Corsair还引入了先进的质量检测设备和方法,确保每一件产品都符合客户的要求和行业标准。这种对品质的执着追求使得Corsair的产品在市场上赢得了良好的声誉。

岑科(CENKER)公司的发展小趣事

为了实现更高效的生产和更优质的产品,岑科在2011年成立了自动化设备研发团队。通过自主研发生产设备,岑科实现了对生产技术的全面掌控,并加强了技术创新和改进。这一举措不仅提高了生产效率,还为岑科带来了更多的技术积累和知识产权。随着自动化设备的广泛应用,岑科的生产能力得到了大幅提升,同时也推动了整个产业的升级和可持续发展。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子自成立以来,始终坚持以技术创新为核心竞争力。公司拥有一支高素质的研发团队,致力于石英晶体元器件的研发与生产。通过不断的技术创新和产品升级,晨晶电子在行业内逐渐树立了技术领先的地位。其产品广泛应用于通信、计算机、消费电子等领域,赢得了众多客户的信赖和好评。

台湾晶豪(ESMT)公司的发展小趣事

晶豪科技一直积极寻求与国内外企业的合作机会。通过与合作伙伴的紧密合作,公司不断拓展业务领域,进入了模拟及混合讯号IC领域。目前,公司提供的产品包括音讯转换器(ADC/DAC)及D类音频放大器等IC。这些新产品的推出不仅丰富了公司的产品线,还为客户提供了更多样化的选择。同时,通过与合作伙伴的资源共享和优势互补,晶豪科技在技术研发和市场拓展方面取得了更多突破。

问答坊 | AI 解惑

鉴别真代理、假代理的方法

看它的业务介绍,如果说同时代理几家相互竞争的产品的,肯定是假的。 如网上说什么代理EMC,SONIX,十速等等的,100%是假的。…

查看全部问答>

arm开发板的调试串口能改变吗?

rt 2410的串口0是完备串口,我们想用它做别的用途 但是它默认是超级终端的调试串口, 我能不能通过修改bootloader来改变它,就是把串口0释放出来,使用串口1作为超级终端的调试串口啊? 多谢…

查看全部问答>

能具体讲下虚拟串口实现的过程不?

看了一个多星期的驱动程序开发 然后从网上下了不少资料,看了不少 现在对虚拟串口大概有个了解 但也不是很清楚,希望做过的能给个思路!~~ 注册表和驱动程序之间的联系... 是通过添加注册表实现虚拟串口,还是直接 通过驱动程序虚拟一个串口使用?…

查看全部问答>

DATA FLASH的读写程序找人开发

一个DATA FLASH的读写程序找人开发,就是通过COM口吧数据写到板子的闪存(DATAFLASH)上,,要有开发经验 详情:http://www.xinet.com.cn/123/index.html 联系13870920010张先生,QQ:123013020…

查看全部问答>

串口下载问题

我用的IAR5.4编译,j-link仿真器下载没有问题. 但用串口下载芯片能联上,万利那个说下载返回码错误,ST那个下载也不行,但我用同事另外的产品HEX文件能下载,不知是什么问题?…

查看全部问答>

ATmega169V驱动段码LCD液晶片的困惑

ATmega169V驱动段码液晶片,电压5V,取1/3Bias,60Hz, 在静态有部分显示,1/2duty、1/3duty、1/4duty都没有显示,可能是什么原因? 初始化如下: LCDCRB=0x30; LCDFRR=0x66; LCDCCR=0x0F; 。。。。。 LCDCRA=0x80;…

查看全部问答>

【求助】高频预加重电路分析

如图,求高手帮分析一下箭头所指的右边电路的工作方式,电容C2是高频信号的正向通路还是反馈网络的一部分?如果是反馈网络,那C2的作用是什么呢? R1,C1是滤波器是肯定的。…

查看全部问答>

哪位提供一下LPC810下载电路?

我已经拿到LPC810的板子了 可是在下载程序的时候遇到了一些问题; 我用的是一个232的ISP下载串口板; 软件用的是Flash Magic 读取芯片ID正常; 擦除Flash正常; 但是不能往里写入程序; 总是卡在这里,不能往下进行; 有哪个大虾遇到过这 ...…

查看全部问答>

请问ccs v5如何安装MSP-FET430UIF驱动?

得到一个写着MSP-FET430UIF的烧写器,连接到电脑显示驱动安装好了。但是我的ccs中device connection中没有显示这个,只有USB。请问如何安装使用?…

查看全部问答>

关于GPS和GSM模块的定位。

我想问下论坛的大神,我现在在把GPS的经纬度可以定位发送到GSM模块中,在手机显示是经纬度。。我想的是,可以显示当前的所在地址或者是地图的连接。。打算用GSM模块的GPRS,但感觉好像不行,因为还是要电脑操作。。请问大神们,怎么可以发送信息的 ...…

查看全部问答>