平顶山市哪里有做网站的个人团购网站 转入备案

news/2025/10/5 20:48:21/文章来源:
平顶山市哪里有做网站的,个人团购网站 转入备案,天津市建设工程定额管理站网站,网站建设公司平台I2C总线和通信协议详解 (超详细配42张高清图万字长文) I2C#xff08;Inter-Integrated Circuit#xff09;通信总线#xff0c;作为嵌入式系统设计中的一个关键组成部分#xff0c;其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析…I2C总线和通信协议详解 (超详细配42张高清图万字长文) I2CInter-Integrated Circuit通信总线作为嵌入式系统设计中的一个关键组成部分其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析包括其基本概念、特点、通信协议以及在不同场景下的高级应用和最佳实践。I2C接口只有2根信号线总线上可以连接多个设备硬件实现简单可扩展性强。I2C通信协议可以用普通GPIO引脚进行软件模拟。I2C接口主要用于通讯速率要求不高以及多个器件之间通信的应用场景。 1. I2C总线历史 I2CInter-Integrated Circuit总线是一种重要的串行通信协议它的历史可以追溯到上世纪80年代初期。以下是对I2C总线历史的详细介绍 起源 I2C总线技术由荷兰的飞利浦半导体现在的恩智浦半导体在1982年开发。最初这项技术是为了在电视机内部实现简单、高效、低成本的通信而设计的。 设计目标 设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量同时也降低制造成本。通过使用只有两根线的通信总线它有效地减少了器件间连接的复杂性。 技术发展 随着技术的成熟和普及I2C协议得到了广泛的应用和扩展。从最初的标准模式100kHz发展到快速模式400kHz和高速模式3.4MHz。 标准化和开放 虽然最初由飞利浦半导体开发但I2C协议后来被标准化并广泛应用于多种设备中。飞利浦半导体放弃了对这项技术的专利权使其成为开放标准。 广泛应用 I2C技术由于其简单性和有效性已成为嵌入式系统设计中不可或缺的一部分。 2. I2C通信总线基本概念 I2C是一种多主机、两线制、低速串行通信总线广泛用于微控制器和各种外围设备之间的通信。它使用两条线路串行数据线SDA和串行时钟线SCL进行双向传输。 特点 两线制总线I2C仅使用两条线——串行数据线SDA和串行时钟线SCL进行通信有效降低了连接复杂性。 多主多从设备支持I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一的地址。 可变的时钟速率I2C总线支持不同的速率模式如标准模式100kbps、快速模式400kbps和高速模式3.4Mbps。 同步通信I2C是一种同步通信协议数据传输由时钟信号SCL来控制。 简单的连接I2C通信对硬件的要求比较低很容易在微控制器和外围设备间实现连接。 地址分配每个I2C设备都通过一个7位或10位的地址来识别这使得总线上可以连接多个设备。 阻塞传输I2C支持阻塞传输机制即主设备可以在传输过程中控制总线防止其他设备发送数据。 应用广泛由于其简单和灵活性I2C被广泛应用于各种电子产品中如传感器、LCD显示器、EEPROM等。 总线仲裁和冲突检测在多主模式下I2C能够处理多个主设备同时尝试控制总线的情况。 低功耗I2C总线的设计使其成为低功耗的通信方式适用于电池供电的设备。 基本特征 总线结构 两线制使用两条线进行通信分别是串行数据线SDA和串行时钟线SCL。多主多从结构支持多个主设备和多个从设备连接到同一总线上。 通信方式 同步串行数据传输同步于时钟信号。字节格式每个字节由8位数据构成加上开始和停止条件以及可选的应答位。 时钟速率 支持多种速率包括标准模式100kbps、快速模式400kbps和高速模式3.4Mbps。 工作原理 总线控制 开始和停止条件通信由主设备通过在SDA线上生成特定的信号模式来开始和结束。地址帧每次通信开始时主设备发送一个地址帧来指定与之通信的从设备。 数据传输 主从通信主设备控制时钟信号向从设备发送或接收数据。应答位每个字节后接收方 发送一个应答位ACK或非应答位NACK以告知发送方数据是否被成功接收。 地址和仲裁 设备地址 7位或10位地址每个I2C设备都有一个唯一的地址允许在同一总线上连接多个设备。 总线仲裁 在多主模式下当两个主设备同时尝试控制总线时I2C协议包含仲裁机制以决定哪个设备获得控制权。 3. I2C数据传输流程 数据信号以8位的序列传输。所以在特殊的开始条件发生后就会出现第一个8位序列它指示了数据被发送到哪个从设备的地址。每个8位序列之后都会跟随一个称为确认的位。 在大多数情况下第一个确认位之后会跟着另一个寻址序列但这次是针对从设备的内部寄存器。在寻址序列之后是数据序列直到数据完全传输完毕并以一个特殊的停止条件结束。 开始条件发生在数据线在时钟线仍然高电平的时候变低。之后时钟开始并且在每个时钟脉冲期间传输每一位数据。设备寻址序列从最重要的位开始以最不重要的位结束实际上是由7位组成的因为第8位用于指示主设备是向从设备写入逻辑低还是从中读取逻辑高。 下一个确认位由从设备用来指示它是否成功接收了前一个位序列。所以这次主设备将SDA线的控制权交给从设备如果从设备成功接收了前一个序列它将把SDA线拉低到所谓的确认状态。 如果从设备没有把SDA线拉低这种状态被称为不确认意味着它没有成功接收前一个序列这可能由多种原因造成。例如从设备可能正忙可能不理解接收到的数据或者不能再接收任何数据等等。 在这种情况下主设备决定如何继续操作。 接下来是内部寄存器的寻址。内部寄存器是从设备内存中包含各种信息或数据的位置。 例如ADXL345加速度计有一个独特的设备地址和额外的内部寄存器地址用于X、Y和Z轴。 因此如果我们首先想读取x轴的数据我们需要发送设备地址然后发送x轴的特定内部寄存器地址。这些地址可以从传感器的数据手册中找到。 在寻址之后数据传输序列开始要么来自主设备要么来自从设备这取决于在读/写位选择的模式。 在数据完全发送之后传输将以停止条件结束当SDA线在SCL线高电平时从低变高。这就是I2C通信协议的工作原理。 上述内容出现了很多特定概念我们下面来分别解释他们 1. SDA和SCL信号 SDA和SCL都是双向线路通过电流源或上拉电阻连接到正电源电压(见图3)。 当总线空闲时两条线路都是HIGH。连接到总线的设备的输出级必须具有开漏极或开集电极来执行有线与功能。I2C总线上的数据可以在标准模式下以高达100 kbit/s的速度传输在快速模式下可达400 kbit/s在快速模式中可达1 Mbit/s或在高速模式下可达3.4 Mbit/s。总线电容限制了连接到总线的接口数量。 对于单个主应用程序如果总线上没有设备会拉伸时钟主SCL输出可以是推挽驱动器设计。 2. 数据有效性 SDA线上的数据必须在时钟HIGH期间保持稳定。只有当SCL线上的时钟信号为LOW时数据线的HIGH或LOW状态才能改变(见图4)。传输的每个数据位都会产生一个时钟脉冲。 3. START和STOP条件 所有事务都以START(S)开始并由STOP§终止(参见图5)。 SDA线上SCL为HIGH时HIGH到LOW的转换定义了一个START条件。 SDA线上SCL为HIGH时LOW到HIGH的转换定义了一个STOP条件。 START和STOP条件总是由主设备产生。在START条件之后总线被认为是忙碌的。在STOP条件之后的某个时间总线被认为是空闲的。 如果产生了重复的START(Sr)而不是STOP条件总线保持忙碌。在这方面START(S)和重复的START(Sr)条件在功能上是相同的。 因此对于本文档的其余部分S符号被用作代表START和重复的START条件的通用术语除非Sr是特别相关的。 如果连接到总线的设备合并了必要的接口硬件则检测START和STOP条件是容易的。然而没有这种接口的微控制器必须在每个时钟周期内对SDA线采样至少两次以感知转换。 4. 字节格式 每一个放在SDA线上的字节必须是8位长。每次传输可以传输的字节数是没有限制的。每一个字节后面必须跟一个确认位。数据以最有效位(MSB)为首进行传输(见图6)。如果一个从机在执行其他一些功能之前不能接收或传输另一个完整的字节数据例如处理一个内部中断它可以保持时钟线SCL LOW迫使主机进入等待状态。当从机准备好接收另一个字节数据并释放时钟线SCL时数据传输继续进行。 5. Acknowledge(ACK)和Not Acknowledge(NACK) 确认发生在每个字节之后。确认位允许接收端向发送端发出信号表示字节被成功接收可以发送另一个字节。主设备产生所有的时钟脉冲包括确认的第九个时钟脉冲。 确认信号定义如下发送端在确认时钟脉冲期间释放SDA线这样接收端就可以拉SDA线LOW并且在该时钟脉冲的HIGH期间保持稳定的LOW(参见图4)。设 当SDA在第九个时钟脉冲期间保持HIGH时这被定义为不确认信号。主设备然后可以产生一个STOP条件来中止传输或者重复的START条件来启动一个新的传输。有五个条件导致NACK的产生 没有接收器在总线上传输地址所以没有设备响应确认。接收器无法接收或发送因为它正在执行一些实时功能并且还没有准备好与主服务器进行通信。在传输过程中接收方收到了它无法理解的数据或命令。在传输过程中接收方不能接收到任何更多的数据字节。主接收机必须向从发送机发出传输结束的信号。 6. 时钟同步 两个主控器可以同时在一个空闲总线上开始传输必须有一种方法来决定哪个主控器控制总线并完成传输。这是通过时钟同步和仲裁来实现的。在单主控器系统中时钟同步和仲裁是不需要的。 时钟同步是通过I2C接口到SCL线的有线与连接来实现的。这意味着SCL线上的HIGH到LOW转换会导致相关的主控器开始计数他们的LOW周期一旦主控器时钟变为LOW它会保持SCL线处于该状态直到时钟达到HIGH状态(见图7)。然而如果另一个时钟仍然在它的LOW周期内这个时钟的LOW到HIGH转换可能不会改变SCL线的状态。因此SCL线被具有最长LOW周期的主控器保持为LOW。具有较短LOW周期的主控器在这段时间内进入HIGH等待状态。 当所有主控机都结束了低周期时SCL线释放并变为高电平。此时主控机时钟与SCL线的状态没有区别所有主控机开始计算它们的高周期。第一个完成高周期的主控机再次拉低SCL线。 这样一个同步SCL时钟就产生了它的低周期由低周期最长的主控机决定而它的高周期由高周期最短的主控机决定。 7. 仲裁 仲裁像同步一样是指只有在系统中使用多个主设备时才需要的协议部分。从设备不参与仲裁过程。只有总线空闲时主设备才可以开始传输。两个主设备可以在最小保持时间(tHD; STA)内产生一个START条件这会导致总线上产生一个有效的START条件。然后需要仲裁来决定哪个主设备将完成它的传输。 仲裁逐位进行。在每个位期间当SCL为HIGH时每个主设备检查SDA电平是否与它所发送的相匹配。这个过程可能需要许多位。两个主设备实际上可以无误地完成整个事务只要传输是相同的。第一次一个主设备试图发送HIGH但检测到SDA电平为LOW主设备知道它已经失去了仲裁并关闭SDA输出驱动器。另一个主设备继续完成它的事务。 在仲裁过程中没有信息丢失。一个失去仲裁的主设备可以产生时钟脉冲直到它失去仲裁的字节结束并继续产生时钟脉冲。必须在总线空闲时重新开始它的事务。 如果一个主设备也包含一个从设备功能并且它在寻址阶段失去仲裁有可能是获胜的主设备试图寻址它。因此失败的主设备必须立即切换到它的从设备模式。 图8显示了两个主设备的仲裁过程。可能涉及更多内容这取决于总线连接了多少主设备。当产生DATA1的主设备的内部数据电平与SDA线上的实际电平之间存在差异时DATA1输出被关闭。这不影响由获胜的主设备发起的数据传输。 由于I2C总线的控制完全由竞争主设备发送的地址和数据决定所以没有中心主设备总线上也没有任何优先顺序。 如果仲裁程序仍在进行当一个主设备发送重复的START或STOP条件而另一个主设备仍在发送数据时则存在一个未定义的条件。换句话说以下组合会导致一个未定义的条件 主设备1发送重复的START条件主设备2发送一个数据位。主设备1发送STOP条件主设备2发送一个数据位。主设备1发送重复的START条件主设备2发送一个STOP条件。 8. 时钟拉伸 时钟拉伸通过保持SCL线LOW暂停事务。事务无法继续直到该线再次释放为HIGH。时钟拉伸是可选的事实上大多数从设备不包括SCL驱动程序因此它们无法拉伸时钟。 在字节级设备可能能够以较快的速度接收字节数据但需要更多的时间来存储接收到的字节或准备传输另一个字节。从设备可以在接收和确认一个字节后保持SCL线LOW以迫使主设备进入等待状态直到从设备准备好在一种握手过程类型中进行下一个字节传输(见图7)。 在位级设备如微控制器具有或不具有I2C总线有限的硬件可以通过延长每个时钟LOW周期来减慢总线时钟。任何主设备的速度都适应于该设备的内部运行速率。 9. 从地址和R/W位 数据传输遵循图9所示的格式。在START条件(S)之后发送一个从地址。这个地址是7位长后面跟着第八位这是一个数据方向位(R/W)——“0”表示传输(WRITE)“1”表示数据请求(READ)(参见图10)。数据传输总是由master生成的STOP条件§终止。然而如果master仍然希望在总线上通信它可以生成一个重复的START条件(Sr)并在没有首先生成STOP条件的情况下寻址另一个从设备。在这样的传输中各种读/写格式的组合是可能的。 10. 10位寻址 10位寻址扩展了可能的地址数。具有7位和10位地址的设备可以连接到同一个I2C总线并且7位和10位寻址都可以在所有总线速度模式下使用。目前10位寻址还没有被广泛使用。 10位从属地址是由一个START条件(S)或重复的START条件(Sr)之后的前两个字节组成的。 第一个字节的前7位是组合1111 0XX其中最后两个位(XX)是10位地址的两个最有效位(MSB)第一个字节的第八位是R/W位它决定了消息的方向。 虽然有8个可能的保留地址位1111 XXX的组合 但只有四个组合1111 0XX用于10位寻址。其余四个组合1111 1XX被保留用于未来的I2C总线增强。 所有先前描述的7位寻址的读/写格式组合都可能用10位寻址。这里详细介绍两种格式 主发送器用一个10位从属地址向从属接收器发送。 传输方向不变(见图14)。当一个10位地址跟随一个START条件时每个从属比较从属地址第一个字节的前7位(1111 0XX)与自己的地址并测试第八位(R/W方向位)是否为0。可能有多个设备找到一个匹配并产生一个确认(A1)。所有找到匹配的从属比较从属地址第二个字节的八位(XXXX XXXX)与自己的地址但只有一个从属找到一个匹配并产生一个确认(A2)。匹配的从属仍然由主寻址直到它接收到一个STOP条件§或重复的START条件(Sr)后面跟着一个不同的从属地址。主接收器用一个10位从属地址读取从属发送器。 传输方向在第二个R/W位之后改变(图15)。直到并包括确认位A2过程与前面描述的用于一个从属发送器的程序相同。主发送器寻址从接收器。在重复的START条件(Sr)之后匹配的从设备记住它之前被寻址过。这个从设备然后检查Sr之后的从地址的第一个字节的前7位是否与它们在START条件(S)之后是相同的并测试第八位(R/W)是否为1。 如果有匹配从设备认为它被作为一个发送器寻址并产生确认A3。从发送器保持寻址状态直到它接收到一个STOP条件§或接收到另一个重复的START条件(Sr)后跟随一个不同的从地址。在重复的START条件(Sr)之后所有其他从设备也将比较从地址(1111 0XX)的第一个字节的前7位与它们自己的地址并测试第八位(R/W)。 然而它们中没有一个被寻址因为R/W1(10位设备)或者1111 0XX从地址(7位设备)不匹配。 具有10位寻址的从设备对“通用调用”的反应与具有7位寻址的从设备相同。硬件主设备可以在“通用调用”后传输其10位地址。在这种情况下“通用调用”地址字节后面跟着两个连续的字节其中包含主发送器的10位地址。格式如图15所示第一个数据字节包含主地址的最低有效位8位。 开始字节0000 0001 (01h)可以以与7位地址相同的方式出现在10位地址之前。 11. 通用调用地址 通用调用地址用于同时寻址连接到I2C总线的每个设备。然而如果一个设备不需要通用调用结构中提供的任何数据它可以通过不发出确认来忽略这个地址。如果一个设备确实需要来自通用调用地址的数据它会确认这个地址并表现为从接收器。如果一个或多个设备响应主设备实际上不知道有多少设备确认。第二个字节和后续字节被每一个能够处理此数据的从接收器确认。一个不能处理这些字节之一的从设备必须通过不确认来忽略它。同样如果一个或多个从设备确认主设备将不会看到不确认。通用调用地址的含义总是在第二个字节中指定(见图16)。 有两种情况需要考虑 当最低有效位B为“0”时。 当最低有效位B为“1”时。 当位B为“0”时第二个字节有以下定义 0000 0110 (06h)硬件复位并写入从地址的可编程部分。在接收到这个2字节序列时所有设计用于响应通用调用地址的设备都复位并接收其地址的可编程部分。 必须采取预防措施以确保设备在施加电源电压后没有拉下SDA或SCL线因为这些低电平会阻塞总线。0000 0100 (04h)硬件写入从地址的可编程部分。 行为与上述相同但设备不复位。0000 0000 (00h)此代码不允许用作第二个字节。 编程过程的序列在适当的设备数据表中公布。其余代码尚未固定设备必须忽略它们。 当位B为“1”时2字节序列是“硬件通用调用”。这意味着该序列由硬件主设备传输例如键盘扫描器 它可以被编程来传输所需的从地址。由于硬件主设备事先并不知道消息必须被传输到哪个设备它只能生成这个硬件通用调用和它自己的地址 — 向系统标识它自己(参见图 17)。 第二个字节中剩下的七位包含硬件主机的地址。 这个地址被连接到总线的智能设备(例如微控制器)识别然后接受来自硬件主机的信息。如果硬件主机也可以充当从机从机地址与主机地址相同。 在某些系统中另一种方法是将硬件主发射机在系统复位后设置为从接收机模式。这样系统配置主可以告诉硬件主发射机(现在处于从接收机模式)必须发送数据到哪个地址(见图18)。在编程程序之后硬件主保持在主发射机模式。 12. 开始字节 微控制器可以以两种方式连接到I2C总线。带有片上硬件I2C总线接口的微控制器可以被编程为只被总线请求中断。当设备没有这样的接口时它必须通过软件不断地监视总线。显然微控制器监视或轮询总线的次数越多它执行预定功能的时间就越少。 因此在快速的硬件设备和相对较慢的依赖于软件轮询的微控制器之间存在速度差异。 在这种情况下数据传输可以先由一个比正常情况长得多的启动过程(见图19)。启动过程包括 一个开始条件(S)一个开始字节(0000 0001)一个确认时钟脉冲(ACK)一个重复的开始条件(Sr) 在需要总线访问的主机传输了START条件S之后 传输START字节(0000 0001)。另一个微控制器因此可以以低采样率对SDA线进行采样直到检测到START字节中的7个零之一。在检测到SDA线上的LOW电平后微控制器可以切换到更高的采样率以找到重复的START条件Sr然后用于同步。 硬件接收器在接收到重复的START条件Sr后重置因此忽略START字节。 在START字节后生成一个与确认相关的时钟脉冲。这只是为了符合总线上使用的字节处理格式。不允许任何设备确认START字节。 13. 设备ID 设备ID字段(见图20)是一个可选的3字节只读(24位)字提供以下信息 12位制造商名称每个制造商(例如NXP)都是唯一的9位部件标识由制造商指定(例如PCA9698)3位模具修订由制造商指定(例如RevX) 设备ID是只读的硬连接在设备中可以按如下方式访问 START 条件 主控器发送保留设备ID I2C总线地址后面跟着设置为‘0’的R/W位(写入)“1111 1000”。 主设备发送它必须识别的从设备的I2C总线从地址。LSB是一个“不关心”的值。只有一个设备必须确认这个字节(具有I2C总线从地址的设备)。 主设备发送一个Re-START条件。 备注一个STOP条件跟随一个START条件重置从设备的状态机设备ID读取无法执行。同样一个STOP条件或一个Re-START条件跟随访问另一个从设备重置从设备的状态机设备ID读取无法执行。 主控器发送保留设备ID I2C总线地址后面跟着设置为‘1’的R/W位‘1111 1001’。 设备ID读取可以完成从12个制造商位(第一个字节第二个字节的四个MSB)开始接下来是9个部件识别位(第二个字节的四个LSB第三个字节的五个MSB)然后是三个模具修正位(第三个字节的三个LSB)。 主设备通过ACK最后一个字节结束读取序列从而重置从设备的状态机并允许主设备发送STOP条件。 备注设备ID的读取可以通过发送一个ACK在任何时候停止。 如果主设备继续ACK第三个字节后的字节从设备回滚到第一个字节并继续发送设备ID序列直到检测到一个ACK。 4. I2C传输数据的格式 4.1 写操作 流程如下 主芯片要发出一个start信号然后发出一个设备地址(用来确定是往哪一个芯片写数据)方向(读/写0表示写1表示读)从设备回应(用来确定这个设备是否存在)然后就可以传输数据主设备发送一个字节数据给从设备并等待回应每传输一字节数据接收方要有一个回应信号确定数据是否接受完成)然后再传输下一个数据。数据发送完之后主芯片就会发送一个停止信号。 下图白色背景表示主→从灰色背景表示从→主 4.2 读操作 流程如下 主芯片要发出一个start信号 然后发出一个设备地址(用来确定是往哪一个芯片写数据)方向(读/写0表示写1表示读) 从设备回应(用来确定这个设备是否存在)然后就可以传输数据 从设备发送一个字节数据给主设备并等待回应 每传输一字节数据接收方要有一个回应信号确定数据是否接受完成)然后再传输下一个数据。 数据发送完之后主芯片就会发送一个停止信号。 下图白色背景表示主→从灰色背景表示从→主 4.3 I2C信号 I2C协议中数据传输的单位是字节也就是8位。但是要用到9个时钟前面8个时钟用来传输8数据第9个时钟用来传输回应信号。传输时先传输最高位(MSB)。 开始信号SSCL为高电平时SDA山高电平向低电平跳变开始传送数据。结束信号PSCL为高电平时SDA由低电平向高电平跳变结束传送数据。响应信号(ACK)接收器在接收到8位数据后在第9个时钟周期拉低SDASDA上传输的数据必须在SCL为高电平期间保持稳定SDA上的数据只能在SCL为低电平期间变化 I2C协议信号如下 4.4 协议细节 如何在SDA上实现双向传输 主芯片通过一根SDA线既可以把数据发给从设备也可以从SDA上读取数据连接SDA线的引脚里面必然有两个引脚发送引脚/接受引脚。 主、从设备都可以通过SDA发送数据肯定不能同时发送数据怎么错开时间 在9个时钟里 前8个时钟由主设备发送数据的话第9个时钟就由从设备发送数据 前8个时钟由从设备发送数据的话第9个时钟就由主设备发送数据。 双方设备中某个设备发送数据时另一方怎样才能不影响SDA上的数据 设备的SDA中有一个三极管使用开极/开漏电路(三极管是开极CMOS管是开漏作用一样)如下图 真值表如下 从真值表和电路图我们可以知道 当某一个芯片不想影响SDA线时那就不驱动这个三极管想让SDA输出高电平双方都不驱动三极管(SDA通过上拉电阻变为高电平)想让SDA输出低电平就驱动三极管 4.5 示例主设备发送8bit给从设备 从下面的例子可以看看数据是怎么传的实现双向传输。 举例主设备发送8bit给从设备 前8个clk 从设备不要影响SDA从设备不驱动三极管主设备决定数据主设备要发送1时不驱动三极管要发送0时驱动三极管 第9个clk由从设备决定数据 主设备不驱动三极管从设备决定数据要发出回应信号的话就驱动三极管让SDA变为0从这里也可以知道ACK信号是低电平 从上面的例子就可以知道怎样在一条线上实现双向传输这就是SDA上要使用上拉电阻的原因。 4.6 为何SCL也要使用上拉电阻 在第9个时钟之后如果有某一方需要更多的时间来处理数据它可以一直驱动三极管把SCL拉低。 当SCL为低电平时候大家都不应该使用IIC总线只有当SCL从低电平变为高电平的时候IIC总线才能被使用。 当它就绪后就可以不再驱动三极管这是上拉电阻把SCL变为高电平其他设备就可以继续使用I2C总线了。 对于IIC协议它只能规定怎么传输数据数据是什么含义由从设备决定。 5. I2C通信的高级应用 在嵌入式系统设计中I2C应用广泛如 5.1 传感器网络 在多传感器系统中I2C用于读取各种环境参数如温度、湿度、光照强度等。这些数据可以被用于自动化控制系统或数据监测。 5.2 多设备控制 在复杂的嵌入式系统中如机器人或无人机I2C用于控制和监测多个执行器和传感器实现精确的运动控制和环境反馈。 5.3 嵌入式通信网络 I2C也常用于建立微控制器和各种外围设备如显示屏、存储设备等之间的通信网络。 6. I2C应用示例–以Arduino为例 要用GPIO模拟I2C通常被称为bit-banging你需要手动控制GPIO引脚来模拟I2C协议的SDA数据线和SCL时钟线。下面是使用Arduino系列单片机进行I2C的一个基本示例。 6.1 应用I2C传输数据的传感器 现在让我们用Arduino板和一些传感器来做一个例子并演示它。作为一个例子我将使用GY-80电路板它包含五个不同的传感器以及GY-521电路板它包含三个不同的传感器。 6.2 电路板连接 因此我们可以只用两根线通过I2C总线从八个不同的传感器获取数据。这里是我们将如何连接这些板。Arduino板的串行时钟引脚将连接到两个断路板的串行时钟引脚对于串行数据引脚也是如此我们还将使用Arduino板的地线和5V引脚为板提供电源。 6.3 Address地址查找 注意我们不使用上拉电阻因为电路板已经有了。现在为了与这些芯片或传感器通信我们需要知道它们的独特地址。我们可以从传感器的数据手册中找到它们。对于GY-80断路板我们有以下四个地址0x53是十六进制的三轴加速度计0x69是十六进制的三轴陀螺仪0x1E是十六进制的三轴磁力计0x77是十六进制的气压计和温度传感器。对于GY-521断路板我们只有一个地址那就是十六进制的0x68。 我们也可以使用I2C扫描器草图来获取或检查地址这可以从Arduino官方网站找到。所以如果我们上传并运行那个草图我们将得到I2C总线上连接设备的地址。 所以如果我们上传并运行那个草图我们将得到I2C总线上连接设备的地址。所以在我们找到设备的地址之后我们还需要找到它们的内部寄存器地址以便从中读取数据。 6.4 I2C读取数据示例 例如如果我们想从GY-80断路板的三轴加速度计传感器中读取X轴的数据我们需要找到存储X轴数据的内部寄存器地址。 从传感器的数据手册中我们可以看到X轴的数据实际上存储在两个寄存器中DATAX0的十六进制地址是0x32DATAX1的十六进制地址是0x33。现在让我们编写代码来获取X轴的数据。 6.5 程序编写 所以我们将使用Arduino Wire库这必须包含在草图中。这里首先我们必须定义我们之前找到的传感器地址和两个内部寄存器地址。 Wire.begin()函数将启动Wire库我们还需要启动串行通信因为我们将使用串行监视器显示传感器的数据。 在循环中我们将从Wire开始。beginTransmission()函数将开始向特定传感器传输我们的案例中是三轴加速度计。然后使用Wire.write()函数我们将请求来自X轴两个寄存器的特定数据。Wire.endTransmission()函数将结束传输并传输来自寄存器的数据。现在通过Wire.requestFrom()函数我们将要求传输的数据或寄存器的两个字节。Wire.available()函数将返回可检索的字节数如果该数字与我们请求的字节数相匹配在我们的案例中是两个字节使用Wire.read()函数我们将从X轴的寄存器中读取字节。最后我们将在串行监视器中打印数据。 这是那些数据但请记住这些是原始数据需要做一些数学运算才能得到X轴的正确值。你可以在我的下一个教程中找到更多细节那个教程是关于如何使用Arduino板上的加速度计因为我不想让这个教程过于复杂它的主要目标是解释I2C通信是如何工作的。 结论 I2C通信总线以其简单、高效和灵活的特性在嵌入式系统设计中占据了举足轻重的地位。对于经验丰富的技术专家而言深入理解I2C的工作原理和应用场景不仅可以提高系统设计的效率和可靠性还可以为解决复杂的设计挑战提供更多的可能性。随着嵌入式技术的不断进步I2C的应用领域和技术深度也将持续扩展为嵌入式系统设计带来更多创新和突破。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Indexes(索引) - 详解

