I2C学习总结

i2c概述

I2C(Inter-Intergreted Circuit) 是一种串行通信协议,用于集成电路之间完成数据传输,i2c用广泛用以各种领域,包括电子设备、嵌入式系统、工业自动化等;

i2c仅仅只是一个数据传输的协议,具体传输的数据用途由上层决定;

针对i2c协议的一个小例子

该例子灵感出自参考文档;

针对上图中:我们类比单片机A为课堂中的老师,其它设备为学生;课堂上会有一些互动,如下流程说明,后面会针对例子和i2c中的通信做一些联系,这里有个大概流程即可;

  • 老师呼叫甲同学背诵课文
    1. 老师怒拍讲台,大喊安静;
    2. 点名甲同学,你给我背诵下《蜀道难》;
    3. 甲同学接收到请求,并回复收到;
    4. 此后开始背诵;“噫吁嚱,危乎高哉!蜀道之难,难于上青天!.....”
    5. 老师在甲同学背诵过程中不断的点头回应。
    6. 在甲同学背诵完成后,老师发话:“真不错,坐下吧”;(要不然甲同学会很尴尬)
  • 老师公布分数流程
    1. 老师又怒拍讲台,大喊安静,
    2. 老师点名:‘甲同学’;
    3. 甲同学回复:‘到’;
    4. 老师:‘我要告诉你分数了’;
    5. 甲同学回应:‘好的’;
    6. 老师:‘93分’;
    7. 甲同学:‘好的,我知道了’;
    8. 老师随即咳嗽一声,准备叫下一个同学;

协议特点

这里先抛出协议的特点,后续知识点说明部分会有针对性的说明;

  1. 仅需两根线即可完成通信(SDA、SCL);
  2. 均连接到总线上,无特定的主从之分,每个设备可访问总线上的其它设备;
  3. 串行通信,存在时钟线SCL用作接收指示;
  4. 总线上的设备既可以接收数据,也可以发送数据。但二者为互斥关系,所以为半双工通信方式;
  5. 存在应答机制,可实现接受侧的反压;

i2c重要知识点说明

SDA、SCL通信知识

  1. 默认情况下SDA、SCL的值均为1;
  2. 任何一个设备想要控制SDA、SCL输出0即可,输出1可通过外部的上拉完成输出1;
  3. 多个设备间的SDA、SCL为线与功能。当多个设备输出冲突时,将多个设备期望输出值进行与操作,即为最终SDA、SCL上的值;

i2c写操作

  1. 刚开始主机要发出一个start信号,然后发出一个设备地址(用来确定是往哪一个从机写数据),方向(读/写,0表示写,1表示读)。

  2. slave回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

每传输一个数据,接受方都会有一个回应信号,数据发送完之后,主机就会发送一个P停止信号。

白色背景:主→从

灰色背景:从→主

注意点:

  1. 写操作除了要指定设备地址,还需要指定对设备发生访问的地址,第一个数据为访问地址;;

带入前面的例子理解写过程

  • 老师公布分数流程

    1. 老师又怒拍讲台,大喊安静,(月考后,开始点名说分数);—发送start;
    2. 老师点名:‘甲同学’;—发送设备地址,指定甲同学;
    3. 甲同学回复:‘到’;—回应,代表从机存在并准备好了;
    4. 老师:‘我要告诉你分数了’;—指定要告知的是分数,也就是会知道写地址,指示从机该内容含义;
    5. 甲同学回应:‘好的’;—从机回应
    6. 老师:‘93分’; —发送数据;
    7. 甲同学:‘好的,我知道了’;—回应
    8. 老师随即咳嗽一声,准备叫下一个同学;— 发送P结束条件;

    以上例子i2c传输对应的其实就是教室里的声音,由于是单线的,所以也就是教室里只能存在一种声音,所以老师与同学之间的交流是串行执行的。当然可能我们人类由于存在某些潜规则,使得通信变的更简单了,但是电子设备中没有这种潜意识,所以需要再帧内指定地址、读写指示、从设备响应等动作完成一次通信;

i2c读操作

  1. 刚开始主机要发出一个start信号,然后发出一个设备地址(用来确定是从哪一个芯片读取数据),方向(读/写,0表示写,1表示读)。
  2. 回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后在传输下一个数据。
  3. 每传输一个数据,接受方都会有一个回应信号,数据发送完之后,主机就会发送一个P停止结束信号。

