GrabDuck

i2c之基本常识 - tianming5202的专栏 - CSDN博客

:

I2C 线比较简单,只有两个线:

一根时钟线 SCL
一根数据线 SDA

支持的速率有 100/400/800KB/1M等

需要上拉,


1. I2C是主从模式,通常支持一个Master控制多个Slave
2. 读和写都需要 Master 主动发起,通常很少支持多Master情况
3. Slave称之为设备(或者外设),通过地址address来区分不同的slave
4. Slave的地址一般是7位,也有12位的(我还没有遇到过,不便多说)

5. 读写中规定了一些信号和数据,ST(起始信号),SAD(Slave地址和读写位),R/W(读写位),SAK(Slave对于Master的应答信号),SR(重复的起始信号),MAK,NMAK(Master收到了Slave数据的应答信号),SP(停止信号)释放,使I2C线空闲。
ST信号:SDA由 H->L, SCL保存 H tn(ST)时间,然后开始输出时钟。
SAD+R/W:SDA电平H/L, SDA电平H/L,时钟高/低电平采样, 与数据信号一样8位
DATA: 8位,SDA电平H/L,时钟高/低电平采样
SAK: 1位,SDA电平为 L(通常它紧接着8位数据,所以示波器上看上去就是一个9位的数据)
SP:SCL时钟输出停止,SLC电平H,tsu(SP)时间后 SDA线由 L->H
SR:SCL时钟输出停止,tsu(SR)时间后 SDA线由 H->L, 然后时钟应该继续输出
MAK/NMAK: 1位,SDA电平为 L, MAK是Master应答,NMAK是Master没有应答

6. 数据发送时是高位在前MSb(符合我们的阅读习惯)
7. SAD与R/W合成一个8位的数据,SAD为高7位,R/W最低位
8. 读写操作都是首先 Master 发 ST 信号,然后发 SAD+W(要读/写的Slave地址和读操作),此时为SAD的Slave回应 SAK信号,Master只有收到这个信号之后,才能继续完成读写操作。
9. 写操作,接7,Master发送 DATA 数据,并且每个DATA数据都必须要有Slave回应的SAK信号,最后Master发送 SP 信号(释放I2C线)
10. 读操作相比写操作麻烦一些,它需要先做一个写动作,然后再读。 接7,Master发送DATA数据(通知Slave我要读啥),Slave回应SAK,Master发送SR信号(重复Start信号),然后发送SAD+R信号(读操作),Slave回应SAK,slave发送DATA,Master回应 MAK 信号,对于Slave发送的每个DATA,Master都必须应答MAK信号,并且最后一个DATA信号NMAK(因为是最后一个了Master无需应答),然后发送SP信号释放I2C线。

以ST LIS3DSH 的加速度传感器(可以作为一个I2c slave)为例说明I2c的读写时序:


注:通过SA0 pin脚拉高拉低,有两个地址选择001100xb


注: 写操作,写单个字节或者多个字节。SUB是此芯片自定义的命令,可以就看成是一个DATA

注:读操作,写单个字节。可以看出其实是先写后读,SR信号可以看出。


注:读操作,读多个字节。