SQL Indexes(索引) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

Payload CMS:开发者优先的Next.js原生开源解决优秀的方案,重新定义无头内容管理

Payload CMS:开发者优先的Next.js原生开源解决优秀的方案,重新定义无头内容管理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

CMS网站建设实战试题广东网页设计

🌿 一、TestAppForlOS TestAppForlOS是一款运行在iOS系统上的测试应用程序。它可以用来测试iOS设备的硬件和软件性能,以及验证应用程序的兼容性和稳定性。该应用程序提供了多种测试工具,包括CPU、内存、存储器、网络等性能测试,同…

网站维护工作的基本内容苏州建设局网站首页

文章目录 1. Label 提示框1.1. 显示文本1.2. 修改Label的文本1.2.1. 方式1:通过label.config()1.2.2. 方式2:通过 label["text"] 属性进行修改 1.3. 设置背景图片 2. Tkinter 开发3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2…

07. 自定义组件

一、在单独文件中自定义组件我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载。 pip ins…

CF1611E2 Escape The Maze (hard version)

CF1611E2 Escape The Maze (hard version)题目简化 我在1号节点,你有k个朋友,分别在a1,a2,a3....ak的位置,在同一时间内可以移动1步,我不能和朋友走到同一个节点,如果我能走到叶节点,我就赢了,输出-1,否则必然…

