什么是I2C协议?
I2C协议是单片机与其它芯片常用的通讯协议,由于只需要两根线,所以很好使用。
1. I2C总线的特点
(1)只要求两条总线线路 一条串行数据线SDA 一条串行时钟线SCL
(2) 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主发送器或主机接收器
(3)它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
(4)串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达.4Mbit/s
(5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
(6) 连接到相同总线的IC数量只受到总线的最大电容400pF 限制
I2C协议总线信号时序分析
1 .数据的有效性:
SDA线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在 SCL线的时钟信号是低电平时才能改变。
2 .起始和停止条件
当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件。
当SCL线是高电平时,SDA线由低电平向高电平切换表示停止条件。如图3.2 I2C起始和停止条件所示。
3. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
4 .数据传输与应答信号ACK
发送到SDA线上的数据必须是8位的。每次传输可以发送的数据不受限制。每个字节后必须在时钟的第9个脉冲期间释放数据总线(SDA为高),
由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。如图3.3 I2C总线响应。
首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,
可以使时钟SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。如图3.4 I2C总线数据传输所示。
4. 地址格式
数据的传输遵循如图4.1 完整的数据传送所示,在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/ — W),0-表示发送数据(写),
1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,
而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。如图3.5 I2C总线完整的数据传输。
现代电子系统中,有为数众多的IC需要进行相互之间以及与外界的通信。为了提供硬件的效率和简化电路的设计,
PHILIPS开发了一种用于内部IC控制的简单的双向两线串行总线I2C。I2C总线支持任何一种IC制造工艺,
并且PHILIPS和其他厂商提供了种类非常丰富的I2C兼容芯片。作为一个专利的控制总线,I2C已经成为世界性的工业标准。
每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)。
发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。I2C是一个多主总线,即它可以由多个连接的器件控制。
基本的I2C总线规范于20年前发布,其数据传输速率最高为100Kbits/s,采用7位寻址。但是由于数据传输速率和应用功能的迅速增加,
I2C总线也增强为快速模式(400Kbits/s)和10位寻址以满足更高速度和更大寻址空间的需求。
I2C总线始终和先进技术保持同步,但仍然保持其向下兼容性。并且最近还增加了高速模式,其速度可达3.4Mbits/s。
它使得I2C总线能够支持现有以及将来的高速串行传输应用,例如EEPROM和Flash存储器。
请问:为何IIC传送过程中,其地址(slaver address)是7bits?
IIC的书上说:送入SDA中的每个字节长度必须是8-bits,在IIC总线上,START信号后,一个从地址(slave address)被传送,
在该字节中的bit7是一个读写选择信号,“0”表示写,“1”表示读。但在实际中传送的地址是8bits的,如在我们门的一个系统中EDID的
地址是0xA0,这种矛盾怎么解释?请e-mail:[email protected]
你可能还没理解到,因为第一个字节(为slave address)由7位地址和一位R/W读写位组成的,这字节是个器件地址。
首先,你要知道:常用IIC接口通用器件的器件地址是由种类型号,及寻址码组成的,共7位。
如格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
1-器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这4位已是固定的。
2-用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合
电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因了。
3-最低一位就是R/W位。这位不用我多说了。
这没什么矛盾可解释,你再看看书本和多动脑子我想你很快就会明白的。
经你这么一说,我大概明白了,谢谢!
按你的说法:在IIC传送中,先传送最高位D7,我现在明白为何在我们的系统中EDID有两个地址是0xA0/0xA1,一个是读地址,一个是写地址,我以前还真没搞懂
您好,有关I2C的传送又来请教你了。
1st、 在我们系统的主芯片与MStar芯片的通信过程中,传送的第一个数据的最高位总是为低电平,比如我向某寄存器中先写一个数(0xff),
再读取该寄存器,读出的数据的最高位总是为“0”(0x7f)。不过这种错误仅仅在第一个数据出现,以后的数据就正确了。
2nd、 在我们系统的主芯片与EEPROM芯片的通信过程中,情况就更糟糕,不管向memory Addr 中写什么数据,然后再读取
这个memory Addr中数据,出来的数据总是“0xff”(note:slaver Addr正确,芯片的电源ok,也没有写保护WP=0),我实验了两块板子,
不可能这两块板子的EEPROM都坏了吧!程序(与1st中的)是一样的,只是slaver Addr发生改变。
从你的资料看来,我无法总判定是那里或什么问题;估计很大程序上是你的程序问题。
要知道,主机向从访问时。
1-先向总线发出芯片地址
2-如果有芯片地址正确的芯片,会产生一个SDA上应答。
3-接着主机再发出应答过的芯片发出将要所进行操作的片内地址。
4-芯片地址正确的芯片,会再产生一个SDA上应答。
5-此时如果是读操作,从芯片将输出数据到SDA上。如果是写操作,主机会将数据写到SDA上。
就这样可以完成了一个读或写的操作。当然这里面还开始和停止位这些动作。
对以此类的分析,我们一般建议学生使用我站销售的虚拟示波器来做分析,用ezSDO虚拟示波器可以方便地为IIC总线进行分析,
因为有较深圳的波动存储功能。捕获回来的波形后,可以进行分析比较等动作。
以下就是一个实例波形,有关详细看查看本论坛上的虚拟示波器销售专区中的文章