查看:
5781
|
回复:
5
|
I2C总线简介
|
|||
|
发表于2017-03-03 17:10:09
|
只看该作者
1#
电梯直达
简介 NXP半导体(原Philips半导体)于20多年前发明了一种简单的双向二线制串行通信总线,这个总线这个总线被称为IIC、Inter-IC或者I2C总线。目前I2C总线已经成为业界嵌入式应用的标准解决方案,被广泛地应用在各式各样基于微控器的专业、消费与电信产品中,作为控制、诊断与电源管理总线。多个符合I2C总线标准的器件都可以通过同一条I2C总线进行通信,而不需要额外的地址译码器。由于I2C是一种两线式串行总线,因此简单的操作特性成为它快速崛起成为业界标准的关键因素。 协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个地址,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此地址分为固定部分和可编程部份,细节视芯片而定。 常见术语 主机:启动数据传送并产生时钟信号的设备; 从机:被主机寻址的器件; 发送器:发送数据到总线的器件; 接收器:从总线接收数据的器件; 多主机:同时有多于一个主机尝试控制总线但不破坏传输; 仲裁:是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使传输不被破坏的过程; 同步:两个或多个器件同步时钟信号的过程 。 主机发送数据流程 ● 主机发送一个启动信号“S”,开始一次通信的开始。 ● 接着主机发送命令字节该字节由7位的外围器件地址和1位读写控制位R/W 组成(此时是写 R/W=0)。 ● 相对应的从机收到命令字节后向主机回馈应答信号ACK(ACK=0) ● 主机收到从机的应答信号后开始发送第一个字节的数据 ● 从机收到数据后返回一个应答信号ACK ● 主机收到应答信号后再发送下一个数据字节 ● 当主机发送最后一个数据字节并收到从机的ACK后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信,此时一次数据通信即完成。 注意:①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信; ②主机的一次发送通信,其发送的数据数量不受限制。主机是通过P信号通知发送的结束,从机收到P信号后退出本次通信; ③主机的每一次发送后都是通过从机的ACK信号了解从机的接收状况,如果应答错误则重发。 主机接收数据流程 ● 主机发送启动信号后,接着发送命令字节(其中 R/W=1) ● 对应的从机收到地址字节后,返回一个应答信号并向主机发送数据 ● 主机收到数据后向从机反馈一个应答信号 ● 从机收到应答信号后再向主机发送下一个数据 ● 当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”,从机收到ASK=1 的非应答信号后便停止发送 ● 主机发送非应答信号后,再发送一个停止信号,释放总线结束通信 注意:主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送)。 传输规则 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲) 数据改变:SCL为低电平时,SDA线才能改变传输的bit
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 |
|||
|
发表于2017-03-03 22:01:05
|
只看该作者
2#
I2C协议好复杂啊,相比之下,SPI真简单。
|
|||
|
发表于2017-03-03 22:23:56
|
只看该作者
3#
是有一定复杂性。 特别是用MCU模拟或者硬件方式实现一个I2C SLAVE器件。 BTW, 谁用过stm8s 实现了一个稳定可靠的 I2C slave? |
|||
|
发表于2017-03-03 23:11:18
|
只看该作者
4#
NXP的LPC812实现I2C Slaver有官方例程
|
|||
|
发表于2017-04-12 13:05:01
|
只看该作者
6#
好
|
|