P8186 [USACO22FEB] Redistributing Gifts S

P8186 [USACO22FEB] Redistributing Gifts S题目 每一个牛都有一个自己喜欢的排列,并且初始的时候,每只牛都是i,求经过n次交换后,每只牛能拿到的最喜欢的 我们来简化这n次操作,a1->a2,a2->a3,a3->a4,a4-…

重庆网站制品牌建设推荐

MySQL强制索引和禁止某个索引1、mysql强制使用索引:force index(索引名或者主键PRI)例如:select * from table force index(PRI) limit 2;(强制使用主键)select * from table force index(ziduan1_index) limit 2;(强制使用索引"ziduan1_index")select * from table …

做视频解析网站是犯法的么网站备案时间就是正式上线时间吗

题目描述 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg的每个元素都加上D。例如对f1,2, 3,4,5g执行"ADD 241" 会得到f1,3,4,5,5g。 2. REVERSExy:将子序列fAx:::Ayg翻转。例…

python语法记录

map()函数 A=[1,-3,5] A_abs = list(map(abs, A))map(func, A),把func函数作用到A的每个元素上,返回的是惰性迭代器,依次产出1,3,5,不能直接打印或索引; 用list()把它一次性拉出来,变成普通列表[1, 3, 5]。

怎么免费建立网站做推广天津雍鑫建设投资集团网站

