SCL   SDA   同步,半双工

开漏+弱上拉,谁用这跟线,就下拉成低电平

想输出,去拉杆子或放手,操作杆子变化

想输入,直接放手,看电平高低就行

线与,一个低电平,全部低电平,可以利用这个执行多主机下的时钟同步和总线仲裁

时序

 主机发出起始信号(SCL高,SDA下拉),从机捕获这个状态时,就复位自己,等待召唤。 然后主机再把SCL拉低(1.占用总线,2时序单元低电平开始,低电平结束)

主机不着急,可以在任意时刻在高电平时放入数据就行(间隔几个也行)

在SCL同步下:主机发,从机读

可以这样理解,主机从机一直处于输入模式,当主机需要发送的时候,可以主动拉低SDA,需要接收时就自然需要释放SDA

实线-主机,虚线-从机(实线变虚线,就是释放SDA的过程)

从机发送一个数据,若无主机应答,则停止发送

一主多从,每个从机有一个名字(7位10位地址),在主机开始发送之前,会发送信号,从机都会收到这个信号,并与自己名字对比,若不一致则不管

IIC设备的地址,高位由厂商决定,低位可以通过相关引脚的高低电平,自定义其数值

主从控制流程:

主机发送唤醒,发送7位地址,和一位读写(0主机写,1主机读)

指定地址写

在RA:0上面是应答,主机发送完后松开SDA(将要回弹到高电平),但从机应答拉低电平,所以这里显示是低电平

后面的上升沿是从机应答后释放,然后同样的时序再来一遍,发送数据到从机的内部,

从机设备可以自己定义第二个字节和后续字节的用途,一般是寄存器地址(MPU6050),或者是指令控制字(AD转换器)等,存储器地址等

发送完毕后,先拉低下面的SDA,然就释放SCL,再释放SDA  (SCL高电平期间的SDA上升沿)

 当前地址读(不能指定寄存器):

主机发送一个字节,指定从机地址和读写标志位,然后接受从机应答位,然后从机在SCL低电平时写数据,主机在相邻的SCL高电平读取数据

问题:从机怎么知道主机想读哪个寄存器里面的地址呢?

用 当前地址指针  从机的寄存器练成一片,有一个地址指向他们,默认上电从0开始,每次写入或读取一个字节后,指针自增

比如:在0x19位置写入数据FF,那么读取的时候指针+1就指向0x1A

指定地址读:(相当于指定地址写Pro)

对指定设备,在指定地址下,读取指定的数据

官方:指定地址写,指定从机A写+指定指针地址; 然后再来个起始条件,重新指定从机A,指定读,就可以读到对应的地址  (曲线救国)

也可以两个时序,在指定写后停止然后再起始条件重新开始

可以连续读写多个数据,利用读写后指针自增的原理

有参宏

#define OLED_W_SDA(x)        GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))

通过传地址,实现返回多个值

int16_t AX, AY, AZ, GX, GY, GZ;
MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ); void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
uint8_t DataH, DataL; DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
*AccX = (DataH << 8) | DataL;
}

定义多主机模式

1。固定多主机      2主N从固定,2个主机冲突时,需要仲裁

2、可变多主机,每个都可以在某个时刻成为主机,其他的都变成从机,多个学生跳出的话就需要仲裁(STM32)

10位地址开头11110 +10位地址+读写标志位   ,七位地址不允许11110开头

硬件IIC

当需要发送数据,把一个字节数据写到数据寄存器DR,当数据寄存器空闲时,数据寄存器的值会转到移位寄存器(置状态寄存器为TXE1,发送寄存器空),在移位的过程中可以把下一个数据放到DR等待,这样无缝衔接。

接收时,收到的数据从SDA到数据控制电路(完成读写控制,起始终止条件应答位),一位一位的到移位寄存器,一个字节齐后,整体转移到DR(置标志位RXNE,接收寄存器非空),这是可以直接读DR数据。

自身地址寄存器   双地址寄存器  作为从机时使用,当接收到主机传呼,会使用比较器对比自身地址,响应外部主机召唤

一主多从图

硬件IIC,使用的两个IO,配置成复用开漏输出模式  (也可以输入)

STM32默认是从模式,通过写控制寄存器的START位写1来开启,EVX是组合几个标志位的大标志位

