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. 解决: DECODER_ERROR_CLASSES += (brotli.error,) ttributeError: module ‘brotli‘ has no attribute ‘error‘

    解决: DECODER_ERROR_CLASSES += (brotli.error,) ttributeError: module 'brotli' has no attribute 'error' ...

  2. 19.10 Boost Asio 同步文件传输

    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了,当然了这种传输方式明 ...

  3. C/C++ 实现常用的线程注入

    各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等. 简单编写DLL文件: ...

  4. Python 实现指定窗口置顶激活

    通过Python实现对特定窗口的置顶操作以及对特定窗体发送按键,这里需要安装一个第三方pip包,执行命令pywin32安装好以后,我们运行试试. 第一个案例,遍历所有句柄,然后对特定窗口进行最大化或最 ...

  5. Windows安装MySQL到最后卡主无响应处理办法

    安装mysql-5.5.62-winx64到最后Ready to execute ... 生效配置时卡主无响应 最有效,最快的解决办法 就是:重启电脑 或者 关闭电脑,在开机,找到MySQL安装目录, ...

  6. CF1515F Phoenix and Earthquake 题解

    题目链接:CF 或者 洛谷 首先基于一个事实,答案一定是生成树,显然,每次我们都需要连边,每次都会 \(-x\),那么一共会减少 \((n-1)\times x\),很显然的一个必要条件为: \[\s ...

  7. SUM和IF使用求部分和

    GROUP BY可以按照某一列的不同值进行分组,然后将不同组的数据可以利用聚合函数进行汇总取值. --我们可以在老师表里面求解不同班级的老师分别有多少名 SELECT class_id,COUNT(t ...

  8. 小知识:杜绝明文密码,OGG的credentialstore特性

    之前OGG配置文件中都会明文记录密码,而在OGG12c及以上版本中,有一个特性credentialstore,可以用来杜绝明文密码,提升安全性. 这里测试添加credentialstore并配置数据库 ...

  9. SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试

    今天在工作中遇到一个问题,一个Service类中有一个方法,其中使用了 AopContext.currentProxy() 去访问自身的函数,例如 int result = ((OrderServic ...

  10. 【Unity3D】激光灯、碰撞特效

    1 需求描述 ​ 本文将模拟激光灯(或碰撞)特效,详细需求如下: 从鼠标位置发射屏幕射线,检测是否与物体发生碰撞 当与物体发生碰撞时,在物体表面覆盖一层激光灯(或碰撞)特效 ​ 本文代码见→激光灯.碰 ...