【普通IO口与模拟通信相比数字通信有哪些优势实现I2C通信】相比于【使用硬件I2C模块】有什么缺陷?

I2C是由Philips公司推出的芯片间串行传输總线它以规范严谨、使用简单灵活、支持的外围器件繁多等特点而被广泛应用。对于不具备I2C接口的主器件(通常指MCU)可利用普通的I/O口來,但由于无法解决多主竞争问题而只能应用在单主机系统中本文提供了一种解决方案,可将与模拟通信相比数字通信有哪些优势I2C总线應用在多主机系统中实现与模拟通信相比数字通信有哪些优势I2C的多。

1 与模拟通信相比数字通信有哪些优势I2C多主通信的设计原理


在I2C总线系統中可以有多个主器件节点。当多个主器件节点都企图控制总线时就会出现多主竞争。这时就需要进行仲裁裁决的结果只允许其中┅个主器件节点成为主控器。而硬件I2C系统之所以支持多主系统是因为其具有的三个特性:①接口的线“与”逻辑功能;②内部冲突检测電路;③I2C中断和状态处理程序。这使其能够自动完成多主竞争时的时钟同步与总线仲裁无须用户介入。而在与模拟通信相比数字通信有哪些优势I2C系统中如果能通过软硬件设计与模拟通信相比数字通信有哪些优势出上述的三个特性,就等于解决了竞争仲裁与同步问题那麼与模拟通信相比数字通信有哪些优势I2C总线就完全可以应用于多主机系统中。


首先经过理论分析与实验验证,得知并联在一起的MCU的普通I/Oロ线本身就具有线“与”特性其次,为了避免主节点在总线繁忙时启动总线而引起的冲突需要增加一条握手线,即BUSY线来代表总线的忙/閑状态因为数据线(SDA)和时钟线(SCL)上的信号是变化的,所以不能用它们充当BUSY线另外,当多个MCU都检测到总线空闲同时企图控制总线時,将形成多主竞争状态同样会引起冲突。这时就需要引入时间片用划分的时间片来决定竞争时各MCU占用I2C总线的优先次序。结合SDA的线“與”特性检测SDA上是否已经存在启动信号(即SDA是否为0),如果直到相应的时间片结束都没有检测到SDA上的启动信号自己就可以控制总线。朂后由于与模拟通信相比数字通信有哪些优势系统中没有硬件I2C中断,MCU作为从器件时不知何时开始接收总线上的数据所以,需要提供一根I2C中断信号线使MCU在中断程序中处于从接收状态,中断线可以与BUSY线合用

    通过上述分析,利用三根信号线就能与模拟通信相比数字通信有哪些优势出硬件I2C的竞争仲裁过程实现与模拟通信相比数字通信有哪些优势I2C的多主通信。


与模拟通信相比数字通信有哪些优势I2C多主系统中要参与竞争的主器件节点采用三级连接方式,如MCU(A)、MCU(B)、MCU(C);对于外围器件节点如24C64等因不具备主动控制I2C总线的能力,不会参与總线的竞争所以仍可采用通用的两线连接方式。三线与模拟通信相比数字通信有哪些优势I2C总线中的时钟线SCL和数据线SDA可由MCU的任意两个I/O口线與模拟通信相比数字通信有哪些优势;BUSY线因还要充当中断信号线则必须与MCU的外部中断引脚INT0或INT1连接。


在检测到BUSY=0(忙)时不会出现竞争;泹当检测到BUSY=1(闲)到将BUSY设为0,需要的典型时间为3个机器周期在这段时间内,别的MCU仍会检测到BUSY=1也认为总线空闲到企图占用,这时就出现叻竞争与冲突竞争的时间范围为2×3个机器周期。仲裁的方法是为每一个MCU分配一个仲裁时间片在规定的时间片内MCU反复检测总线中的数据線SDA是否有信号,直到时间片结束如果没有信号就可马上占用I2C总线,发送起始信号;如果有信号则表示有别的高优先级的MCU要占用该MCU退出競争。仲裁时序图如图2所示

将BUSY设为0后的一段时间规定为仲裁时间。仲裁时间长度为(N-1)×Δt。N为I2C总线上参与竞争的MCU个数;Δt为一个时间爿的长度典型值为4个机器周期。按优先级顺序给MCU分配不同个数的时间片仲裁时序如图2所示:假设MCU(A)优先级最高,它不必进行时间片測试在检测到总线空闲时直接发送起始位;MCU(B)优先级为次高,在检测到总线空闲后它需要等待检测一个时间片周期Δt,在Δt期间内SDA線上没有变化即等待确认比它高优先级的MCU(A)不使用总线后,MCU(B)才能占用总线发送起始信号;MCU(C)优先级最低,它需要测试等待周期2Δt只有当MCU(A)、MCU(B)都不占用总线时(SDA一直保持为1),MCU(C)才能占用总线发送起始信号


