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. C/C++ 实现通过FTP上传下载

    实现FTP文件下载: #include <stdio.h> #include <Windows.h> #include <WinInet.h> #pragma co ...

  2. docker之redis集群部署

    docker之redis集群部署 PART01: 3主3从redis集群部署 3主3从redis集群配置 关闭防火墙,启动docker服务 如果报以下错误,应该是docker 服务没有启动,可以执行下 ...

  3. Mygin之错误恢复Recover中间件

    本篇是mygin这个系列的最后一篇.如果想自己动手实现一个类似Gin的Web框架,建议从 mgin第一篇开始, 总代码行数有效行数只有600多行 github源码 mygin 目的 实现错误处理机制 ...

  4. deque的rotate方法

    deque对象支持旋转操作,可以将元素向左或向右循环移动. 例如: from collections import deque dq = deque([1, 2, 3, 4]) dq.rotate(1 ...

  5. electron nodejs idea 的 Terminal 默认是操作系统的 cmd.exe,他默认是GBK

    问题1:idea 的 Terminal 默认是操作系统的 cmd.exe,他默认是GBK,尽量不要通过手段更改了,没意义.若要在控制台输出中文,最简单的方法是运行:chcp 65001 &&a ...

  6. Delphi Vista,Win7,Win8 的 Uac,管理员身份运行

    要用就用下面我自己总结的官方的做法: 1.首先搜到delphi 自带的manifest,然后在其基础上改一个单词 2.将里面的asInvoker改为requireAdministrator 3.修改为 ...

  7. 《ASP.NET Core 微服务实战》-- 读书笔记(第10章)

    第 10 章 应用和微服务安全 云应用意味着应用运行所在的基础设施无法掌控,因此安全不能再等到事后再考虑,也不能只是检查清单上毫无意义的复选框 由于安全与云原生应用密切相关,本章将讨论安全话题,并用示 ...

  8. .NET 团队公布.NET 9开发目标 并发布.NET9的首个预览版

    在一篇博文中我们对 .NET 9 的愿景[1]: .NET团队概述了.NET 9的开发目标和最终愿景,涵盖两大重点领域:云原生和智能应用程序开发.它在继.NET 8之后,继续强化对云原生应用和性能的支 ...

  9. Linux进程与线程的基本概念及区别

    前言 假设你正在玩一款在线多人游戏,在游戏中,有多个角色需要进行不同的操作,例如攻击.移动.释放技能等等. 接下来,我们用玩游戏的例子,来解释进程和和线程的概念,以及进程和线程的区别. 进程的基本概念 ...

  10. 通过weblogic发布服务器某个文件夹

    介绍 客户有一台老服务器,上面安装的是weblogic,现在有个需求是需要将服务器下面某个文件夹下的文件都发布出来供某前端直接访问.之前都是直接利用tomcat的webapps目录直接发布即可,搜索了 ...