I2C、I2S、SPI、GPIO模拟I2C学习笔记

本文详细介绍了I2C总线的基本概念、特点、信号线、传输过程以及与I2S、SPI的对比。I2C具有两线式、协议简单、易于实现、器件多等特点,广泛应用于嵌入式系统。I2S是数字音频传输标准,包含SCLK、LRCK和SDATA三个主要信号。SPI是全双工同步串行接口,由Motorola公司推出,常用于MCU与外围设备通讯。文中还展示了如何使用GPIO模拟I2C通信的过程。
 

1.  什么是 I2C总线

NXP 半导体(原 Philips半导体)于 20 多年前发明了一种简单的双向二线制串行通信总线,这个总线被称为 Inter-IC 或者 I2C 总线。目前 I2C 总线已经成为业界嵌入式应用的标准解决方案,被广泛地应用在各式各样基于微控器的专业、消费与电信产品中,作为控制、诊断与电源管理总线。多个符合 I2C 总线标准的器件都可以通过同一条 I2C总线进行通信,而不需要额外的地址译码器。由于 I2C是一种两线式串行总线,因此简单的操作特性成为它快速崛起成为业界标准的关键因素。 

2. I2C总线的众多优秀特点 

    总线仅由 2根信号线组成   由此带来的好处有:节省芯片 I/O、节省 PCB 面积、节省线材成本,等等。 

    总线协议简单   I2C 总线的协议原文有好几十页,如果直接让初学者来看确实头大,但是并不意为着 I2C 总线协议本身就复杂。 本文撰写的目的就是服务于广大初学者,仅数页的正式内容,图文并茂,容易入门。相信读者认真看过之后,就能基本上掌握 I2C 总线的要领,为进一步操控具体的器件打下良好的基础。 

    协议容易实现   得益于简单的协议规范,在芯片内部,以硬件的方法实现 I2C 部件的逻辑是很容易的。对应用工程师来讲,即使 MCU内部没有硬件的 I2C总线接口,也能够方便地利用开漏的 I/O(如果没有,可用准双向 I/O代替)来模拟实现。 

    支持的器件多   NXP 半导体最早提出 I2C 总线协议,目前包括半导体巨头德州仪器(TI) 、 美国国家半导体 (National Semi) 、 意法半导体 (ST) 、 美信半导体 (Maxim-IC)等都有大量器件带有 I2C 总线接口,这为应用工程师设计产品时选择合适的 I2C 器件提供了广阔的空间。 

    总线上可同时挂接多个器件   同一条 I2C 总线上可以挂接很多个器件,一般可达数十个以上,甚至更多。器件之间是靠不同的编址来区分的,而不需要附加的 I/O 线或地址译码部件。 

    总线可裁减性好   在原有总线连接的基础上可以随时新增或者删除器件。用软件可以很容易实现 I2C 总线的自检功能,能够及时发现总线上的变动。 

    总线电气兼容性好   I2C 总线规定器件之间以开漏 I/O 互联,这样,只要选取适当的上拉电阻就能轻易实现 3V/5V逻辑电平的兼容,而不需要额外的转换。 

    支持多种通信方式   一主多从是最常见的通信方式。此外还支持双主机通信、多主机通信以及广播模式等等。 

    通信速率高   I2C 总线标准传输速率为 100kbps(每秒 100k 位) 。在快速模式下为400kbps。按照后来修订的版本,位速率可高达 3.4Mbps。 

    兼顾低速通信   I2C总线的通信速率也可以低至几kbps以下, 用以支持低速器件 (比如软件模拟的实现)或者用来延长通信距离。 

    有一定的通信距离   一般情况下,I2C 总线通信距离有几米到十几米。通过降低传输速率等办法,通信距离可延长到数十米乃至数百米以上。

3. I2C总线的信号线 

I2C 总线只需要由两根信号线组成, 一根是串行数据线 SDA, 另一根是串行时钟线 SCL。在系统中,I2C 总线的典型接法如图 1 所示,注意连接时需要共地。 

一般具有 I2C总线的器件其 SDA和 SCL 管脚都是漏极开路 (或集电极开路) 输出结构。因此实际使用时,SDA 和 SCL 信号线都必须要加上拉电阻 Rp(Pull-Up Resistor) 。上拉电阻一般取值 3~10KΩ。开漏结构的好处是: 

    当总线空闲时,这两条信号线都保持高电平,不会消耗电流。 

    电气兼容性好。上拉电阻接 5V电源就能与 5V逻辑器件接口,上拉电阻接 3V电源又能与 3V逻辑器件接口。 

    因为是开漏结构,所以不同器件的 SDA 与 SDA 之间、SCL 与 SCL 之间可以直接相连,不需要额外的转换电路。 

4. I2C总线的基本概念 

    发送器(Transmitter) :发送数据到总线的器件 

    接收器(Receiver) :从总线接收数据的器件 

    主机(Master) :初始化发送、产生时钟信号和终止发送的器件 

    从机(Slave) :被主机寻址的器件 

I2C 总线是双向传输的总线,因此主机和从机都可能成为发送器和接收器。如果主机向从机发送数据,则主机是发送器,而从机是接收器;如果主机从从机读取数据,则主机是接收器,而从机是发送器。不论主机是发送器还是接收器,时钟信号 SCL 都要由主机来产生。  

 5. I2C总线数据传送速率 

I2C 总线的通信速率受主机控制,能快能慢。但是最高速率是有限制的,I2C 总线上数据的传输速率在标准模式(Standard-mode)下为 100kbps(每秒 100k 位) ,在快速模式下为400kbps。按照后来修订的版本,位速率最高可达 3.4Mbps。