白色背景:主→从

灰色背景:从→主

说明:slave侧在完成一次传输后,需要master指示是否结束,或者进行下一次传输。slave默认会在当前地址进行递增动作进行下一次传输;读操作默认在上一写操作结束地址发生;

i2c读操作例子解读

  • 老师呼叫甲同学背诵课文
    1. 老师怒拍讲台,大喊安静;—start
    2. 点名甲同学;你给我背诵下《蜀道难》;—指定为读操作,并指定读的内容为《蜀道难》
    3. 甲同学接收到请求,并回复收到;—回应
    4. 此后开始背诵;“噫吁嚱,危乎高哉!蜀道之难,难于上青天!.....”—读数据
    5. 老师在甲同学背诵过程中不断的点头回应。—主机回应
    6. 在甲同学背诵完成后,老师发话:“真不错,坐下吧”;(要不然甲同学会很尴尬)—slave回应NACK,主机结束一次传输;

同写操作,人主观存在潜规则,通过例子理解I2c时注意需明确指定相关内容,电子设备才可以正确动作;

Start 和Pause条件

  1. 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通信的起始。
  2. 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通信的停止。

发送点、采样点

i2c总体的数据线与采样时钟线的配合为:

  1. 当SCL为低时完成数据的改变,此时不会发送采样动作;
  2. 当SCL为高时完成数据的采样,此时完成数据采样动作;

I2c其它特性

  1. 响应可分为ACK和NACK,用以指示是否继续传输还是结束传输;
    • ACK主要用以指示传输完成;
    • NACK主要用以传输的一些特殊情况,如下:
      • I2C总线上没有主机所指定地址的从机设备
      • 从机正在执行一些操作,处于忙状态,还没有准备好与主机通讯
      • 主机发送的一些控制命令,从机不支持
      • 主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了
  2. i2c slave会记住上一次操作的地址。下一次发送读动作即从该地址开始;所以要进行读之前需有一个无写数据的写动作;
  3. SCL、SDA的默认值为高;
  4. SDA的控制用主机和从机交替控制,同一时间仅一个设备控制。读写操作中的主机发送完相关信息后,需释放SDA的控制,由Slave控制是否应答;

参考文档

以上仅解释了大体部分,但i2c的其它特点还可以从以下文章学习到:

一篇短文让你彻底理解什么是I2C通信-CSDN博客

一文看懂I2C协议 - 知乎 (zhihu.com)

4分钟看懂!I2C通讯协议 最简单的总线通讯!_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/741661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【精解前端八股手写题】深入浅出柯里化

柯里化模板 柯里化是什么基本概念偏函数 柯里化有什么用场景1:拆分计算场景2:工厂函数 如何实现柯里化基础学习版:新人入门极简精华版:一行代码魔改升级版:闭包乱炖 柯里化是什么 基本概念 前端中的柯里化&#xff0…

逻辑斯特 + 神经网络梯度下降公式推导 + 向量化

全部推导来自吴恩达老师的视频课,下面仅作整理 逻辑斯特 神经网络

Vue+OpenLayers7入门到实战:使用webgl图层叠加超大量Point点要素,解决叠加超过一百万数据量点位导致浏览器卡住变慢的问题

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在解决地图上叠加超过几千以上要素点就开始变慢,一万以上的要素点的时候,浏览器页面就开始卡顿或直接卡死,甚至浏览器会弹出是否等待页面加载的提示。 这时候要怎么优化?OpenLayers官…

win10安装Ubuntu22.04LTS及深度学习相关配置详细教学

由于之前Ubuntu系统硬盘空间分配的不够,又去看了一下发现扩容很很麻烦。加以发现自己前面安装的深度学习环境版本与实际要用的不符,所以当机立断决定直接重装系统。 Ubuntu系统安装 参考视频:一看就会!8分钟真机安装【Ubuntu/Wi…

JWT原理

JWT 介绍 JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。这种信息可以被验证和信任,因为它是数字签名的。JWT通常用于…

Android Selinux详解[四]--新增服务标签相关

在工作过程中,SElinux常用的有以下几个文件可用于新增标签 可用于加标签的文件名含义对应的声明文件名(一般会声明的地方,根本上放哪里都可以)file_contexts给 文件/目录/节点 新增标签file.tegenfs_contexts给节点新增标签,与上一个不同的是…

