b2i2c是什么意思直流还是交流

单片机、电路板
连接器、接插件
其他元器件
在同一条I2C总线上挂接多个DS1859器件的方法
在同一条I2C总线上挂接多个DS1859器件的方法
DS1859双路、温控电阻不允许用户通过外部引脚改变其I2C从地址。相反,器件为主存储器提供可编程I2C从地址。在具体应用中,一条I2C总线可能需要接多个DS1859器件。由于所有DS1859出厂时的缺省I2C从地址都相同,因此,这些器件与I2C总线连接时,必须改变其中一个或多个器件的从地址。
本应用笔记阐述了同一条I2C总线上接两个DS1859时,如何改变其中一个器件的I2C从地址。这一方法可推广应用于挂接多个器件的情况。本文假定用户可
&&& DS1859双路、温控电阻不允许用户通过外部引脚改变其I2C从地址。相反,器件为主存储器提供可编程I2C从地址。在具体应用中,一条I2C总线可能需要接多个DS1859器件。由于所有DS1859出厂时的缺省I2C从地址都相同,因此,这些器件与I2C总线连接时,必须改变其中一个或多个器件的从地址。
&&& 本应用笔记阐述了同一条I2C总线上接两个DS1859时,如何改变其中一个器件的I2C从地址。这一方法可推广应用于挂接多个器件的情况。本文假定用户可根据需要将DS1859的WPEN引脚转换为逻辑高电平或逻辑低电平。
&&& DS1859的独特之处还在于每个器件有两个从地址,其中一个可编程地址用来访问主存储器,另一个固定地址(A0h)用来访问辅助存储器。在本文的最后将讨论如何访问辅助存储器。
&&& 在同一条I2C总线上挂接两个DS1859
&&& 当同一条I2C总线上接两个DS1859时,必须改变其中一个器件的从地址,另一个器件则保持其缺省地址(A2h)不变。可通过以下步骤来实现这一点。
&&& 将一个DS1859 (器件1)的WPEN引脚驱动至信号地。
&&& 将另一个DS1859 (器件2)的WPEN引脚驱动至高电平。
&&& 将器件2的MPEN位置为高(从器件地址A2h,表01h,寄存器89h,第2位)。该设置对两个器件的MPEN位都有效,但是由于器件1的WPEN引脚接地,因此只有器件2被写保护。该步骤之后所有对从地址A2h的写操作都仅对器件1产生影响。
&&& 将器件1的从地址设置为任何期望的数值(00h - FEh,A2h除外)。进行编程设置时,采用从地址A2h,表01h,字节8Ch。
&&& 将器件1的ADFIX位置为高(从地址A2h,表01h,寄存器89h,第4位)。
&&& 器件1的从地址即配置为第5步所指定的地址。
&&& 然后WPEN引脚可被驱动至需要的逻辑电平,此时可以将MPEN位恢复至缺省值(0b)。
&&& 系统中连接多个DS1859
&&& 上述步骤也适用于同一条I2C总线接多个DS1859的情况。此时,除了某个从地址需要改变的器件外,所有器件均被置为写保护。
&&& 访问辅助存储器
&&& 用户应该注意,只有主器件地址能被改变。而所有器件的辅助存储器地址不能改变,仍然保持为A0h。I2C总线上只能有一个器件通过地址A0h访问辅助存储器。然而,用户可置位其它器件的ADEN位,并通过主器件地址及表00h来访问其它器件的辅助存储器。
&&& 如果I2C总线上连接了多个DS1859 (具有相同的缺省I2C地址),并且这些器件已焊接在系统PCB上时,本应用笔记对如何改变这些器件的I2C从地址进行了阐述。
&&& DS1859双路、温控电阻不允许用户通过外部引脚改变其I2C从地址。相反,器件为主存储器提供可编程I2C从地址。在具体应用中,一条I2C总线可能需要接多个DS1859器件。由于所有DS1859出厂时的缺省I2C从地址都相同,因此,这些器件与I2C总线连接时,必须改变其中一个或多个器件的从地址。
&&& 本应用笔记阐述了同一条I2C总线上接两个DS1859时,如何改变其中一个器件的I2C从地址。这一方法可推广应用于挂接多个器件的情况。本文假定用户可根据需要将DS1859的WPEN引脚转换为逻辑高电平或逻辑低电平。
&&& DS1859的独特之处还在于每个器件有两个从地址,其中一个可编程地址用来访问主存储器,另一个固定地址(A0h)用来访问辅助存储器。在本文的最后将讨论如何访问辅助存储器。
&&& 在同一条I2C总线上挂接两个DS1859
&&& 当同一条I2C总线上接两个DS1859时,必须改变其中一个器件的从地址,另一个器件则保持其缺省地址(A2h)不变。可通过以下步骤来实现这一点。
&&& 将一个DS1859 (器件1)的WPEN引脚驱动至信号地。
&&& 将另一个DS1859 (器件2)的WPEN引脚驱动至高电平。
&&& 将器件2的MPEN位置为高(从器件地址A2h,表01h,寄存器89h,第2位)。该设置对两个器件的MPEN位都有效,但是由于器件1的WPEN引脚接地,因此只有器件2被写保护。该步骤之后所有对从地址A2h的写操作都仅对器件1产生影响。
&&& 将器件1的从地址设置为任何期望的数值(00h - FEh,A2h除外)。进行编程设置时,采用从地址A2h,表01h,字节8Ch。
&&& 将器件1的ADFIX位置为高(从地址A2h,表01h,寄存器89h,第4位)。
&&& 器件1的从地址即配置为第5步所指定的地址。
&&& 然后WPEN引脚可被驱动至需要的逻辑电平,此时可以将MPEN位恢复至缺省值(0b)。
&&& 系统中连接多个DS1859
&&& 上述步骤也适用于同一条I2C总线接多个DS1859的情况。此时,除了某个从地址需要改变的器件外,所有器件均被置为写保护。
&&& 访问辅助存储器
&&& 用户应该注意,只有主器件地址能被改变。而所有器件的辅助存储器地址不能改变,仍然保持为A0h。I2C总线上只能有一个器件通过地址A0h访问辅助存储器。然而,用户可置位其它器件的ADEN位,并通过主器件地址及表00h来访问其它器件的辅助存储器。
&&& 如果I2C总线上连接了多个DS1859 (具有相同的缺省I2C地址),并且这些器件已焊接在系统PCB上时,本应用笔记对如何改变这些器件的I2C从地址进行了阐述。
型号/产品名
深圳创恩电子有限公司
深圳创恩电子有限公司
深圳市宝龙福实业有限公司
深圳市硅虎电子有限公司21ic官方微信-->
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
STM8S I2C作从机 怎么让总线一直忙
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
当从机接收完毕主机数据后。。。从机处理数据 等处理完毕后 传送给主机。
在从机处理数据这段时间内 我不想让主机来读处理结果。
我想到的方法是让I2C总线一直忙 等我处理结束后再释放总线。
请教 怎样在从机总编程让总线忙 。
满意回复+49
可以用这个简单的办法:在从机处理数据这段时间内,I2C从机把I2C_SCL拉低。
当I2C总线上有多个从机时,这个方法有一定的问题。
其实,在从机处理数据这段时间内 ...
LZ好像是做楼宇对讲吗,
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
可以用这个简单的办法:在从机处理数据这段时间内,I2C从机把I2C_SCL拉低。
当I2C总线上有多个从机时,这个方法有一定的问题。
其实,在从机处理数据这段时间内 让主机来读数据也没关系的,因为从机没有ACK主机读数据会失败。
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
本帖最后由 q 于
14:11 编辑
我问的就是怎样让scl线保持低电平;我用的是物理I2C 在控制寄存器中没看见控制SCL线的位
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
可以设置为普通GPIO,然后输出低电平即可。
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
实习生, 积分 49, 距离下一级还需 1 积分
IJK 我用的是物理I2C 怎么改变为普通I/O
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
4# IJK 我用的是物理I2C 怎么改变为普通I/O
复位后,不对I2C进行初始化,就是作为普通I/O用了。
在对I2C进行初始化并使用后,对I2C模块进行复位,并切断I2C模块的时钟后,应该又可以作为普通I/O用。
谢谢您的热心回复 。
中级技术员, 积分 180, 距离下一级还需 120 积分
中级技术员, 积分 180, 距离下一级还需 120 积分
中级技术员, 积分 180, 距离下一级还需 120 积分
中级技术员, 积分 180, 距离下一级还需 120 积分
LZ好像是做楼宇对讲吗,
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
扫描二维码,随时随地手机跟帖
时间类勋章
技术领袖奖章
人才类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
您需要登录后才可以回帖有人在调试STM32F1的时候被硬件I2C坑了吗?为毛一直超时? - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 957|回复: 9
有人在调试STM32F1的时候被硬件I2C坑了吗?为毛一直超时?
在线时间13 小时
该用户从未签到主题帖子精华
初级会员, 积分 165, 距离下一级还需 35 积分
本帖最后由 原同学 于
14:55 编辑
最近在做一个可穿戴应用,因为ATMEGA328刷屏太慢卡顿明显遂换STM32F103C8T6。
电路比较简单,PA0-3是触摸按键,CubeMX中配置为EXTI0-3;SPI1用于与字库芯片通信,片选是PA4;I2C1上挂有DS3231、BMP280、SSD1306驱动的OLED;串口接ST-Link的VCP,SWD调试,系统只有高速时钟使用了外部8M晶振。
现在问题是操作OLED和DS3231有问题,单步发现是超时导致出错
麻烦各路大佬帮忙看看是怎么回事,实在不行就换F072C8T6,手里还有两片
还有,新建了个工程读写24C02跟OLED数据寄存器一样的地址,没有任何问题,出错就重新初始化,没作更进一步防爆处理,如果需要稍后把这个工程放上来
因为考虑使用DMA,所以尽量不考虑软件模拟。上面那个程序应该怎么改才能正常运行?
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间463 小时
ST金币1870
该用户从未签到主题帖子精华
我就不说其他的了,模拟走起!!!
在线时间13 小时
该用户从未签到主题帖子精华
初级会员, 积分 165, 距离下一级还需 35 积分
我就不说其他的了,模拟走起!!!
希望能用硬件的。模拟的好像不能Level3优化,并且不能DMA
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间463 小时
ST金币1870
该用户从未签到主题帖子精华
希望能用硬件的。模拟的好像不能Level3优化,并且不能DMA
只有代码写得不好,才无法经过优化,我的所有代码都是开最高优化,妥妥的!!!至于不能DMA,I2C还能传大量数据了不成?
在线时间13 小时
该用户从未签到主题帖子精华
初级会员, 积分 165, 距离下一级还需 35 积分
只有代码写得不好,才无法经过优化,我的所有代码都是开最高优化,妥妥的!!!至于不能DMA,I2C还能传大 ...
IO模拟如果可以最高优化那也可以作为备用方案。主要是唤醒之后要一直刷新OLED上的数据,之前用AVR的时候,刷的很慢,受不了才换stm32的,希望DMA能有用
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间463 小时
ST金币1870
该用户从未签到主题帖子精华
IO模拟如果可以最高优化那也可以作为备用方案。主要是唤醒之后要一直刷新OLED上的数据,之前用AVR的时候 ...
OLED,点阵屏啊。。。200k的速度,10ms应该可以刷一次。。。模拟也是可以胜任的啊。。。当然了你非要用硬件,那就自己慢慢调喽,我只能说,ST的硬件I2C非常非常坑。。。本人亲自试过。。。不过有什么屏幕是只支持I2C接口,连SPi都不支持???这个屏幕也是牛逼!!!
在线时间100 小时
该用户从未签到主题帖子精华
金牌会员, 积分 1523, 距离下一级还需 3477 积分
IO模拟如果可以最高优化那也可以作为备用方案。主要是唤醒之后要一直刷新OLED上的数据,之前用AVR的时候 ...
我做过两块OLED都是SPI接口的,刷屏速率还可以。可以讨论下你们的接口设计。
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间13 小时
该用户从未签到主题帖子精华
初级会员, 积分 165, 距离下一级还需 35 积分
OLED,点阵屏啊。。。200k的速度,10ms应该可以刷一次。。。模拟也是可以胜任的啊。。。当然了你非要用硬 ...
现在终于调通了,中间遇到了不少坑,器件地址要填8位、读写寄存器要按字节来、OLED的数据寄存器在0x40而不是0x20等。现在用硬件I2C,400kHz非常流畅,看不出来卡屏。准备测试DMA模式下100Hz中断打断是否会影响。
在线时间463 小时
ST金币1870
该用户从未签到主题帖子精华
现在终于调通了,中间遇到了不少坑,器件地址要填8位、读写寄存器要按字节来、OLED的数据寄存器在0x40而 ...
看来真正的坑你还没遇到!!!等你遇到了,那才叫生不如死!!!
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间13 小时
该用户从未签到主题帖子精华
初级会员, 积分 165, 距离下一级还需 35 积分
看来真正的坑你还没遇到!!!等你遇到了,那才叫生不如死!!!
貌似已经遇到了,一开DMA就进HF,改了缓冲区又发现总线锁死了,没办法,只能用最普通的了。也许是我不太会用DMA的缘故。
真正的坑还有哪些?望版主指点
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered bySMBUS和I2C的区别,学习一下。【转载,已不知出处,望原作者见谅】
【转】SMBus与I2C的区别 SMbus 最早是由 Intel 公司提出来的. 现在由 SBS 管理维护这一个规格. 此规格是用
Philips 的 I2C 简化而来. SMbus 是由两条讯号所组成的一种汇流排.
是为了在系统上较慢速的装置及电源管理装置之间的沟通使用.
使系统可取得这些装置的制造厂商,型号,一些控制资讯,错误讯息及状态.
  这两条讯号为 SMBCLK 和 SMBDATA. 这和 I2C 上的 Clock(SCL) 和 Data(SDA)
  上图为一 SMbus 的架构图. 不同的装置都接在同一 Bus 上.在 SMbus 上只有一个 Master. 所有的命令均由此