协议I2C的更多相关文章

  1. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由S ...

  2. I2C总线协议图解(转载)

    转自:http://blog.csdn.net/w89436838/article/details/38660631 另外,https://blog.csdn.net/qq_38410730/arti ...

  3. 嵌入式Linux内核I2C子系统详解

    1.1 I2C总线知识 1.1.1  I2C总线物理拓扑结构     I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高 ...

  4. STM32F10x_模拟I2C读写EEPROM

    Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...

  5. Little-endian和Big-endian

    谈到字节序的问题,必然牵涉到两大CPU派系.那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU.PowerPC系列采用big endian方式存储数据,而x86系列则采用l ...

  6. 人工智能"眼睛"——摄像头

    摄像头机器视觉人工智能的"眼睛",其重要性在嵌入式领域不言而喻.但是如何理解和使用摄像头却是一个非常棘手的问题.本文主要针对调试摄像头过程中遇到的问题,对摄像头的基本原理及概述进行 ...

  7. i2c协议

    i2c协议 http://blog.csdn.net/g_salamander/article/details/8016698 总线设备驱动模型 http://blog.csdn.net/u01395 ...

  8. i2c协议简要分析(转载)

    声明 本文大部分内容为转载,因此标定为转载 源地址: http://www.cnblogs.com/zym0805/archive/2011/07/31/2122890.html http://blo ...

  9. (原创) 巩固理解I2C协议(MCU,经验)

        题外话:这几天天气突然转冷了.今天已是11月23日了,查查黄历,昨天(11月22日)刚好是小雪,一夜温度骤降,果然老祖先的经验有灵验!冬天来了,还是多加加衣服,注意保暖! 1.Abstract ...

  10. I2C总线协议的简要说明

    为了快速的了解I2C总线协议,此处采用另类的方式进行说明. 倘若你和另外一个人只能通过一个开关加灯泡的装置在不同的两个房间进行交流,以下是很简单能说明的一个模型: 你的房间有一个开关,另外一间房间有一 ...

随机推荐

  1. 【主流技术】浅析 ElasticSearch7.x 的基本结构及应用(一)

    目录 前言 一.概述 1.1基本认识 1.2核心概念 对比关系型数据库 1.3倒排索引 例一: 例二: 1.4了解ELK 二.安装(基于 CentOS) 2.1安装声明 2.2 使用 Docker 安 ...

  2. 19.4 Boost Asio 远程命令执行

    命令执行机制的实现与原生套接字通信一致,仅仅只是在调用时采用了Boost通用接口,在服务端中我们通过封装实现一个run_command函数,该函数用于发送一个字符串命令,并循环等待接收客户端返回的字符 ...

  3. C/C++ 通用ShellCode的编写与调用

    首先,我们的ShellCode代码需要自定位,因为我们的代码并不是一个完整的EXE可执行程序,他没有导入表无法定位到当前系统中每个函数的虚拟地址,所以我们直接获取到Kernel32.dll的基地址,里 ...

  4. docker中的mysql时区修改

    永久修改 进入容器 docker exec -it mysql5.7 bash 查看当前时区 date -R 修改时区 cp /usr/share/zoneinfo/PRC /etc/localtim ...

  5. Netty-核心模块组件-4

    Netty 核心模块组件 一.Bootstrap.ServerBootstrap 1.Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 N ...

  6. 外部文件使用django的models

    #外部文件使用django的models,需要配置django环境 import os if __name__ == '__main__': os.environ.setdefault("D ...

  7. P2572 [SCOI2010] 序列操作 题解

    题解:序列操作 比较综合的 ds 题,综合了线段树常见的几种操作:维护最大子段和.区间翻转.区间求和.区间覆盖 . 维护子段和常见的我们维护三类东西: 前缀最长连续段.后缀最长连续段.当前区间上的最大 ...

  8. Java - CodeForces - 1230A

    题目: Dawid有了 4 包糖果.第 i 包里面有 Ai 个糖果. Dawid想把这四包糖果送给两个朋友,能否让两个朋友收到相同数量的糖果?注意,不能拆开任何一包糖,不能把糖果留给自己或扔掉,四包糖 ...

  9. .NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记

    08 | 配置框架:让服务无缝适应各种环境 配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架 配置框架的核心包有两个,一个抽象包,一个实现包 Micro ...

  10. Flink-postgres-cdc实时同步报错:无法访问文件 "decoderbufs": 没有那个文件或目录

    问题描述 Caused by: org.postgresql.util.PSQLException: 错误: 无法访问文件 "decoderbufs": 没有那个文件或目录 解决办 ...