首页 > 其他分享 >什么是I2C,IIC怎么用,从实例波形分析I2C读写

什么是I2C,IIC怎么用,从实例波形分析I2C读写

时间:2024-07-08 14:31:01浏览次数:13  
标签:字节 高电平 读写 地址 IIC I2C 外设 时钟

什么是I2C,IIC怎么用,从实例波形分析I2C读写

前言

今天分享的主题是I2C通信。接下来从I2C是什么,怎么用,以及以时钟外设读写作为实例进行分析。

I2C简介

I2C(Inter-Integrated Circuit),也可以叫IIC、I2C,译作集成电路总线,是两线式串行通信总线,用于设备间的通讯等,标准情况下最高传送速率达100Kbps。顾名思义,I2C通讯只需要两根线,一根是数据线SDA(Serial Data Line),一根是时钟线SCL(Serial Clock Line)。主设备控制时钟线决定I2C的波特率,配合数据线进行数据的传输,这两根线分别通过上拉电阻连接到电源。

硬件层面

I2C是多主从架构,每个设备都有唯一的地址,一个主设备理论上可以接127个从设备,设备的SDA并接在一起,SCl并接在一起。

I2C总线内部都是采用漏极开路驱动,示意图如图,栅极给电压时mos导通,输出低电平,栅极给0时mos关断输出呈高阻态,那么这里就无法输出高电平。

加上上拉电阻后可以实现高低电平的输出:开关断开时电阻趋于无穷,电流为0,电源电压为输出电压,即输出高电平;开关闭合,输出低电平。只要有一个设备拉低总线电平,总线的电平就会被拉低,这就是线与功能,便于数据的传输和仲裁。

数据传输

数据传输帧格式

I2C数据的传输也遵循一定的格式。它有开始和停止条件,中间进行8bit的数据传输,没有奇偶校验,并且在一个开始条件和停止条件可之间可以传要多少数据有多少数据。提醒一下,我们的总线默认保持高电平

开始条件:在时钟线保持高电平时,数据线从高电平转为低电平,即检测到一个下降沿,会形成一个开始条件;
停止条件:时钟保持高电平时,数据线从低电平转为高电平形成一个停止条件。
进行数据传输前也就是紧跟开始条件后,我们要传送地址字节,前7位是从设备地址(这也是为什么一个主机理论上最多能接127个从机,2^7-1),第八位是读/写标志位。每8bit传输完成,第九位是应答位。如果是主设备发送数据,就是从设备应答,如果是主设备读取数据,就是主设备应答。

寄存器

控制寄存器控制开始停止条件,每传输完一个字节会进入内部中断,状态寄存器记录单片机的工作状态。作为主机时,分频器寄存器配合内部时钟设置I2C的波特率;地址寄存器是从机地址编址;最后是数据寄存器。

时钟外设读写

写入与读取格式

参照数据手册,时钟外设的写入格式如图所示,需要两个字节后开始写入。

开始条件之后紧跟地址字节,时钟外设的地址是1101 111,读写位是0,得到外设应答后,发送子地址的首地址,我们可以把时钟内部看作有很多片区,我们要在写数据之前把我们要先找到片区区号,再开始写数据,每传完一个字节数据,区号会自动加一,把下一个数据写入下一个片区,直到主设备停止发送。

主设备要读取数据时,开始条件后紧跟地址字节,得到外设应答后,发送要读片区的区号地址,得到外设应答后,发送重复开始信号,再发送外设地址且第8位为读模式,就可以从选定的片区开始读取数据,外设每传送一个字节,区号会自动加一,传送下一个区号的数据,直到主设备不应答后产生停止条件,停止读取

注意,如果主机不发送不应答信号就发送停止条件,设备容易挂死,可能原因:外设没有释放总线准备继续传输数据给主设备,将SDA拉为低电平,SDA线上的数据只有当SCL为低时才能改变状态;此时SCL释放为高电平等待SDA的变化,互相等待导致挂死(绿色线为SDA,黄色线为SCL):

实测波形分析

下面是写入的波形,两字节后开始写入数据,前两个字节是地址,第一个是时钟外设地址,第二个是我选择在00处开始写入数据。第一个数据0x19写进外设的00,片区,第二个数据0x09写进外设的01片区。

读取的波形,三字节后开始读取数据,第一个是时钟外设地址,第二个是我选择在00处开始读取数据。一个重复开始信号后发送时钟地址和读标志,第一个数据0x19是时钟发送的00片区数据,第二个数据0x09是时钟发送的01片区数据,接收后主机不应答后产生停止条件,停止读取。