Master 发出. 其他的装置 (Slave) 只能接收 Master 发出的命令或回覆资料给
  上图为 SMbus 开始及结束 bus 的图.当 SCL 为 High 而 SDA 由 High 变 Low 时表示开始一个
SMbus 的命令.当 SCL 为 High 而 SDA 由 Low 变 High 时表示结束一个 SMbus 的命令. 这二个状况在
Smbus 里是唯一的. 在一般传送资料时均不可能发生. 而在一般传送资料时则是在每一次 SCL 的上升缘时的 SDA 状态来决定.
这些资料包含了仲裁,确认,送出资料给那一个装置及送出的资料.或要取得那一个装置的资料及由装置送出的资料.
  关於I2C
Bus与SMBus,许多人很少去谈论与了解两者的细节差异,包括很多国外的简报文件也经常将两者混写、交杂描述、交替运用。
  确实,在一般运用下,I2C
Bus与SMBus没有太大的差别,从实体接线上看也几乎无差异,甚至两者直接相连多半也能相安无误地正确互通并运作。不过若真要仔细探究,其实还是有诸多不同,如果电子设计工程师不能明辨两者的真实差异,那麼在日后的开发设计的验证除错阶段时必然会产生困扰,为此本文将从各层面来说明I2C
Bus与SMBus的细微区别,期望能为各位带来些许助益。
  附注:关於I2C Bus的基础,可参考笔者之前的「I2C介面之线路实务」,网址为:
http://www.digitimes.com.tw/n/article.asp?id=30479
9064272FED148256FDC00481D68
  首先从规格的制订背景开始,I2C是在设计电视应用时所发创的介面,首版於1992年发表;而SMBus(System
Management Bus)则是Intel与Duracell(金顶电池)共同制订笔记型电脑所用的智慧型电池(Smart
Battery)时所发创的介面,首版於1995年发表,不过SMBus文件中也提及,SMBus确实是参考自I2C,并以I2C为基础所衍生成。
  I2C起源於电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C;而SMBus则在之后为PC所制订的先进组态与电源管理介面(Advanced
Configuration & Power
Interface;ACPI)规范中成为基础的管理讯息传递介面、控制传递介面。
  虽然I2C与SMBus先后制订时间不同,但都在2000年左右进入成熟化改版,I2C的过程改版以加速为主要诉求,而SMBus以更切合Smart
Battery及ACPI的需求为多。
  ▲图说:MAXIM公司的MAX6641晶片,具有温度监督及风扇控制功能(用PWM脉宽调变方式控制风扇转速),图中脚位7、8即是SMBus(圈处),其他装置可透过SMBus与此晶片沟通,取得温度及相关资讯,或进行命令操控。(图/MAXIM-IC.com)
I2C的Hi/Lo逻辑准位有两种认定法:相对认定与绝对认定,相对认定是依据Vdd的电压来决定,Hi为0.7 Vdd,Lo为0.3
Vdd,绝对认定则与TTL准位认定相同,直接指定Hi/Li电压,Hi为3.0V,Lo为1.5V。相对的SMBus只有绝对认定,且准位与I2C有异,Hi为2.1V,Lo为0.8V,与I2C不全然吻合但也算部分交集。不过,SMBus后来也增订一套更低电压的准位认定,Hi为1.4V,Lo为0.6V,这是为了让运用SMBus的装置能更省成本而有的作法。
  了解电压后再来是电流,由於SMBus一起头就是运用在笔记型电脑内,所以低用电的表现优於I2C,只需100uA就能维持工作,I2C却要到3mA,同样的低用电特性也反应在漏电流(Leakage
Current)的要求上,I2C最大的漏电流为10uA,SMBus为1uA,但是1uA似乎过度严苛,使运用SMBus的装置在验证测试时耗费过多的成本与心力,因此之后的SMBus
1.1版放宽了漏电流上限,最高可至5uA。
  再者是相关限制,I2C有线路电容的限制,SMBus却没有,但也有相类似的配套规范,即是准位下拉时的电流限制,当SMBus的开集极接脚导通其闸极而使线路接地时,流经接地的电流不得高於350uA,另外拉升电流(即相同的开集极接脚开路时)也一样有规范,最小不低於100uA,最高也是不破350uA。
  既然对电流有限制,那麼也可容易地推断对提升电阻的阻值之范围要求,I2C在5V Vdd时当大於1.6k ohm,在3V
