首页 > 其他分享 >硬件IIC驱动原理

硬件IIC驱动原理

时间:2022-08-23 01:34:11浏览次数:57  
标签:发送 信号 ACK 主机 硬件 从机 IIC 驱动

1、IIC物理层

  1. IIC通信属于同步半双工通信,IIC总线由两根信号线组成。一根是数据线SDA,一根是时钟线SCL,时钟线只能由主机发送给从机,数据线可以双向进行通信,总线上可挂载多个设备,挂载数量受到总线最大电容400pF限制,同时也受地址位数的影响。
  2. 连接在IIC总线上的设备都有自己的地址,主机可以通过地址寻找到挂载在总线上的设备,如果是一个MCU与外部设备例如OLED进行连接的时候,MCU的地址可以通过软件进行修改,外部设备如OLED(无法直接进行程序配置的设备)则可以通过修改它的硬件电路进行设备地址的修改。
  3. IIC总线上支持挂载多个IIC设备,包括主机设备和从机设备,当多个主机使用总线的时候,为了防止数据冲突,会利用仲裁的方式决定哪个设备占用总线。
  4. IIC总线会外接上拉电阻。当总线空闲的时候,两根线都为高电平。

2、IIC通信协议

1、IIC的开始与结束信号
image

• 空闲时:SCL和SDA在上拉电阻的作用下变为高电平。
• 开始时:SCL为高电平时,SDA由高电平变为低电平。
• 结束时:SCL为高电平,SDA由低电平变为高电平。
2、传输数据的过程

image

• 当SCL为高电平的时候,SDA稳定不变,此时SDA传输数据有效。
• 当SCL为低电平的时候,SDA可以改变高低电平,改变传输数据的bit位。

3、应答信号

  IIC设备进行通信的时候,例如数据和地址传输的时候,会带有响应机制。接收数据的时候,当发送数据端讲地址或者数据发送过来之后,若希望继续发送数据,接收端会向发送端发送 “ ACK ”信号表示希望对方继续发送数据,若接收端希望结束数据传输,则发送“ NACK(非应答信号) ”,发送端就会停止发送数据。
  在我们看到的代码和例程中很多都是这样写的,stm32的参考手册上也是一步一个检验,工程上这样使用是没有问题的,但是在IIC的通信协议上实际上并没有特别规定 ACK 信号什么时候发送和接收,在一些代码里面我们也可以看到,主从机关于应答信号这一块是我们人为设定的,也就是说,如果我们将主从机的程序设定好,也可以不用或者减少使用 ACK 应答的模式,这一点是一个写IIC驱动程序的时候的误区。

4、读写操作

• 写操作

1、主机要先发送start起始信号

2、主机发送I2C地址和和写操作位

3、从机返回ACK信号

4、之后主机发送寄存器地址

5、从机再次返回Ack信号

6、主机给从机发送数据

7、从机发送ACK信号,主机可以发送stop信号,也可以继续发送数据,继续进行通信。

单次读写

8、如果要写入多个数据只需要发送端继续发送数据,然后接收ACK信号即可。

多次读写

• 读操作

1.主机发送START信号,等待ACK应答。

2.从机发送ACK信号。

3.主机发送从机地址和写操作位,等待ACK应答信号。

4.从机发送ACK信号。

5.主机接收到ACK信号,发送从机寄存器地址,等待ACK信号。

6.从机发送ACK信号。

7.主机发送START起始信号,等待ACK应答

8.从机发送ACK信号给主机。

9.从机发送数据给主机,等待主机发送ACK信号

10.若想继续读取数据,主机可以继续发送ACK信号给从机,若不想继续读取,则发送NACK信号,停止接收数据。

image

读操作过程

  值得一提的是 7,8 这两步是为了照顾从机的响应时间而设置的,若从机响应足够快,或者主从机约定好通信时间,这两步可以取消。从这个读操作我们就可以看出实际上从机并没有能力直接把数据发送给主机,一切都是由主机引导的,所谓的从机发送数据

标签:发送,信号,ACK,主机,硬件,从机,IIC,驱动
From: https://www.cnblogs.com/dudiaoguhan/p/16614702.html

相关文章

  • 32seg*4com 段码LCD液晶显示驱动IC-VK1621B LQFP44/48、SSOP48、DICE,替代市面上1621B
    产品品牌:永嘉微电/VINKA产品型号:VK1621封装形式:LQFP44/48、SSOP48、SDIP28、DICE裸片 概述:VK1621是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD......
  • 【原创】xenomai UDD介绍与UDD用户态驱动示例
    目录xenomaiUDD与用户态驱动示例一、UDD介绍二、UDD原理及框架1.内存映射2.中断处理UDD与UIO的区别3.linuxUIO与xenomaiUDD框架对比3.1UIO机制3.2UDD机制三、UDD应......
  • Unity 将是驱动 C# 增长的引擎吗 ?
    Unity将是驱动C#增长的引擎吗? C#在中国的采用需要一个杀手级应用的带动,那么这样的一个杀手级应用是Unity吗,我这里大胆推测采用CoreCLR的新一代完全采用C#构建......
  • 硬件结构 硬盘--
    CPU的高速缓存,通常可以分为L1、L2、L3这样的三层高速缓存,也称为一级缓存、二级缓存、三级缓存。在Linux系统,我们可以通过这条命令,查看CPU里的L1Cache「数据」......
  • STC8H开发(十六): GPIO驱动XL2400无线模块
    目录STC8H开发(一):在Keil5中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(二):在LinuxVSCode中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(三):基于FwLib......
  • 64位内开发第二十三讲,分层过滤驱动-键盘过滤
    目录64位内开发第二十三讲,分层过滤驱动-键盘过滤一丶键盘过滤的两种方式1.1第一种方式驱动对象方式绑定1.2第二种方式,直接设备类型绑定.1.3效果64位内开发第二十三......
  • Unity 将是驱动 C# 增长的引擎吗 ?
    C#在中国的采用需要一个杀手级应用的带动,那么这样的一个杀手级应用是Unity吗,我这里大胆推测采用CoreCLR的新一代完全采用C#构建的Unity将是这样的一个杀手级应用。Uni......
  • Linux驱动开发十四.使用内核自带的LED驱动
    回顾一下我们现在先后都做了几种LED的点亮试验:裸机点亮LED使用汇编语言读写寄存器点亮LED使用C语言读写寄存器点亮LED在系统下直接操作寄存器映射点亮LED在设备树下......
  • 第一章 计算机硬件基础
    1、数据的表示R进制的表示(R可为二、八、十、十六)原则:逢R进一Decimail十进制;Binary二进制;Octal八进制;Hex十六进制R进制转十进制(按权展开)以二进制1101为例:......
  • Linux驱动开发十三.platform设备驱动——3.设备树下的platform驱动
    在上一章节我们使用了platform框架在没有设备树的时候是如何使用的,不过现在的大多数半导体厂商都把设备树给我们完善了。区别就是在没有设备树信息的时候需要我们自己想总......