首页 > 其他分享 >初始I2C

初始I2C

时间:2024-07-17 15:44:01浏览次数:8  
标签:SCL 高电平 总线 SDA I2C 初始 设备

初识I2C

image-20240717090806935

SCL是时钟线,SDA是数据线。在总线空闲状态的时候,这两根线一般为上拉电阻拉高,保持高电平

I2C总线上的设备存在主(Master)/从(Slave)之分。

同时每一个设备既可以当作主设备也可以是从设备

每个设备都必须对应一个唯一的地址

意味着可以存在多个主设备,但是同时工作的只能有一个

I2C是通过地址来区分不同的设备的

I2C的通信方式为半双工的方式,因为只有一跟SDA线,所以同一时间只可以实现单向通信

信号起始\停止

image-20240717093017839

默认状态下SDA和SCL都是高电平保持

起始

当某一设备开始触发的时候,SDA会进行降压处理(下降沿触发),SCL高电平保持,代表当前设备传输开始

终止

SCL为高电平保持,SDA为上升沿触发的时候,判断为传输停止

中间过程

起始条件产生之后,总线位于忙状态,由负责本次数据传输的主从设备独占,其他I2C器件无法访问总线。

而在停止条件产生之后,本次数据传输的主从设备将释放总线,总线再次位于空闲状态。

数据的实际传输

image-20240717100345681
  • 设备间是 按照SCL线上的每个时钟脉冲周期 为单位 在SDA线上 以 bit 传输数据

是一种 串行传输

数据传输以字节(8个bit一组)为单位,高位优先发送

高位优先

比如要发送0x11,转换为二进制为00010001,高位低位如下图所示

image-20240717100129628

高位优先传输数据从示波器上采样之后看到的第一个数据为高位。

同时,在设计上是区分为发送方和接收方,并且在协议上要求握手。

  • 发送方传输完一个字节之后,接收方拉低SDA线,在总线上产生一个 bit 的ACK信号,表示正确应答,此时才认为一个字节真正的完成传输。如果接收方不执行拉低SDA线的操作,则总线上产生的是一个 bit 的NACK信号,则表示接收方返回错误或者无响应

  • 主设备在发送传输有效数据之前要先指定从设备的地址,大多数从设备的地址是7位的,协议规定再给地址添加一个最低位用来表示接下来数据传输的方向

0表示主设备向从设备数据

1表示主设备向从设备数据

发起的第一个单元标识**地址 **

下面这个图是一个完整的粒子:

image-20240717104755015
  1. 由主机开始,在SCL位高点平的时候,SDA由高到低切边,形成开始信号
  2. 接着是7位地址位和1位读写标志,这里7位地址表示0111100,即0x3c;最后一位为0表示写操作。
  3. 接着在下一个时钟,主机以高电平状态释放SDA;这时从机相应,将SDA拉低表示ACK;
  4. 接着是两个8位数据00101110与响应,即0x2E
  5. 其他的数据和最后的停止位,图中未显示。

暂时更新这么多,如果感觉帮助到了你,我很开心o( ̄▽ ̄)ブ

标签:SCL,高电平,总线,SDA,I2C,初始,设备
From: https://www.cnblogs.com/OnHaiping/p/18307543

相关文章

  • 初始python异常捕获
    1、打开文件#打开文件的两种方式f=open("文件名/文件路径","要进行的操作",encoding="utf-8")#其中utf-8可以省略不写withopen("文件名/文件路径","要进行的操作",encoding="utf-8")asf:#这两种的区别,第一种需要进行手动关闭文件,里面没有内置关闭f.close第二种内置关闭,......
  • ubantu初始化配置
    配置网络wxx@k8s-master01:~$more/etc/netplan/00-installer-config.yaml#Thisisthenetworkconfigwrittenby'subiquity'network:ethernets:ens33:dhcp4:nodhcp6:noaddresses:-192.168.223.11/24nameservers:......
  • e4a 组件属性初始化
    按钮、编辑框等等组件画完之后,设置组件的默认属性,比如字体、大小、位置等等:(已有一个编辑框1,一个按钮1) 事件主窗口.创建完毕()'安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行如果权限操作1.取系统版本号()>=23则权限操作1.申请全部权......
  • 【攻防技术系列】shellcode初始
    虚拟机环境搭建【Kali】:192.168.10.131【win】:192.168.10.1shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。但是想要更充分理解什么是shellcode,我们得先了解下可执行程序和shellcode都是怎么运行的。简单来说......
  • 小车轮子测试(I2C)
    I2C总线是PHILIPS公司推出的一种在电子通信控制领域常用的串行通信总线,是一种简单、双向通信、二线制、同步的串行总线,具有连接线少、控制简单、通信速率高等优点。端口检测cd/devlsI2C读写操作使用i2cdetect命令检测i2c总线i2cdetect-l如果红色部分出现unknown,则大......
  • 代码初始化块
    代码初始化块类实例化的时候执行代码初始化块;实际上,代码初始化块是放在构造方法中执行的,只不过比较靠前;代码初始化块里的执行顺序是从前到后的。classA{A(){System.out.println("父类构造方法");}}publicclassBextendsA{B(){Sy......
  • c++初始化列表和构造函数初始化的区别
    在C++中,初始化列表和构造函数初始化是两种不同的方法用于初始化类的成员变量。初始化列表(InitializationList):初始化列表是在构造函数的参数列表后面使用冒号(:),然后跟随着每个成员变量的初始化方式。通过初始化列表,可以在对象构造时直接为成员变量赋值,而不是在构造函数体内......
  • 构造函数初始化列表 笔记
    什么意思:初始化类成员的一种方法什么时候用:编写一个类并向该类中添加成员时要用某种方式对这些成员进行初始化代码示例:classEntity{private:std::stringm_name;intm_score;public:Entity():m_name("UnKnown"),m_score(0)//成员初始化列表{}}注......
  • Java代码初始化块
    目录实例域代码块静态域代码块初始化代码块分为静态域代码块和实例域代码块,静态域代码块在类第一次被加载时被执行,实例域代码块在创建对象时被执行,一个类中可以有多个代码块。 实例域代码块使用方法可以有输出语句可以对类的属性、类的声明进行初始化操作对集......
  • 【C++11新特性】在定义静态成员变量的同时进行初始化
    //test.hclasstest{public:test()=delete;~test()=delete;private:staticconstexprlonglongPOLY_64_REV=0x95AC9329AC4BC9B5L;staticconstexprintBITS_PER_BYTE=8;staticconstexprintCRC_TABLE_LENGTH=256;staticlon......