总结

本文主要从整体上介绍了I2C的入门知识,作者能力有限,存在错误和纰漏,请大佬们不吝赐教(抱拳.jpg)。

标签:字节,高电平,读写,地址,IIC,I2C,外设,时钟
From: https://www.cnblogs.com/bujidao1128/p/18289812

相关文章

  • Bmp读写二值图
    publicclassBmp:IDisposable{/**每行像素数据必须是4的倍数*黑白二值图0表示黑,1表示白*/publicintWidth{get=>_width;}publicintHeight{get=>Math.Abs(_height);}publicintBitCount{get=>_bitCount;}......
  • IIC通信协议
    一、IIC(Inter-IntegratedCircuit)通信的基本概念:硬件结构:只需要两根线:SCL(串行时钟线)和SDA(串行数据线)可以连接多个设备,每个设备都有唯一的地址(7bit)通信原理:主从通信:一个主设备,多个从设备同步通信:由SCL线提供时钟信号串行、半双工:数据可以双向传输,但同一时刻只能单向基......
  • SQLSugar 基本语法+数据库读写分离
    面向对象的操作数据库,相比EFCore、Dapper等其他ORM框架性能支持性能轻便快捷,数据库的读写分离能大大减轻数据库的压力一、NuGet下载安装SqlSugarCore二、实例化SqlSugarCore---包含数据库链接---指定数据库类型---增删改查,上代码这里演示使用控制台程序usingSqlSugar;......
  • 树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)
    今日继续学习树莓派4B4G:(RaspberryPi,简称RPi或RasPi)本人所用树莓派4B装载的系统与版本如下: 版本可用命令(lsb_release-a)查询:​​ Python版本3.7.3:​​ IIC驱动_PCA9685(16路舵机驱动模块)文章提供测试代码讲解,整体代码贴出、测试效果图目录 开启树......
  • 并发编程之读写锁
    什么是读写锁?读写读非阻塞阻塞写阻塞阻塞如果读操作频率远高于写操作,那读写锁就能大大提升系统性能看两组对比例子:先定义一个线程池,2000核心线程,4000最大线程,当所有线程执行结束之后,计算耗时publicclassTestPoolExecutorextendsThreadPoolExecutor{private......
  • 存储读写之FLASH篇2-本篇内容来自野火文档
    STM32的内部FLASH简介在STM32芯片内部,存在一个重要的FLASH存储器,其主要用途是存储应用程序代码。编写完应用程序后,通常需要使用下载工具将已编译的代码文件写入内部FLASH。不可忽视的是,内部FLASH具有非易失性存储的特性,这意味着在断电后存储的数据不会丢失。每次芯片重新上......
  • 达梦数据库系列—20. 读写分离集群搭建
    目录一、配置读写分离集群1、环境说明2、数据准备3、配置主库GRP1_RWW_01配置dm.ini配置dmmal.ini配置dmarch.ini配置dmwatcher.ini启动主库设置OGUID修改数据库模式4、配置备库GRP1_RWW_02配置dm.ini配置dmmal.ini配置dmarch.ini配置dmwatcher.in......
  • 如何使用C++进行文件读写操作
    在C++中,我们可以使用标准库中的 <fstream>(文件流)来进行文件的读写操作。以下是一些基本的文件读写操作的示例。读取文件cpp复制代码#include<fstream>#include<iostream>#include<string>intmain(){std::ifstreamfile("example.txt");//打开文件以进行读取操......
  • MySQL主从复制与读写分离
    一、MySQL主从复制概述1.MySQL主从复制原理MySQL的主从复制和读写分离紧密相连,首先部署主从复制,才能在此基础上进行读写分离。2.MySQL支持的复制类型基于语句的复制:在主服务器上执行的语句,在从服务器上执行同样语句。MySQL默认采用该语句,效率较高。基于行的复制:把改变的......
  • 悟空派 & 香橙派驱动0.9英寸OLED(IIC)
    悟空派&香橙派驱动0.9寸OLED(IIC)前言​在linux核心板中,一般会引出许多GPIO引脚,方便开发者使用这些GPIO进行额外开发。在本文中使用IIC端口,驱动0.9寸OLED屏幕,显示远程SSH端口,以及CPU当前温度以及更多主板相关信息。1.开启IIC端口​在命令行输入:#具体文件根据自己系......