个人学习记录,仅供参考。
IIC作为常用的通信总线,常被用于连接低速外设,如传感器等。IIC有协议标准,但由于灵活的双向总线,也有一些设备的IIC和常规有所不同,这里主要还是介绍标准IIC,在具体传感器介绍时候会穿插一些非标操作。其实看懂数据手册之后驱动起来问题不大,只需要注意IIC设备地址、IIC寄存器地址、IIC通信频率和应答机制就行。
1.IIC的时序
IIC标准时钟200KHz,部分设备支持400KHz或更高,部分设备只支持100KHz或更低。
IIC通信协议包含 起始、器件写、器件读、寄存器地址、写数据、读数据、写响应、读响应、结束这几部分,随机组合构成一个完整的读or写操作。
1.1起始位和结束位

IIC通信协议要求地址线只能在时钟线拉低时跳变,在时钟线拉高时的地址线跳变会被判断为通信起始或者结束标志。
1.2应答和非应答

在主机发送器件地址、寄存器地址和写数据时需要获取从机的响应状态,此时主机释放SDA总线并在时钟拉高后判断SDA总线电平,只有SDA被从机拉低说明从机接收正常。
在主机读数据时要给从机发送响应状态,用ACK来告诉从机 当前主机接收正常。若主机不再想接收数据,则向从机发送NACK停止接收。
1.3器件地址和寄存器地址(读写数据)

每一个IIC从设备都有自己的器件地址,当一条IIC总线上挂载多个从设备时可以通过各自器件地址进行区分,器件地址只有7bit,加上一个读写位构成了1个8bit读写指令。读写位W/R=0表示写指令,W/R=1表示读指令。

寄存器地址和读写数据都是8bit为一组,比特位高位在前低位在后,但是在多byte读或写时的高低字节先后顺序在不同器件有所不同,一般IIC器件地址可以自增,因此是低byte在前,高byte在后。
1.4读操作和写操作
IIC读写分为标准读写和非标准读写,这里以普通标准读写流程示例。
需要注意,不管是读操作还是写操作,每个字节传输后都存在一个ACK位,表示主机或者从设备已经成功接收。
1.4.1写操作

写操作流程如上,部分设备支持连续写入,在写入起始寄存器地址后可以接多个数据,需要注意每一个字节数据后都需要等待从机发送ACK,如果是NACK则说明通信失败,从机没有接收到数据。
1.4.2读操作

读操作流程如上,在读数据之前需要先进行伪写操作来告诉从机需要操作的寄存器地址,然后进行读指令(部分设备支持直接读,无需伪写。也有一些设备需要完整写指令进行读操作。总之具体情况具体分析,特殊设备特殊处理)。有的设备支持连续读取,在指定第一个读取地址后从机自动进行地址累加操作。也有只能按照固定字节读取的设备,这时候需要注意高低字节关系。在主机接收到每个数据字节后都要对从机响应ACK,除非你想停止读取。停止读取需要发送NACK后发送
2.部分IIC传感器读取流程
2.1温度传感器GD60914
GD60914内部集成了信号处理ASIC,因此可以无需配置和计算就输出对应温度值,GD60914分为UART型号和IIC型号,在IIC型号下读取温度数据前需要先发送读指令,等待测量完成后再读取对应数据寄存器,具体流程如下,如只需要其中一个温度可对流程进行精简。

其中IIC器件地址0x18,读操作返回2字节数据,低字节在前高字节在后。IIC频率手册上并未说明,我用的是12KHz的通信频率,延时时间根据型号而定。

2.2温度传感器MLX90614/MLX90615
作为GD60914的对标产品,MLX90614的控制方法类似,且mlx系列有一个特点就是会响应0x00器件地址。下面是它的控制流程,同样默认配置就可使用(如需控制功耗可使用休眠指令进入低功耗模式,这里不展开介绍)

其中MLX90614 IIC器件地址0x5A,其中MLX90615 IIC器件地址0x5A(正如上述,mlx系列会响应0x00器件地址,也可用0x00代替)。
读操作返回3字节数据,依次为数据低字节、数据高字节、数据PEC校验。若不关注校验数据,可以在接收完数据后发送NACK停止接收。IIC频率手册上标明10KHz~100KHz。
这里延时是因为默认状态下MLX90614会有滤波处理,只有滤波完成才会将数据更新到RAM中
2.3温湿度传感器SHT30-DIS
SHT30在读数据前需要先写寄存器,并且需要配置模式才能正常工作,具体流程如下。
由于SHT30写指令是2字节不含数据,且支持写完寄存器直接读数据(不需要再进行伪写)因此需要区分控制。关于模式配置如下,这里配置0x2103表示高重复性且每秒转换1次温湿度数据。

读操作流程和数据返回格数如下,若不需要部分数据可再接收到需要的数据后发送NACK停止接收。需要注意设置完转换速率后要按照对应转换间隔延时。

2.4 压力传感器89BSD时序
1.初始化

2.延时200ms后读取校准参数C1~C6

3.发送转换指令

4.延时50ms后读取数据数据

5.用到了再补充。。。。。。。
3.FPGA实现主机方法
FPGA搭建IIC可以将步骤拆分实现读写控制。

下面是IIC底层驱动模块的状态机