6. I2C总线上数据的有效性(Data validity) 

    数据线 SDA 的电平状态必须在时钟线 SCL 处于高电平期间保持稳定不变。SDA 的电平状态只有在 SCL 处于低电平期间才允许改变。但是在 I2C总线的起始和结束时例外。 

注:某些其它的串行总线协议,如 SPI,可能规定数据在时钟信号的边沿(上升沿或下降沿)有效,而I2C总线则是低电平有效。 

7.  起始条件和停止条件(START and STOP conditions) 

    起始条件 当 SCL 处于高电平期间时,SDA 从高电平向低电平跳变时产生起始条件。总线在起始条件产生后便处于忙的状态。起始条件常常简记为 S。 

    停止条件 当 SCL 处于高电平期间时,SDA 从低电平向高电平跳变时产生停止条件。总线在停止条件产生后处于空闲状态。停止条件简记为 P。 

8.  从机地址(Slave Address) 

    I2C 总线不需要额外的地址译码器和片选信号。多个具有 I2C 总线接口的器件都可以连接到同一条 I2C 总线上,它们之间通过器件地址来区分。主机是主控器件,它不需要器件地址,其它器件都属于从机,要有器件地址。必须保证同一条 I2C 总线上所有从机的地址都是唯一确定的,不能有重复,否则 I2C总线将不能正常工作。一般从机地址由 7 位地址位和一位读写标志 R/W 组成,7位地址占据高 7 位,读写位在最后。读写位是 0,表示主机将要向从机写入数据;读写位是 1,则表示主机将要从从机读取数据。 

 

9.  数据是按字节传输的 

    I2C 总线总是以字节(Byte)为单位收发数据。每次传输的字节数量没有严格限制。首先传输的是数据的最高位(MSB,第 7 位) ,最后传输的是最低位(LSB,第 0 位) 。另外,每个字节之后还要跟一个响应位,称为应答。 

10.  应答(Acknowledge) 

    在 I2C 总线传输数据过程中,每传输一个字节,都要跟一个应答状态位。接收器接收数据的情况可以通过应答位来告知发送器。应答位的时钟脉冲仍由主机产生,而应答位的数据状态则遵循“谁接收谁产生”的原则,即总是由接收器产生应答位。主机向从机发送数据时,应答位由从机产生;主机从从机接收数据时,应答位由主机产生。I2C总线标准规定:应答位为 0 表示接收器应答(ACK) ,常常简记为 A;为 1 则表示非应答(NACK) ,常常简记为A。发送器发送完 LSB 之后,应当释放 SDA 线(拉高 SDA,输出晶体管截止) ,以等待接收器产生应答位。 

    如果接收器在接收完最后一个字节的数据,或者不能再接收更多的数据时,应当产生非应答来通知发送器。发送器如果发现接收器产生了非应答状态,则应当终止发送。 

 11.  基本的数据传输格式 

在图 4 和图 5 中,各种符号的意义为: 

    S:起始位(START) 

SA:从机地址(Slave Address) ,7 位从机地址 

W:写标志位(Write) ,1 位写标志 

R:读标志位(Read) ,1位读标志 

A:应答位(Acknowledge) ,1 位应答 

A:非应答位(Not Acknowledge) ,1位非应答 

D:数据(Data) ,每个数据都必须是 8 位 

P:停止位(STOP) 

阴影:主机产生的信号 

无阴影:从机产生的信号 

  应当注意的是,与图 5 中的情况不同的是,在图 4 中,主机向从机发送最后一个字节的数据时,从机可能应答也可能非应答,但不管怎样主机都可以产生停止条件。如果主机在向从机发送数据(甚至包括从机地址在内)时检测到从机非应答,则应当及时停止传输。 

 

12.  传输一个字节数据的时序图 

为了更清楚地了解I2C总线的基本数据传输过程, 下面画出了只传输1个字节的时序图,这是最基本的传输方式。在图 6 和图 7 中,SDA信号线被画成了两条,一个是主机产生的,另一个是从机产生的。 实际上主机和从机的 SDA 信号线总是连接在一起的, 是同一根 SDA。画成两个 SDA有助于深刻理解在 I2C总线上主机和从机的不同行为。 

13.  传输多个字节数据的时序图 

主机连续向从机发送或从从机接收多个字节数据的情况也很容易理解, 下面直接给出相关时序图。 

14.  重复起始条件(Repeated START condition) 

主机与从机进行通信时,有时需要切换数据的收发方向。例如,访问某一具有 I2C总线接口的 E2PROM 存储器时,主机先向存储器输入存储单元的地址信息(发送数据) ,然后再读取其中的存储内容(接收数据) 。 

在切换数据的传输方向时,可以不必先产生停止条件再开始下次传输,而是直接再一次产生开始条件。I2C 总线在已经处于忙的状态下,再一次直接产生起始条件的情况被称为重复起始条件。重复起始条件常常简记为 Sr。 

正常的起始条件和重复起始条件在物理波形上并没有什么不同,区别仅仅是在逻辑方面。在进行多字节数据传输过程中,只要数据的收发方向发生了切换,就要用到重复起始条件。 

   图 10 给出了带有重复起始条件的多字节数据传输格式示意图。要特别注意图中重复起始条件 Sr 的用法。如果读者有兴趣的话,可以自行画出其对应的时序图。 

15.  子地址 

带有 I2C 总线的器件除了有从机地址(Slave Address)外,还可能有子地址。从机地址是指该器件在 I2C 总线上被主机寻址的地址, 而子地址是指该器件内部不同部件或存储单元的编址。例如,带 I2C 总线接口的 E2PROM 就是拥有子地址器件的典型代表。

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值