IIC是简单实用的串行通信协议,只有两根线线,SDA 数据信号和 SCL时钟信号。单片机和外设通信使用的比较多,其实PC中也有使用串行通信协议,比如SMBUS.(还有LPC SPI 这些)

一  硬体:

IIC总线上只有一个主设备,多个从设备。主设备发起start信号带有设备地址,对应设备接受命名完成对应操作。

地址:地址有7bit ,前4bit是芯片厂商编号,后3位是芯片的硬体编织(A0A1A2这三个pin的状态)。

总线上有上拉电阻,所以闲置状态为高电平。

IIC协议和应用程序访问


数据采样:时钟上升沿采样数据线,所以时钟脉冲期间要保持数据不变。时钟低电平时才可以改变数据。

IIC协议和应用程序访问


一 :协议


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

IIC协议和应用程序访问


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

IIC协议和应用程序访问




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步可以重复多次,即顺序读多个寄存器

IIC协议和应用程序访问

IIC协议和应用程序访问


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

程序实现:

单片机对SDA和SCL的端口操作很简单,这里说一下PC应用程序怎么实现对IIC的操作。

第一个问题是权限,对底层操作需要RING0权限,这部分通过winio来实现,需要注意驱动级64位和32位是独立的,不兼容。

第二个问题是端口号,








相关文章:

  • 2022-12-23
  • 2021-12-26
  • 2021-11-11
  • 2021-05-22
  • 2021-04-08
  • 2021-04-10
猜你喜欢
  • 2022-12-23
  • 2021-12-10
  • 2021-04-15
  • 2021-08-22
  • 2022-12-23
相关资源
相似解决方案