问题描述 在Mac上安装git,双击pkg进行安装,报如下图错误: 解决办法 不要双击pkg文件,改成选中文件之后,鼠标右键,选择“打开方式->安装器(默认)”,即可继续安装。 转载…

详细介绍:Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Go 即时通讯体系:客户端与服务端 WebSocket 通信交互

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发持续更新wordpress广告设置

大数据开发(Hadoop面试真题) 1、Hive count(distinct)有几个reduce,海量数据会有什么问题?2、既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase?3、Spark map join的实现原理&#xf…

2025 年储罐厂家推荐最新公司权威排行榜榜单发布,深度解析衬四氟储罐 / 硫酸储罐 / 盐酸储罐工厂选购指南

引言在当今工业领域,储罐作为储存各类液体、气体等物质的关键设备,其重要性不言而喻。从化工行业储存具有强腐蚀性的原料,到食品行业对卫生安全要求极高的产品储存,再到环保领域对污水、废气处理过程中的暂存需求等…

读混元image论文

读混元image论文https://www.yiyibooks.cn/arxiv/2509.23951v1/index.html

实用指南:跳动的爱心

实用指南:跳动的爱心2025-10-05 20:24 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

UnicodeEncodeError: locale codec cant encode character \u5e74 in position 2: encoding error

s= datetime.now().strftime(u"%Y年%m月%d日 %H:%M:%S" )UnicodeEncodeError: locale codec cant encode character \u5e74 in position 2: encoding error可行方案: import localefrom datetime import da…

2025 年生物除臭设备厂家最新推荐排行榜:覆盖污水处理厂 / 垃圾中转站等多场景,助力企业精准挑选优质设备

当前,恶臭污染在工业生产与城市生活中愈发凸显,污水处理厂、垃圾中转站、餐厨垃圾处理场等场所产生的恶臭气体,不仅影响周边居民生活,还危害人体健康,且随着环保标准不断提高,企业对高效环保除臭设备的需求极为迫…

杭州网站设计成功柚v米科技wordpress加载图片的速度

文章目录1. 题目2. 解题1. 题目 亚历克斯和李继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。 亚历克斯和李轮流进行,亚历克斯先开始。最初,M 1。 在每个玩家的回合中&…