Vdd时当大於1k ohm,类似的SMBus於5V Vdd时当大於14k ohm,3V Vdd时当大於8.5k
ohm,不过这个定义并非牢不可破,就一般实务而言,在SMBus上也可用2.4k?3.9k
ohm范畴的阻值。
  附注:I2C的时脉线称SCK或SCL,资料线称SDA。SMBus的时脉线称SMBCLK,资料线称SMBDAT。
  ▲图说:I2C与SMBus在逻辑位准的电压定义不尽相同,基本上I2C的定义较为宽裕、弹性,而SMBus则更专注在省电方面的要求。(图/MAXIM-IC.com)
  时序差别与考验
实体层面的空间要求完后,再来就是实体层面的时间,即是时序(Timing)方面的差别。
  先以运作频率来说,I2C此方面相当宽裕,最低频可至0Hz(直流状态,等於时间暂停),高可至100kHz(Standard
Mode)、400kHz(Fast Mode)、乃至3.4MHz(High Speed
Mode),相对的SMBus就很拘限,最慢不慢於10kHz,最快不快於100kHz。很明显的,I2C与SMBus的交集运作频率即是10kHz?100kHz间。
  用於笔记型电脑的电池管理或PC组态管理、用电管理的SMBus,很容易体会不需要更高运作频率的理由,只要传递小资料量的监督讯息、控制指令本就不用过於高速,而朝向广遍运用的I2C自然希望用更高的传输以因应各种可能的需求。然而大家可能会疑惑,为何SMBus有最低速的要求?何不放宽到与I2C相同的毫无最低速限呢?
  SMBus一定要维持10kHz以上的运作时脉,主要也是为了管理监控,另一个用意是只要在保持一定传速运作的情况下加入参数,就可轻松获知汇流排目前是否处於闲置(Idle)中,省去逐一侦测传输过程中的停断(STOP)信号,或持续保有停断侦测并辅以额外参数侦测,如此对汇流排闲置后的再取用会更有效快速。