在实际应用中,还要注意BUSY线所用的中断脚INT0/INT1需初始化为开中断并设定为下跳沿触发。当各MCU需控制总线进行主发送或主接收时需先关掉INT0/INT1需初始化为开中断,并设定为下跳沿触发当各MCU要控制总线进行主发送或主接收时,需先关掉INT0/INT1中断再检测BUSY线是否为空闲(=1)。若是空闲就将BUSY设为0进行竞争仲裁,流程图如图3所示洳果在仲裁时间片内SDA始终为1,说明没有高优先级的MCU要占据总线自己可以发动起始信号控制总线,直到通信结束后再释放BUSY线将其置为1。此时其它的MCU就只能作为从器件如果在仲裁时间片内检测到SDA=0,则表明I2C总线已被占用立刻将自己的BUSY设为1,并打开中断转为从接收其流程圖如图4所示。在中断程序中接收寻址字节以判明是否呼叫自己。若是就进行相应的读写操作;若不是,就放弃退出中断程序注意:為了使总线上的MCU都能检测到I2C上的起始信号,并使从器件能够同步接收SDA=0的时间要维持一定的宽度,至少应大于9个机器周期


经实验证明:彡线与模拟通信相比数字通信有哪些优势I2C总线解决了多主竞争问题,可方便的应用于多主机系统中提高了系统的灵活性,也进一步扩大叻软件与模拟通信相比数字通信有哪些优势I2C的应用范围在实际应用中具有一定的使用价值


编辑:什么鱼 引用地址:
本网站转载的所有的攵章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者如果本網所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用请及时通过电子邮件或电话通知我们,以迅速采取适当措施避免给双方造成不必要的经济损失。

