IIC是简单实用的串行通信协议,只有两根线线,SDA 数据信号和 SCL时钟信号。单片机和外设通信使用的比较多,其实PC中也有使用串行通信协议,比如SMBUS.(还有LPC SPI 这些)
一 硬体:
IIC总线上只有一个主设备,多个从设备。主设备发起start信号带有设备地址,对应设备接受命名完成对应操作。
地址:地址有7bit ,前4bit是芯片厂商编号,后3位是芯片的硬体编织(A0A1A2这三个pin的状态)。
总线上有上拉电阻,所以闲置状态为高电平。
数据采样:时钟上升沿采样数据线,所以时钟脉冲期间要保持数据不变。时钟低电平时才可以改变数据。
一 :协议
1 信号
start 信号:SCL保持高电平,SDA由高到底 。用来标记传输开始
stop信号:SCL保持高电平, SDA由底到高。用来标记传输结束
ACK应答信号:第9个时钟脉冲前 ,SCL低电平 , SDA底电平。(总线闲置是高电平状态)
Master每发送完8bit数据后等待Slave的ACK。即在第9个clock,若从IC发ACK,SDA会被拉低。
若没有ACK,SDA会保持高电平,MASTER需要从新start重发或者stop
2 写时序
start + device address+R/W (设备地址)
ACK (从设备返回的应答)
word address (要操作的寄存器地址)
DATA (要写入的数据)
写寄存器的标准流程为:
1. Master发起START
2. Master发送I2Caddr(7bit)和w操作0(1bit),等待ACK
3.Slave发送ACK
4. Master发送reg addr(8bit),等待ACK
5.Slave发送ACK
6.Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7.Slave发送ACK
8. 第6步和第7步可以重复多次,即顺序写多个寄存器
9.Master发起STOP
3 读时序
读要比写复杂一些,因为要先把要读的地址写入从设备,再读从设备。
读寄存器的标准流程为:
1. Master发送I2Caddr(7bit)和w操作1(1bit),等待ACK
2.Slave发送ACK
3. Master发送reg addr(8bit),等待ACK
4.Slave发送ACK
5. Master发起START
6. Master发送I2Caddr(7bit)和r操作1(1bit),等待ACK
7.Slave发送ACK
8. Slave发送data(8bit),即寄存器里的值
9.Master发送ACK
10. 第8步和第9步可以重复多次,即顺序读多个寄存器
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
程序实现:
单片机对SDA和SCL的端口操作很简单,这里说一下PC应用程序怎么实现对IIC的操作。
第一个问题是权限,对底层操作需要RING0权限,这部分通过winio来实现,需要注意驱动级64位和32位是独立的,不兼容。
第二个问题是端口号,