1. 引言
IIC总线是系统中比较常用的一种总线了。很多芯片用的都是IIC。
比如很多MEMS的姿态传感器(陀螺仪,加速度计,磁强计),一些加密芯片,E2PROM……比如mpu6050、9250、hmc5883……
适用于这些功能比较多而且速率要求不高的场合。
下面简单记录一下IIC总线的要点。记住高亮的地方基本就够了。
2. IIC总线介绍
2.1 IIC
IIC也可以写做I2C,全称是Inter IC bus.
是由PHLPS提出的一种一种串行数据总线协议
2.2 IIC有3种速率:
- 低速模式 100 kb/s
- 快速模式 400 kb/s
- 高速模式 3.4M/s
2.3 引脚
IIC总线2根总线:
- 时钟线 SCL,由master提供
- 数据线 SDA
2.4 寻址
IIC总线是主从设备,从机地址位数为7位。一个主机在总线上最多可以挂127个从机(7位地址最多128,去除0x0广播地址,还剩127),设备间通过不同的设备地址来区分。
- 任一设备输出低电平,都能拉低整个总线
- 每个IIC器件都有自己的地址,7位,一般4位表示类型,3位表示编号。
一般主机寻址发送8位地址,7位器件地址 + 1位读写位(0:W,1:R)。
发送到总线上时也是高位先发。
不同厂家描述不同,如果datasheet说自己是7位地址,那就上图的A6~A0,如果说自己的8为地址,分读地址和写地址,那就是厂家把读写位加进去了。
3. 时序图
百度图片给的第一张结果,这就是一个典型的IIC读写时序
记住下面标黄的几个特征就行了。
3.1 空闲态
无数据传输时,SDA和SCL均为高
3.2 起始结束
SCL高时,SDA变化
如上图的框1和框5
3.3 数据传输
SCL低时,SDA变化
如上图框1和框2之间,给出数据,在SCL高电平时(框2),读取数据
3.4 ACK信号
ack信号的理解不是那么直观。
主机每发送完一个字节(8bit),会释放SDA总线,把控制权交给从机。如果从机有响应,会在下一个时钟周期里,把SDA拉低。作为一个ack信号。
3.2 例子
不同芯片,需要的时序是不一样的。
但是主流的IIC读写方式是这样的。
- 发送1字节(7位地址+W信号)
- 发送1字节(寄存器地址)
- 发送1字节(7位地址+R信号)
- 接收n字节
2、3步之间有时候在一次周期内完成,有些芯片需要2次(中间掺杂 结束 和 其实信号)
4. 驱动代码
4.1 mcu
MCU中的IIC很多是使用IO口模拟的。
这些一方面用起来比较方便,任何两个引脚都可以用,而且不涉及使用中断等,使用起来相对比较简单,而且有助于我们理解时序图。
网上例程太多了,搜IIC模拟一大把,按着时序图很快能写出来。如果不能用就用逻辑分析仪抓下波形看一下,稍微微调一下。(在此强推淘宝上那种很便宜的 逻辑分析仪,很好用,比示波器好用多了。而且低速总线我们也用不到那种很贵的带宽很高的逻辑分析仪,用了很多年了,确实是调时序的神器)。
4.2 Linux
在linux系统中怎么使用IIC驱动,详解下一篇博客。