传速要求之后还有资料持留时间(Data Hold
Time)的要求,SMBus规定SMBCLK线路的准位下降后,SMBDAT上的资料必须持续保留300nS,但I2C却没有对此有相同的强制要求。类似的,SMBus对介面被重置(Reset)后的恢复时间(Timeout)也有要求,一般而言是35mS,I2C这方面亦无约束,可以任意延长时间。相同的SMBus也要求无论是在主控端(Master)或受控端(Slave),其时脉处於Lo准位时的最长持续时间不得超越限制,以免因为长时间处在Lo准位,而致收发两端时序脱轨(失去同步,造成后续误动作)。
  还有,I2C与SMBus在准位的上升时间、下降时间等也有不同的细部要求,此点必要时也必须进行确认,或在验证过程中稍加留意。
  ▲图说:Smart
Battery或ACPI的实现、监督、与操控,最底层都需要SMBus(圈处)作为后援,图为简易的多组式智慧型电池系统,图中有Smart
Battery A、B两组电池。(图/SBS-Forum.org)
  「已妥」与「未妥」机制的强制性差别
  不单是电气、时序有别,更高层次的协定机制也有不同。在I2C中,主控端要与受控端通讯前,会在汇流排上广播受控端的位址资讯,每个受控端都会接收到位址资讯,但只有与该位址资讯相切合的受控端会在位址资讯发布完后发出「已妥」的回应(Acknowledge;ACK),让主控端知道对应的受控端确实已经备妥,可以进行通讯。但是,I2C并没有强制规定受控端非要作出回应不可,也可以默不作声,即便默不作声,主控端还是会接续工作,开始进行资料传递及下达读/写指令,如此的机制在一般运用中还是可行,但若是在一些即时(Real
Time)性的应用上,任何的动作与机制都有一定的时限要求,这种可有可无式的回应法就会产生问题,可能会导致受控端无法接收资讯。
  相同的情形,在SMBus上是不允许受控端在接收位址资讯后却不发出回应,每次都要回应,为何要强制回应?其实与SMBus的应用息息相关,SMBus上所连接的受控装置有时是动态加入、动态移除的,例如换装一颗新电池,或笔记型电脑接上船坞埠等,如果接入的装置已经改变却不回应,则主控端的程式所掌握的并非是整体系统的最新组态,就会造成误动作。
  类似的情形也适用於ACPI,PC机内机外经常有一些装置可动态增入、移除,如机内风扇、外接印表机等,这些也一样该强制对主控端广发的位址资讯作出完整回应。
  位址动作方面有异,资料传输方面也有异。在I2C方面,Slave虽然对Master所发出的位址作出回应,但在后续的资料传递中,可能因某些事务必须先行处理、因应而无法持续原有的传输,这时候Slave就要对Master发出「未妥」的回应(Not
Acknowledge;NACK),向Master表示Slave正为他务忙碌中。
  而SMBus方面,与I2C相同的,会以NACK的回讯向Master表达Slave尚未收妥传递的资讯,但是SMBus的Slave会在后续的每个Byte传输中都发出NACK回讯,这样设计的原因是因为SMBus没有其他可向Master要求重发(Resend)的表示法。更直接说就是:NACK机制是SMBus标准中的强制必备,任何的讯息传递都很重要,不允许有漏失。
  ▲图说:I2C在完成一段位址或资料资讯的传输后,受接端可发出讯息收妥(ACK)、未妥(NACK)的回应,SMBus也具相同的机制,但由於应用之故有更强制的回应要求。(图/Semiconductors.Philips.com)
  传输协定的子集、超集
  互动知会机制上有强制与否的差别,协定方面也是。SMBus的通讯协定与协定中所用的讯息格式,其实只是取自I2C规范中,对於资料传输格式定义中的子集合(Subset)而已。所以,如果将I2C与SMBus交混连接,则I2C装置在存取SMBus装置时,只能使用SMBus范畴的协定与格式,若使用I2C的标准存取方式反而无法正确存取。
  另外,I2C规范中有一种称为「General