SpringBoot总结-基于SpringBoot实现Web开发

原创作者:田超凡(程序员田宝宝) 版权所有,转载请注明原作者,严禁复制转载 3.1、静态资源访问 在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。 默认配置 Spring Boot默认提供静态资…

第二证券|沪指窄幅震荡跌0.26%,半导体概念走强,保险板块跌幅居前

13日早盘,沪深两市窄幅震动,三大指数均小幅跌落。盘面上,人工智能方向团体反弹,半导体个股走势活跃。 到午间收盘,沪指跌0.26%,报3047.85点;深成指跌0.15%,报9615.92点;…

ruoyi-vue插件集成websocket

链接:插件集成 | RuoYi WebSocketServer.java:补充代码 /*** 此为广播消息* param message 消息内容*/public void sendAllMessage(String message) {LOGGER.info("【websocket.sendAllMessage】广播消息:"message);try {for(String sessionI…

工作中Promise用法总结

工作中Promise用法总结,后面会持续更新觉得有意义的。 1.构造Promise 一般情况下代码是这样的: async function fn() {return new Promise((resolve, reject) > {let list []resolve(list)} }await fn()最后的返回值,如果promise的状态…

谈谈杭州某小公司面试的经历

#面试#本人bg211本,一段实习,前几天面了杭州某小厂公司,直接给我干无语了! 1、先介绍介绍你自己,我说了我的一个情况。 2、没获奖和竞赛经历吗?我说确实没有呢,面试官叹气了一下,只是…

300分钟吃透分布式缓存-27讲:Redis是如何进行主从复制的?

Redis 复制原理 为了避免单点故障,数据存储需要进行多副本构建。同时由于 Redis 的核心操作是单线程模型的,单个 Redis 实例能处理的请求 TPS 有限。因此 Redis 自面世起,基本就提供了复制功能,而且对复制策略不断进行优化。 通…

基于SWOT的智能手机企业财务战略研究1.62

摘 要 近些年,网络技术日新月异,智能手机深受消费者喜爱,人们通过网络,手机应用,可以极大地方便人们学习,工作等等。由于国家对电信行业的大力支持,中国消费者群体逐步成为最具潜力的手机购买者…

十六、接口隔离原则、反射、依赖注入

接口隔离原则、反射、特性、依赖注入 接口隔离原则 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 五种原则当中的i 上一章中的接口,即契约。 契约就是在说两件事,甲方说自己不会多要,乙方会在…

朴素贝叶斯算法基础——案例:对新闻进行分类

贝叶斯公式 朴素:假设特征与特征之间相互独立 朴素贝叶斯算法:朴素贝叶斯 应用场景:文本分类(单词作为特征) 拉普拉斯平滑系数 Ni:F1词在C类别所有文档中出现的次数 N:所属类别C下的文档所…

《C++游戏编程入门》第2章 真值、分支与游戏循环: Guess My Number

《C游戏编程入门》第2章 真值、分支与游戏循环: Guess My Number 2.1 关系运算符2.2 条件语句02.score_rater.cpp02.score_rater2.cpp02.score_rater3.cpp 2.5 switch语句02.menu_chooser.cpp 2.6 while循环02.play_again.cpp 2.7 do循环02.play_again2.cpp 2.8 break和continu…

AHU 数据库 实验三

《数据库》实验报告 【实验名称】 实验3 数据库的连接查询 【实验目的】 1. 熟悉基本的连接查询的概念和作用; 2. 了解数据库管理系统DBMS 实现连接查询的基本方法; 3. 掌握SQL语言连接查询语句的语法和功能&#…

.NET CORE Aws S3 使用

1.安装指定的包 Install-Package AWSSDK.S3 -Version 3.3.104.10 2.使用帮助类 using System; using System.Collections.Generic; using System.Text; using Amazon; using Amazon.Runtime; using Amazon.S3; using Amazon.S3.Model; using System.IO; using System.Threadi…

Spring存储基础知识

一、对象存储 1.创建bean对象 public class User {public void sayHi() {System.out.println("hi student");} } 2.bean存入Spring 在spring-config.xml,将 bean(com.spring.demo.User)存到 Spring 容器中,它的名称…

【数据结构学习笔记】选择排序

【数据结构学习笔记】选择排序 参考电子书:排序算法精讲 算法原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元…