I2C通信协议详解和通信流程分析

2023-05-16

1、I2C通信特征

1.1、物理接口:SCL + SDA

(1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。
(2)SDA(serial data): 数据线,通信数据都通过SDA线传输

1.2、通信特征:串行、同步、非差分、低速率

串行:只有一根数据线,每次传输一个bit位;
同步:主设备和从设备的工作时钟频率是一样的,主设备通过SCL时钟线给从设备提供时钟频率;
非差分:因为I2C通信速率不高,而且通信双方距离很近,一般是板级通信,所以使用电平信号通信;
低速率:I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低。一般几百KHz,不同的I2C芯片的通信速率可能不同,具体在编程的时候要看自己所使用的设备允许的I2C通信最高速率,不能超过这个速率;

1.3、通信模式:主设备+从设备

(1)I2C通信时,通信设备之间的地位是平等的,分为主设备和从设备,其中主设备一个、从设备多个。主设备要主导整个通信过程,从设备根据I2C协议被动的响应主设备;
(2)在I2C通信中,没有规定谁做主设备、谁做从设备,是通信双方自己协商的。一个设备在同一时间只能做主设备或者从设备,但是有的设备可以通过软件配置来决定在此次通信时做主设备还是从设备。

1.4、可以多个设备挂在一条总线上

在这里插入图片描述

(1)I2C总线上可以挂载一个主设备和多个从设备,实现一对一(一个主设备 + 一个从设备)或者一对多(一个主设备 + 多个从设备)的通信;
(2)主设备负责调度总线,决定某个时间和其中一个从设备通信。在同一时间,只有主设备和其中一个从设备通信,其余的从设备处于等待状态,等待主设备与其通信;
(3)每个从设备在I2C总线上都有唯一的地址,主设备就是通过地址来区分不同的从设备,从而决定和哪一个从设备通信。

1.5、I2C总线的状态

空闲态:当SCL与SDA同时为高电平时,为空闲态;
忙态:主设备和从设备正在通信;
起始状态:当主设备在I2C总线上发出起始信号,开始一次通信;
停止状态:当主设备在I2C总线上发出停止信号,停止本次通信;

1.6、I2C总线协议

(1)主设备发送一个起始信号;
(2)主设备接着发送8bit数据,其中7位是从设备的地址,一位表示此次主设备是要读数据海思写数据;
(3)和主设备发送的地址匹配的从设备发出一个ack响应信号;
(4)主/从设备将数据发送到SDA总线上,每次传输都是8bit数据;
(5)主/从设备从SDA线上接收数据,并发送一个ACK响应信号;
(6)还可以接着n个发送和接收的过程;
(7)主设备发送停止信号,停止本次通信;

1.7、I2C从设备地址

(1)I2C通信的每次有效数据都是8bit,从设备地址是7bit,但是I2C主设备发送从设备地址时还是发送的8bit;
(2)在主设备发送从设备地址时,8bit数据中高7位是从设备地址,最低一位(LSB)是表示读写位;
(3)举例:KXTE9芯片的I2C地址固定为0b0001111(0x0f),最低位是1表示主设备读从设备,最低位是0则表示主设备写从设备。主设备读从设备时SAD是0b00011111,主设备写从设备SAD应该是0b00011110。

1.8、从设备地址知识补充

(1)一般从设备的地址都是固定的,在数据手册里可以查到,这也就是意味着在同一条I2C总线上,不能有两个及以上的同款从设备,不然就无法通过从地址来区分这两个设备。大多数的从设备地址都是固定的,因为没有必要同时接两个,比如重力传感器,你接一个就可以测出重力加速度,何必接两个。但是也有些设备需要同时接多个,比如一块EEPROM芯片(I2C接口)的容量不够就可能接两个。对于这种情况,生成EEPROM的厂家是做了预留的,EEPROM芯片的从地址一部分是固定的,一部分是通过给EEPROM芯片的引脚接高低电平来决定的。
(2)假设EEPROM芯片的7位地址,其中高5位是固定的0b111111,低两位是根据两个引脚的高低电平来确定,接高电平代表1,接低电平代表0。一块芯片把两个引脚接高电平,则从设备地址是0b11111111;另一块芯片把两个引脚把低电平,则从设备地址是0b111100。

1.9、主要用途

I2C通常是用在板级通信的,距离很近,Soc和各种外设的通信就是I2C通信方式,比如触摸屏、各种sensor等,外设的数据手册里会说明通信方式;

2、I2C控制器的结构框图

在这里插入图片描述

(1)最左侧是I2C总线的时钟来源,来源是时钟系统的PCLK_PSYS,PCLK_PSYS经过分频后得到I2C总线的时钟频率,然后主设备会通过SCL线将时钟信号传给从设备;
(2)I2C总线的控制单元,里面包含两个重要的寄存器:I2CCON和I2CSTAT寄存器。控制单元会对PCLK_PSYS时钟信号进行两级分频,产生通信需要的时序信号,配置I2C设备的主从模式等,具体细节看两个寄存器的说明;
(3)Address Register和Comparator是当设备作为从设备时用到的,Address Register寄存器里保存的是自己作为从设备的地址,Comparator是比较器,比较此次从I2C设备收到的地址是否和自己的地址相等,如果相等则代表主设备要和自己通信,如果不相等,就不用对此次通信做任何处理。
(3)Shift Register和I2CDS:I2CDS寄存器是保存接收/发送的数据,Shift Register是移位寄存器,负责将I2CDS寄存器里的数据一位一位的发送SDA总线上,或者将总线上的数据一位一位的存到I2CDS总线上,这要看当时是发送模式还是接收模式。

3、I2C控制器的模式

(1)主设备发送模式;
(2)主设备接收模式;
(3)从设备发送模式;
(4)从设备接收模式;
备注:设备可以是上面四个模式中的任意一种,但是同一时间只能是其中的一种,要么是作为主设备要么是作为从设备。

4、I2C的时序分析

4.1、时序介绍

时序就是时间顺序,实际上在通信中时序就是通信线上按照时间顺序发生的电平变化,以及这些变化对通信的意义就叫时序,不对的通信的协议对时序的要求不同。

4.2、通信起始条件和结束条件

在这里插入图片描述

起始信号:在SCL为高电平的时候,SDA产生一个下降沿;
停止信号:在SCL为高电平的时候,SDA产生一个上升沿;

4.3、数据有效性

在这里插入图片描述

(1)SDA 线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。SCL为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”;SCL为低电平时表示无效数据,此时SDA会进行电平切换,为下次数据表示做准备。
(2)数据有效性:在I2C总线通信时,在总线上传输的数据并不都是有效数据。比如开始信号和停止信号,并不代表什么实际的含义,只是通信协议里规定的。正因为我们的有效数据应该在SCL为高电平时SDA保持稳定,所以才能区分出开始信号和停止信号。

4.4、响应ACK

在这里插入图片描述

主/从设备在发送完一次数据后,需要一个ACK响应信号。每个通信周期传输8个数据,在第九个通信周期,发送端将SDA总线拉高,然后释放总线的控制权。如果接收端在第九个周期将SDA拉低,就是发出了ACK信号,如果在第几个周期SDA一直是高电平则代表没有发出ACK信号。

4.5、空闲态

在这里插入图片描述

空闲态:在I2C总线上没有主、从设备进行通信,此时SCL和SDA一直保持高电平;

5、I2C总线的读/写数据操作

在这里插入图片描述

5.1、写模式

(1)主设备发送开始信号;
(2)主设备接着发送8bit数据,其中7bit是从设备的地址,1bit表示此次主设备是要读数据还是写数据;
(3)从设备发送ACK响应信号;
(4)主设备将要写的数据每次发送8bit到SDA线上,从设备接收到发送ACK响应信号;
(5)当主设备发送完数据后,发送一个停止信号;

5.2、读模式

(1)主设备发送开始信号;
(2)主设备接着发送8bit数据,其中7bit是从设备的地址,1bit表示此次主设备是要读数据还是写数据;
(3)从设备发送ACK响应信号;
(4)从设备将数据每次发送8bit到SDA线上,主设备接收到发送ACK响应信号;
(5)当主设备接收完数据后,发送一个停止信号;

6、I2C的通信流程

6.1、I2C通信的主设备发送流程

在这里插入图片描述

(1)通过操作I2CCON寄存器,将设备配置成主发送模式;
(2)将从设备的地址写到I2CDS寄存器中;
(3)往I2CSTAT寄存器写0xF0,让I2C控制器产生一个开始信号;
(4)移位寄存器将I2CDS里的数据发送到SDA总线上;
(5)在收到ACK信号后,中断被挂起,需要中断处理程序来处理;
(6)中断处理程序判断是否是要结束本次通信;
(7)如果不是结束本次通信,则将新的数据写到I2CDS寄存器中,然后清中断挂起标志,将数据发送到SDA总线上,等待ACK信号,进入下一次判断;
(8)如果是要结束本次通信,则往I2CSTAT寄存器中写0xD0,产生一个停止信号,清中断挂起标志,等停止信号发送完毕则结束本次通信;

6.2、I2C通信的主设备接收流程

在这里插入图片描述

(1)通过操作I2CCON寄存器,将设备配置成主接收模式;
(2)将从设备的地址写到I2CDS寄存器中;
(3)往I2CSTAT寄存器写0xB0,让I2C控制器产生一个开始信号;
(4)移位寄存器将I2CDS里的数据发送到SDA总线上;
(5)在收到ACK信号后,中断被挂起,需要中断处理程序来处理;
(6)中断处理程序判断是否是要结束本次通信;
(7)如果不是结束本次通信,则从I2CDS寄存器中读取数据,清中断挂起标志,移位器将SDA上的数据再存到I2CDS寄存器中,进入下一次循环判断;
(8)如果是要结束本次通信,则往I2CSTAT寄存器中写0x90,产生一个停止信号,清中断挂起标志,等停止信号发送完毕则结束本次通信;

6.3、I2C通信的从设备接收流程

在这里插入图片描述

(1)通过操作I2CCON寄存器,将设备配置成从接收模式;
(2)在SDA总线上检测到开始信号,I2CDS寄存器接收到数据;
(3)将I2CDS寄存器中接收到的数据和I2CADD寄存器中保存的地址进行比较;
(4)判断是否匹配;
(5)如果不匹配,则表示主设备不是和自己通信,不用再进行下面的步骤;
(6)I2C地址匹配则中断产生,告诉设备主设备要和自己通信,并发送一个ACK信号;
(7)从SDA总线上读取数据、处理数据,并发送一个ACK信号,然后清中断;
(8)判断是否要停止本次通信,也就是有没有检测到主设备发送停止信号;
(9)如果不停止通信,则再次从SDA总线上将数据读取到I2CDS寄存器中,然后产生中断,重复之前的步骤;
(10)如果是停止本次通信,则不再做响应即可;

6.4、I2C通信的从设备发送流程

在这里插入图片描述

(1)通过操作I2CCON寄存器,将设备配置成从发送模式;
(2)在SDA总线上检测到开始信号,I2CDS寄存器接收到数据;
(3)将I2CDS寄存器中接收到的数据和I2CADD寄存器中保存的地址进行比较;
(4)判断是否匹配;
(5)如果不匹配,则表示主设备不是和自己通信,不用再进行下面的步骤;
(6)I2C地址匹配则中断产生,告诉设备主设备要和自己通信,并发送一个ACK信号;
(7)写数据到I2CDS寄存器,然后清中断;
(8)判断是否要停止本次通信,也就是有没有检测到主设备发送停止信号;
(9)如果不停止通信,则将I2CDS寄存器中的数据发送到SDA总线上,然后产生中断,重复之前的步骤;
(10)如果是停止本次通信,则不再做响应即可;

7、I2CCON寄存器

在这里插入图片描述>(1)bit0-3:配置I2C时钟信号的二级分频系数;
(2)bit4:中断挂起标志;
(3)bit5:I2C总线的发送/接收使能;
(4)bit6:配置I2C时钟信号的一级分频系数;
(5)bit7:配置I2C总线是否要在每次通信周期的末尾发送ACK响应信号;

8、I2CSTAT寄存器

在这里插入图片描述

(1)bit0:判断上一次的通信周期是否收到ACK响应信号;
(2)bit1:I2C总线的地址清零标志;
(3)bit2:I2C总线从设备的地址标志位;
(4)bit3:I2C的总线总裁标志位;
(5)bit4:发送/接收使能位;
(6)bit5:如果是读,0代表总线空闲,1代表总线忙;如果是写,写0则I2C控制器发出一个停止信号,写1则I2C控制器发出一个开始信号;
(7)bit6-7:配置设备的模式;

9、分析KXTF9-2050芯片的I2C通信协议

参考博客:《通过KXTF9-2050芯片分析I2C协议》。

推荐

给大家推荐一款嵌入式工程师的学习神器,里面包含C语言、linux、操作系统等嵌入式工程师必备的知识点,不仅可以学习知识点还有配套的练习题、大厂面试题。博主在入门嵌入式行业时也是在这个平台学习,如果你是想入门嵌入式或者是找工作,都强烈推荐你使用这个网站。
《学习神器点这里》
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

I2C通信协议详解和通信流程分析 的相关文章

  • nRF52832的I2C例程代码

    nRF52832的I2C例程代码 include 34 nrf drv i2c h 34 include 34 app error h 34 define I2C SCL PIN 0 SCL引脚号 define I2C SDA PIN 1
  • Linux 下 i2c switch(选路芯片mux) — pca9548

    作者 xff1a 韩大卫 64 吉林师范大学 现有的关于i2c switch 资料非常少 即使阅读完官方的datasheet 也不能写出完全正确的操作 因为内核中的驱动本身不是那么完善的 还有一些资料是单片机编程的 xff0c 可惜在lin
  • 十九、I2C驱动及应用

    一 概述 1 Linux主机驱动和外设驱动分离思想 外设驱动 API 主机驱动 板级逻辑 具体的i2c设备 xff08 camera xff0c ts xff0c eeprom等等 xff09 主机驱动 xff1a 根据控制器硬件手册 xf
  • I2C设备主机与从机地址设置

    1 I2C主机与从机定义 I2C设备一般使用MCU作为主机 xff0c 主机与从机通过总线连接起来 xff0c 分别是SCL时钟总线和SDA数据总线 xff0c 主机发送给从机SCL时钟信号 xff0c SDA发送数据 xff0c 如下图所
  • I2C驱动体系结构一:驱动软件概念与对应硬件的关系

    一 概念 xff1a 1 设备 xff1a struct device xff1a 该数据结构是对物理设备的软件抽象 xff0c 比如I2C slave xff08 对应i2c client xff09 和I2C 适配器 xff08 对应i
  • I2C总线和SPI总线

    I2C串行总线一般有两根信号线 xff0c 一根是双向的数据线SDA xff0c 另一根是时钟线SCL I2C协议 2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL SDA传输数据是 大端传输 xff08 字节高位
  • I2C通讯协议介绍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线 具有引脚少 xff0c 硬件实现简单 xff0c 可扩展性强的优点 I2C总线的另一优点是支持多主控 xf
  • I2C 简介

    1 I2C 简介 这里的内容参考的是 2014 4 4 的 V 6 版本的官方 I2C Bus 规格书 xff0c 第六章有给出相应的链接 1 1 引脚 I2C 一般而言是一种同步半双工的通信方式 xff0c 所以除了电源引脚之外 xff0
  • i2c那些坑

    origin http bbs ntpcb com simple t126695 html I2C 的那些坑 一般情况下 xff0c i2c 设备焊接没什么问题 xff0c 按照设备手册一步步来 xff0c 基本上就顺风顺水能够用起来 如果
  • Linux控制I2C/SMBus设备

    平台 xff1a 树莓派 bcm2835 Raspberry Pi 3 Model B Rev 1 2 I2C是Philips开发的一种两线通信协议 xff0c 常用于一些对速度要求不高的小型器件上 SMBus是系统管理总线 xff0c 基
  • STM32硬件I2C

    以I2C2为例子 硬件I2C不需要我们手动去翻转电平 首先配置I2C xff1a 配置GPIO xff0c 配置复用功能I2C 配置复用开漏 xff0c 使能I2C I2C起始条件函数 64 param I2Cx where x can b
  • I2C接口

    I2C的结构和特点 他是一具有两条总线线路 即一条串行数据线SDA和一条串行时钟线SCL 每个连接到总线上的器件都可以通过唯一的地址联系主机 它是一个真正的多主机总线 数据传输通过冲突检测和仲裁防止数据被破坏 串行的8位双向数据传输位速率更
  • Raspberry Pi上设置I2C LCD

    在本教程中 我将向您展示使用I2C设置LCD所需的一切 连接LCD I2C也被称为两线接口 因为它仅使用两根线来发送和接收数据 实际上 如果算上Vcc和地线 则是4线 但是电源始终可以来自其他来源 连接启用I2C的LCD 将LCD与I2C背
  • 尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

    我遇到了问题 在启动通过 I2C 从 Arduino 请求数据的脚本时 python 有时会在我的 raspberry pi 3 上抛出这个 IOError 电气连接是完美的 所以这不是问题 此外 我在使用 i2cget y 1 0x04
  • Linux:从用户空间实例化:eeprom new_device

    环境 x86 Ubuntu 14 04 我想获得类似的东西 i2c0 eeprom eeprom 50 compatible at 24c32 reg lt 0x50 gt 但因为在 x86 中没有可用的设备树 所以我遵循i2c insta
  • 为什么我只收到第一个地址字节? (I2C协议)

    期望从机确认并返回数据 但它没有 这是我的协议 这是我的数据表 数据表提到 从机将通过首先发送 MSB 字节来应答 Byte0 和 byte1 包含 预测值 所有字节均由主机确认 Edit 源库 另外仅供参考 我使用的是 Arduino F
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取

    我正在尝试使用 C 写入和读取 I2C 总线 我的I2C总线是虚拟的 第一件事是加载内核模块i2c stub 我可以通过 bash 完成所有事情 现在我将其移植到 C 我可以打开i2c总线 获取特定地址的i2c总线 但无法读写 我正在虚拟化
  • 读取时不返回写入 I2C 的缓冲区

    我试图在写入后从 I2C 总线上的内存位置读取一个值 当我在终端中运行它时 我得到奇怪的输出 这是我的程序 include
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT

随机推荐

  • 比较两个List是否相等

    1 直接使用equals 比较 众所周知 xff0c 两个列表具有完全相同的元素并且具有完全相同的顺序时 xff0c 它们是相等的 因此 xff0c 如果我们业务要求两个list顺序一致 xff0c 可以使用equals xff08 xff
  • JVM-StringTable(三)

    一 常量池与串池StringTable的关系 span class token keyword public span span class token keyword class span span class token class n
  • SpringBoot常用拦截器(HandlerInterceptor,ClientHttpRequestInterceptor,RequestInterceptor)

    一 SpringBoot常用拦截器 下面3种拦截器 xff0c 都是http拦截器 xff0c 在处理业务逻辑之前对http请求信息进行处理 xff0c 比如获取请求头 xff0c 请求参数 xff0c 设置请求头 xff0c 请求参数等等
  • JAVA多线程基础篇-join方法的使用

    一 概述 join 是Thread类中的一个方法 xff0c 它的作用是将当前线程挂起 xff0c 等待其他线程结束后再执行当前线程 xff0c 即当前线程等待另一个调用join 方法的线程执行结束后再往下执行 通常用于在main主线程内
  • BindingException:Invalid bound statement (not found)异常

    一 前言 本文的mybatis是与springboot整合时出现的异常 xff0c 若使用的不是基于springboot xff0c 解决思路也大体一样的 二 从整合mybatis的三个步骤排查问题 但在这之前 xff0c 我们先要知道整合
  • SQL中case when用法详解及使用案例

    一 语法 Case具有两种格式 简单Case函数和Case搜索函数 简单Case函数格式 xff1a CASE 列名 WHEN 条件值1 THEN 选项1 WHEN 条件值2 THEN 选项2 ELSE 默认值 END Case搜索函数 x
  • 想入行C++游戏脚本制作?首先听听7年经验大佬怎么说?

    先自我介绍一下 xff0c 七年的程序开发经验 xff0c 在小一线城市税后2W多点 xff0c 本应过着很舒适的生活 xff0c 每天喝点小酒 xff0c 玩玩游戏 但自从入了A股 xff0c 一切都改变了 xff0c 如今的我 xff0
  • 大学刚毕业,用10000小时,走进字节跳动拿了offer

    前言 xff1a 没有绝对的天才 xff0c 只有持续不断的付出 对于我们每一个平凡人来说 xff0c 改变命运只能依靠努力 43 幸运 xff0c 但如果你不够幸运 xff0c 那就只能拉高努力的占比 2020年7月 xff0c 我有幸成
  • tensorflow中tfrecord数据操作

    前言 xff1a 为了更加展示tfrecord数据的相关操作 xff0c 笔者后续又写了一个实践的简单例子进一步解释 xff0c 具体可以看 xff1a TFrecords 制作数据集小例子 xff08 多标签 xff09 爱吃火锅的博客
  • 软件测试阶段

  • VR技术类毕业论文文献有哪些?

    本文是为大家整理的VR技术主题相关的10篇毕业论文文献 xff0c 包括5篇期刊论文和5篇学位论文 xff0c 为VR技术选题相关人员撰写毕业论文提供参考 1 期刊论文 运动炫科技 智慧赢未来 VR技术在体育领域内的应用与展望 期刊 xff
  • CentOS7防火墙添加端口

    CentOS7防火墙添加端口 CentOS防火墻添加端口比较简单 xff0c 三步走 xff08 皆以root用户执行 xff0c 或者用sudo命令 xff09 xff1a 1 查看开发的端口 firewall span class to
  • 手写一个--生产者消费者模式

    文章目录 前言wait notify方法实现生产者消费者模型1 使用Object的wait notify 方法2 使用Lock和Condition的await signal 方法3 使用BlockingQueue阻塞队列方法 前言 生产者消
  • C语言中static关键字用法和作用

    static修饰的对象 xff1a static关键字可以修饰 xff1a 局部变量 全局变量 函数 static修饰后改变了什么 xff1f 1 改变了生存周期 xff1b 就是一个变量 函数从分配内存去表示到回收内存的过程 2 改变了作
  • c语言中NULL到底是什么?

    C语言中NULL到底是什么 xff1f 1 NULL在C C 43 43 中定义为 xff1a ifdef cplusplus 定义这个符号就表示当前是C 43 43 环境 define NULL 0 在C 43 43 中NULL就是0 e
  • register关键字详解

    前言 xff1a 编译器的优化很大程度上就是通过数据流分析 调整读取内存的顺序等 xff0c 减少CPU对内存的读写 因为内存的运行速度相对于CPU是很慢的 xff0c 计算机中添加cache就是为了解决CPU和内存运行速度差异过大的问题
  • 海思烧录工具HiTool的使用方法以及烧录uboot

    1 什么是HiTool HiTool是海思公司提供的用于海思芯片的烧录工具 xff0c 可用于烧录uboot kernel rootfs等 这里只是简单的介绍用HiTool通过串口去烧写uboot xff0c 更加仔细的使用方法可以参考海思
  • /etc/profile文件简单介绍

    什么是 etc profile文件 etc profile文件为系统的每个用户设置环境变量信息 此文件的修改会影响到所有用户 想了解更多细节内容可以用 xff1a vi etc profile 命令进行查看 etc profile文件和 b
  • 五月再不跳槽,就晚了

    从时间节点上来看 xff0c 3月 4月是每年跳槽的黄金季 xff01 之后的五月也会放出一些岗位 以 BAT 为代表的互联网大厂 xff0c 无论是薪资待遇 还是平台和福利 xff0c 都一直是求职者眼中的香饽饽 xff0c 大厂经历 在
  • I2C通信协议详解和通信流程分析

    1 I2C通信特征 1 1 物理接口 xff1a SCL 43 SDA 1 SCL serial clock xff1a 时钟线 xff0c 传输CLK信号 xff0c 一般是I2C主设备向从设备提供时钟的通道 2 SDA serial d