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. 【4】jupyter notebook快速入门、以及常用快捷键使用

    相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...

  2. centos7.9离线安装MongoDB4.4.17

    前言 MongoDB 5.0开始要求CPU支持avx指令集,参考https://mp.weixin.qq.com/s/6FFXih1DEZYDFOk1hCu69w 环境 CentOS 7.9.2009 ...

  3. 计算机网络|思维导图|自顶向下方法|MindMaps资料分享

    前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014. ...

  4. 双端队列(deque)--python

    Python中的双端队列(deque)是一种特殊的数据结构,它允许在队列的两端进行插入和删除操作12.双端队列可以看成栈和队列的结合3.在Python中,我们可以使用collections模块中的de ...

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

    第 7 章 开发 ASP.NET Core Web 应用 ASP.NET Core 基础 在本章,我们将从一个命令行应用开始,并且在不借助任何模板,脚手架和向导的情况下,最终得到一个功能完整的 Web ...

  6. CentOS7.6离线升级docker20

    本周研发反馈系统升级失败,是因为docker版本太低,需要升级docker20.由于安装系统的服务器没有联网,所以无法在线升级.所以我找了一台联网的CentOS7.6的服务器,下载了docker20和 ...

  7. scrapy框架使用:分布式、增量式

    scrapy框架的使用 前记:爬虫框架部分整理完成,后续慢慢完善, 声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 创建工程: scrapy startproje ...

  8. 【Unity3D】Renderer Feature简介

    1 3D 项目迁移到 URP 项目后出现的问题 ​ 3D 项目迁移至 URP 项目后,会出现很多渲染问题,如:材质显示异常.GL 渲染不显示.多 Pass 渲染异常.屏幕后处理异常等问题.下面将针对这 ...

  9. 用ELK分析每天4亿多条腾讯云MySQL审计日志(4)--MySQL全文索引

    前言:        该文章将会介绍以下: 1,MySQL全文索引的使用 2,全文索引停止词STOPWORD 3,使用全文索引的高效和准确 最近事情比较少,刚好可以梳理一下以前的工作,做一下总结! 在 ...

  10. Java并发编程实例--9.使用本地线程变量

    并发程序一个重要方面就是共享数据. 这一点在继承了Thread类或实现了Runnable接口的对象中有着特殊的重要性. 如果你创建了一个实现了Runnable接口的类对象并且用这个对象开启了N个线程对 ...