Call」的广呼方式,当发出「0000000」的位址资讯后,所有I2C上的Slave装置统统要对此作出反应,此机制适合用在Master要对所有的Slave进行广播性讯息更新与沟通上,是一种总体、批次的运作方式。
  SMBus一样有General
Call机制,但在此之外SMBus还多了一种特用的ALERT(警讯)机制,不过这必须於时脉线与资料线外再追加一条线(称为:SMBSUS)才能实现,ALERT虽名为警讯但其实是中断(Interrupt)的用意,Slave可以将SMBSUS线路的电位拉低(ALERT#,#表示低准位有效),这时就等於向Master发出一个中断警讯,要求Master尽速为某一Slave提供传输服务。Master要回应这个服务要求,是透过I2C/SMBus的时脉线与资料线来通讯,但要如何知道此次的通讯只是Master对Slave的一般性通讯?还是特别针对Slave的中断需求而有的服务回应?
  这主要是透过Master发出的位址资讯来区别,若为回应中断的服务,位址资讯必然是「0001100」,当Slave接收到「0001100」的位址资讯,就知道这是Master特为中断而提供的服务通讯。因此,韧体工程师须留心,规划时必须让所有的Slave都不能占用「0001100」这个位址,以供ALERT机制运用(当然!若现在与未来都不会用上ALERT机制则可尽管占用)。事实上各种进阶的规范标准(如Smart
Battery、ACCESS.bus、VESA
DDC等)都在I2C的短定址中订立了一些为自用而保留的位址,这在最初设计与定义时就该有所留意,以免因先行占用而导致日后须改写韧体的麻烦。
  补充提醒的是,SMBSUS一样是开集极外加提升电阻的线路,所以有一个Slave将电位拉下后,其余Slave侦测到电位被拉下,表示已有Slave正在与Master进行中断需索与回应服务,须等待抢到中断服务权的Slave确实被服务完毕,重新将SMBSUS释放回高准位后,才能持续以「看谁能先将线路准位拉低?」的方式来争取中断服务。
  最后,若有进一步兴趣的读者,笔者建议可参考两份资料:
  ▲图说:MAXIM公司的MAX6641晶片之典型应用方式,图左为温度感测电路,图右上为风扇转速控制电路,图右圈处即是SMBus介面电路。(图/MAXIM-IC.com)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 i2c是同步还是异步 的文章

 

随机推荐