1、IIC物理层

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

2、IIC通信协议

1、IIC的开始与结束信号

• 空闲时:SCL和SDA在上拉电阻的作用下变为高电平。

• 开始时:SCL为高电平时,SDA由高电平变为低电平。

• 结束时:SCL为高电平,SDA由低电平变为高电平。

2、传输数据的过程

• 当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信号,停止接收数据。

读操作过程

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

硬件IIC驱动原理的更多相关文章

  1. STM32硬件IIC驱动设计(转)

    源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论

  2. 九、IIC驱动原理分析

    学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...

  3. 4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  4. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  5. Android中Input型输入设备驱动原理分析<一>

    话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反正这个是没变的,在android的底层开发中对于Linux的基本驱动程序设计还是没变的,当然Android底层机制也 ...

  6. Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)

    在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于“Android 震动马达系统“的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的,是想彻底的了解从硬件到驱动 ...

  7. pwm驱动原理和代码实现

    学这个pwm真是非常曲则,首先是看s3c2440的datasheet,全英文的,并且还有硬件的时序图(非常多是硬件的工作原理,和软件控制不相关). 看了非常久加上网上看了资料才把这个pwm弄通. 当然 ...

  8. STM32 IIC双机通信—— HAL库硬件IIC版

    参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...

  9. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

随机推荐

  1. 这篇SpringCloud GateWay 详解,你用的到

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 背景 在微服务架构中,通常一个系统 ...

  2. Django 学习记录(AcWing)

    Django 2.1 搭建文件结构 前面的都是配置基本步骤,不需要理解,其他Django项目同样步骤操作: 接下来用Django-admin新建一个Django项目: django-admin sta ...

  3. 获得MySQL数据库存放位置

    更新记录 2022年6月13日 发布. 2022年6月11日 开始. 通过查看MySQL与存储目录相关的参数 show variables like '%dir%'; 通过查询后datadir参数的值 ...

  4. 红包雨中:Redis 和 Lua 的邂逅

    2018年,王思聪的冲顶大会,西瓜视频的百万英雄,再到映客的芝士超人,直播答题火爆全网. 我服务的一家电商公司也加入了这次热潮,技术团队研发了直播答题功能.答题结束之后,红包会以红包雨的形式落下,用户 ...

  5. NHibernte 4.0.3版本中,使用Queryover().Where().OrderBy().Skip().Take()方法分页获取数据失败

    问题代码如下: var result=repository.QueryOver<modal>() .Where(p=>p.Code==Code) .OrderBy(p=>p.I ...

  6. Qt+ECharts开发笔记(二):Qt窗口动态调整大小,使ECharts跟随Qt窗口大小变换而变换大小

    前言   上一篇将ECharts嵌入Qt中,在开始ECharts使用之前,还有一个很重要的功能,就是在窗口变换大小的时候,ECharts的图表尺寸也要跟随Qt窗口变换大小而变换大小.   Demo演示 ...

  7. Solution -「简单 DP」zxy 讲课记实

    魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...

  8. 在 IDEA 里下个五子棋不过分吧?

    大家好,我是二哥呀!今天给大家分享一个基于Netty的IDEA即时聊天插件,可以实现即时聊天.游戏对战(下棋). GitHub 地址:https://github.com/anlingyi/xecha ...

  9. 【RocketMQ】消息的消费

    上一讲[RocketMQ]消息的拉取 消息消费 当RocketMQ进行消息消费的时候,是通过ConsumeMessageConcurrentlyService的submitConsumeRequest ...

  10. 干货分享:小技巧大用处之Bean管理类工厂多种实现方式

    前言:最近几个月很忙,都没有时间写文章了,今天周末刚好忙完下班相对早点(20:00下班)就在家把之前想总结的知识点写出来,于是就有了这篇文章.虽无很高深的技术,但小技巧有大用处. 有时我们经常需要将实 ...