/* 名称:C51IO口与模拟通信相比数字通信有哪些优势I2C总线驱动EEPROM(AT24C16)说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据SDA数据总线用来发送数据(或地址)。和SPI总线不同的是I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了無非是通过IO口与模拟通信相比数字通信有哪些优势产生所需信号 (如通信开始信号是SCL为高时,SDA产生一个下降沿信号)

/* 名称:C51IO口与模拟通信相比数字通信有哪些优势I2C总线驱动AT24C16 说明:关于EEPROM,即这里的AT24C16是一个特殊形式的FLASH存储器不过其容量一般较少。比较适合于存储少量的数据AT24C16的通信接口是标准的I2C通信,即我们需要根据I2C通信协议来操纵EEPROM设备 关于AT24C16的的各种操作,这里就不细讲了简单介绍一下。(1)、主机向AT24C16寫一个字节:首先需要发送设备地址然后发送需要访问的存储器地址。然后在发送要写入的数据这里省略了开始、结束和确认等信号嘚产生。(2)、指定页写入n个字节:和(1)的基本操作很类似不同的是可以连续写入n个数据。这里要小注意一点的就是写入的数据

xxxx)SubAddr:从机的子地址SubMod:子地址模式,0-无子地址1-单字节子地址,2-双字节子地址*dat:要发送的数据Size:数据的字节数返回:0:发送成功1:在发送过程

关注我分享文章的朋友应该知道峩在前面讲述过(软件、硬件)I2C主机控制从机EEPROM的例子在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中很多应用都会使用箌I2C通信。但在实际项目中作为I2C从机的应用相对要少的多本文主要讲述关于【STM32F10x_硬件I2C主从通信】中STM32作为从机的例子。

在学习本问内容之前洳果对I2C协议还不太了解的朋友请先去了解一下I2C协议,或看我之前关于I2C通信的文章(我微信公众号和博客都有)

关于STM32硬件I2C作为从机的文章網上很少(我在写本文之前也在百度、谷歌等网站上搜索了解过),我猜测大概的原因主要是两点:1.使用该功能的人比较少; 2.说STM32硬件I2C存在BUG

“使用该功能的人比较少”这个可以理解。其实我不能理解的是普遍说这个有BUG的现象。我只觉得你选择了使用这个芯片来作为开发,你选择之前应该是认可它的什么东西都不可能尽善尽美,一点小的瑕疵只要可以避免就行。就像Windos系统一样偶尔死机、蓝屏,但是伱还是依然会选择使用它

关于STM32硬件I2C自身BUG也不否认,但官方给出了解决的办法作为程序员,解决一项BUG是对自身能力的一种提升。所鉯遇到困难,勇于面对才是正确的做法

本文提供两个实例:一个主机发送(硬件I2C轮询发送数据)、一个从机接收并打印接收数据(硬件I2C中断接收数据)。

主机间隔500ms发送10字节从机接收10字节检测到I2C停止,将收到的数据通过串口打印出来【发送的数据及长度可修改,从机洎动检测停止条件也就是可以检测得到主机发送了多少字节数据】

关于本文的更多详情请往下看。

笔者针对于初学者提供的例程都是去掉了许多不必要的功能精简了官方的代码,对初学者一看就明白以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经過多次测试并没有问题才上传至360云盘欢迎下载测试、参照学习。

提供下载的软件工程是基于KeilMDK-ARM) V5版本、STM32F103ZE芯片但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)

这里再次提示一下I2C协议重要的几点:

SDA数据线由高 -> 低 为总线开始条件

SDA数据线由低 -> 高 为总线结束条件

(IO与模拟通信相比数字通信有哪些优势I2C时注意:开始之后将SCL变为低电平,防止误操作SDA使其通信停止)

SCL时钟电平为低 可以改换SDA数據线的电平,在SCL上升沿的过程将SDA数据发送出去

(IO与模拟通信相比数字通信有哪些优势I2C时切记:请先将SCL变为低电平,再改变SDA电平状态)

I2C是鉯字节(8位)的方式进行传输总线上每传输完1字节之后会有一个应答信号,主器件(主机)需要产生对应的一个额外时钟

传输格式:8位数據 + 1位应答

数据传输必须带响应,相关的响应时钟脉冲由主机产生在响应的时钟脉冲期间,发送器释放 SDA 线(高)

在响应的时钟脉冲期间 接收器必须将 SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平

1.在(主机)写数据的时候是从机应答(给主机),主机检测;

2.在(主机)读数据的时候是主机应答(给从机)从机检测;

(这里可以借助I2C读写函数一起理解)

1.时序图(主机写,从机应答主机读取应答)

2.时序图(主机读,主机产生应答)

更多关于I2C协议的文档可以网上查询也可以参看我下面下载链接的文档(周立功翻译的版夲):  访问密码 82f3

Ⅳ、硬件I2C主机发送数据

硬件I2C主机的配置其实很简单,和前面读写EEPROM的(主机)配置一样

这里就不再描述。主要讲述一下主機发送数据这一块的代码

我封装的发送数据函数:

主要就是3个参数:数据BUF、数据长度、从设备地址

看过我前面主机读写EEPEOM代码的人应该很清楚,这里很相似读写EEPROM比这里多了一个步骤,那就是多了写数据地址的步骤

主程序间隔500ms调用一次该函数,发送一串(我们定义10字节)从机也是间隔500ms收到一串数据并打印出来。

Ⅴ、硬件I2C从机中断接收数据

硬件I2C的从机接收数据一般分为三类:中断接收、DMA接收和轮询接收

茬实际项目中中断接收DMA接收比较常见因为不用占据CPU资源,有数据来了才响应接收【需要CPU具有硬件I2C功能】

轮询接收数据很占用CPU资源,一般是CPU没有硬件I2C资源处理的数据不多的情况下。

硬件I2C从机配置I2C这一块比较简单和上面主机类似,请参看源代码或参考我之前文章的講述

提醒:配置中注意关于I2C事件中断这一块(请看源代码)。

中断接收函数源代码如下

进入I2C事件中断判断是I2C从机事件,此时作为從机接收数据需要检测三个标示:

1.检测主机已发生地址(ADDR = 1);

硬件I2C通信中,起始条件由硬件判断完成我们检测的就需要这几步就能完成基本的接收数据功能。

理解本文之前请先理解I2C协议

更多关于硬件I2C主从通信的例子(如:DMA发送、DMA接收等)就不再单独写文章讲述了,可以茬微信公众号联系我

以上总结仅供参考,若有不对之处敬请谅解。

更多精彩文章我将第一时间在微信公众号里面分享对本文有什么疑问可微信留言。

本着免费分享的原则方便大家手机学习知识,定期在微信平台分享技术知识如果你觉得分享的内容对你有用,又想叻解更多相关的文章请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你


最近要做个顶目需要用到I2C做从模式来跟主机通信在这里我用的是STM32F103的芯片,要怎么配置成从而机模式最好有源代码或实例说明最好。

官方自己已经提供了IIC的固件和使用唎程你直接上官网搜索吧,多着呢

你可以自己用IO与模拟通信相比数字通信有哪些优势IIC从机时序,也可以用ST提供的IIC从机固件

不过注意,ST的IIC主机固件是有bug的到目前为止都没有实际解决,几乎绝大部分人都是用IO与模拟通信相比数字通信有哪些优势IIC主机时序

不过IIC从机,据說ST的固件是没问题的

我要回帖

更多关于 与模拟通信相比数字通信有哪些优势 的文章

 

随机推荐