[资料分享] i2c总线问题——起始停止条件

LSJ   2008-7-8 16:01 楼主
大家好,现在学习实践I2C总线方面的知识。这个过程中遇到的问题还希望能够得到大家的指教,谢谢!

下面这段话摘自“I2C总线规范”,
“在SCL线是高电平时SDA线从高电平向低电平切换,这个情况表示起始条件。
在SCL线是高电平时SDA线由低电平向高电平切换表示停止条件。
起始和停止条件一般由主机产生。总线在起始条件后被认为处于忙的状态在停止条件的某段时间后总线被认为再次处于空闲状态。
如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件十分简便。但是没有这种接口的微控制器在每个时钟周期至少要采样SDA线两次来判别有没有发生电平切换。
其中红色部分的文字,我不是很明白,不明白这个接口是指什么呢?

谢谢大家!

回复评论 (21)

参考原文

这是I2C  Specificaion 上摘抄的原文(原文P9),看一下可能会更清楚:
Detection of START and STOP conditions by devices connected to the bus is easy if they incorporate the necessary interfacing hardware. However, microcontrollers with no such interface have to sample the SDA line at least twice per clock period to sense the transition.
这里incorporate翻译成具有,具备,含有可能会好些,试着直译如下,我的英语不好请指教:

如连接在总线上的器件具有这种必要的接口硬件,就可以容易地检测起停条件;然而,不具有这类接口的微处理器就必须在每个时钟周期内对SDA进行至少两次采样来检测这种电平变化。

改译:

连接在总线上的器件如果具有这种必要的接口硬件,就会容易地检测起停条件;而不具有这类接口的微处理器就在每个时钟周期内对SDA进行两次以上采样来检测这种电平变化,(进而作起停判断)。

红字答红字:这个接口所指的就是用来监视SDA/SCL电平变化,从而判断起停的那部分逻辑电路.在具有(兼容)片间接口功能的器件上都会明确标注.

顺便,全文上传这个规范原文,供参考.

THE I2C-BUS SPECIFICATION.pdf (303.01 KB)
(下载次数: 54, 2008-7-9 02:20 上传)


[ 本帖最后由 xiaoxif 于 2008-7-9 02:22 编辑 ]
点赞  2008-7-9 02:12

回复 xiaoxif 的帖子

非常感谢!我没有规范原文,现在对照着中文译文看,有收获。
我用的是新华龙的8位单片机C8051F410.学习单片机整半年,感觉还没有入门。

这个芯片的SMBus总线与I2C总线是兼容的。
关于I2C我还有问题:规范中提到的 the necessary interfacing hardware,(P9)是不是就是410datasheet中SMBus原理框图(P191)的SMBUS控制逻辑呢?这个控制逻辑可以自动检测到SDA电平的变化吗?
如果SMBUS控制逻辑不是这样的接口,那么该微控制器就要自己去检测,怎么检测呢?
我觉得看这些原理图我并不能够很明白单片机的内部结构,于是就有很多的疑问。
再次感谢你啊!这么认真的回复。
点赞  2008-7-9 11:47
那段红字没有前后文的话真要看得晕死,其实从一个具体例来看可能比较容易理解。
1、如图,注意上下对照SCL和SDA两个信号: 数据传输时,SDA的变化都是在SCL“低”的期间发生的。假如出现例外,即在SCL“高”的期间SDA有变的话,那么就是启/停标志了:SDA='H'→'L'=起始,SDA='L'→'H'=停止。简单吧?
2、因为SDA的变化必须在SCL='H'的期间完成,所以说在该期间至少要看SDA两次,才能检测到它的变化。
  • IIC.GIF
点赞  2008-7-9 13:49

5楼 LSJ 

回复 仙猫 的帖子

你好
你的描述很生动也很容易明白。

因为电平有变化,所以至少要检测两次的。但,我还有一点不是很明白:
I2C总线规范中的这句话:“Detection of START and STOP conditions by devices connected to the bus is easy if they incorporate(具有、具备、含有) the necessary interfacing hardware. However, microcontrollers with no such interface have to sample the SDA line at least twice per clock period to sense the transition.
如果微控制器内部包含有必要的接口电路,是不是就不用微控制器去检测至少两次了呢?为什么呢?

我知道起停和数据传输的过程,但从没有像你这样比较深刻的去理解,把握住一些实质性的问题。所以,非常感谢你!
还希望大家多多指教!
点赞  2008-7-9 14:28

6楼 LSJ 

回复 xiaoxif 的帖子—关于"incorporate"这个英文单词

incorporate   v
to make (something) a part of a group or of something larger; include

把……合并;使并入;吸收;列入;包含

example: They incorporated her suggestions into their plans.
点赞  2008-7-9 14:37
这么理解好了:假如在电路里(微机或什么控制器内部也可以)有个在SCL='H'时有效的,用下降沿触发的锁存器,那么一下就能把IIC的“起始”标志捉住,用不着软件反复看了。
实际上如没有硬件的配合,光用软件去捕捉启/停标志是有点困难的,除非通信速度不快,并且双方约定好主机方面给丛机留有足够的检测时间;不过主机不会有这样麻烦的事,因为是它自己发的SCL,它让从机去检测自己却不需要干什么,用一个I/O口纯软件就能实现。这点,如果没实际做过的话恐怕得稍微想一想。
点赞  2008-7-9 15:06

8楼 LSJ 

回复 7楼仙猫 的帖子

你好,再次感谢,又清楚一些了。

“用一个I/O口纯软件就能实现”,这句话是不是说,用语言(比如汇编的位控制转移指令JB, JNB)去判断IO口的状态呢?

我的硬件知识几乎为0,所以,我能明白你说的思想,但原理我还需要有关书籍才能明白。
学生时代有些荒废了,呵呵
谢谢!
点赞  2008-7-9 16:16
主机方面因为是主动的,以自我为中心,不管3721发出去就可以了,程序简单得难以置信。比如发送“起始”的流程就是:
……
SDA置高阻;
等一会儿;
SCL置高阻;
等一会儿;
SDA置"低";
等一会儿;
SCL置"低";
……

这里的“等一会儿”是为了控制速度别太快,照顾点对方。第一次做的时候我也觉得别扭:这两条破语句咋能算程序?但反复看规程,确实这样就可以了,调试也没问题。:D
点赞  2008-7-9 16:56

回复 9楼仙猫 的帖子

void i_start(void)
{
SDA=HIGH;
delay();
SCL=HIGH;
delay();
SDA=LOW;
delay();
SCL=LOW;
delay();
}
上面这个程序在什么情况下应用呢?
我用的C8051F410芯片中有SMBUS控制逻辑,发送起始条件是只需要将SMB0CN寄存器中的STA位置1就可以了。
但是,这相对于需要自己控制时许而言差别在哪里呢?
是不是用硬件代替软件实现了一些功能呢?
谢谢
点赞  2008-7-9 17:36
这题恐怕俺答不好了,因为没看过C8051。(据说这个系列不错,想试着玩玩,但暂时时间排不上...)
不光为发送启/停位,一般说来,控制器会代替软件去完成那些繁琐的工作,比如:●字节传送——软件不必管每个bit了;●启/停标志的收/发;●总线冲突检测管理(如果需要的话);●校验错/超时错管理(如果需要的话);●没准控制器还带FIFO……,等等,控制器做完它的工作后还能向CPU发出中断请求,省得CPU老得心神不定查询这那的,节省大量的软件时间。
当然,如果通信数据量很小,CPU没带这样的控制器,又希望尽量压低成本的情况下,用纯软件做也是个不错的选择,因为不是很难。
点赞  2008-7-9 18:22

回复 6楼 的帖子

这个词的用法是在开发者的角度说的,他把xxx集成,或纳入到他的系统里,强调的他的过程;其实作为器件的用户,反倒要强调这个incorporate的结果=有了,具有,不绕嘴。这是我对这段文字的理解基础。
点赞  2008-7-10 11:22

回复 5楼 的帖子  理解I2C的特征很重要

Q:如果微控制器内部包含有必要的接口电路,是不是就不用微控制器去检测至少两次了呢?为什么呢?
A:不用了,因为它已经具有包括这种检测在内的所有逻辑功能了。

比对而言,如果用OSI说明(可能不那么准确),I2C标准不是OSI的物理层协议,即不是对bit的处理,建议“急转弯”到寄存器部分,在寄存器那个层次上去理解和把握I2C这种基于字节的主从结构的片间总线特点和通信过程。相信编程会迎刃而解的。

硬件处理(主要指上拉电阻)看看说明后核对原理图。

[ 本帖最后由 xiaoxif 于 2008-7-10 11:57 编辑 ]
点赞  2008-7-10 11:27

回复 板凳 的帖子

你说得191页的文字是不是这一段:

The SMBus is compliant with the System Management Bus Specification, version 2, and compatible with the I2C serial bus.

如果是这段文字,就说它的接口兼容于I2C,好像没有必要做什么测试.按照I2C规范的描述,这就意味着:

It is a device  which has  incorporated  the necessary interfacing hardware. So it can perform the detection of START and STOP conditions easily  

编程中注意寄存器部分的消化,因为这个口的通信及其控制(包括主从Master-Slave设备的设置)都是通过对相关寄存器的读写间接实现的.吃透寄存器是设计掌握单片机系统及其编程的重要基础.

至于这里的硬件图纸也是逻辑的,可缓消化.

[ 本帖最后由 xiaoxif 于 2008-7-10 11:46 编辑 ]
点赞  2008-7-10 11:44

回复 10楼 的帖子

没仔细看这段程序。但可以说“用不着”这样做,而且也是不对的。注意既然兼容,就是可以easy地去detact的,这样去做,不就不easy了吗?
其中原因,请参考我的其它留言。
点赞  2008-7-10 12:09

回复 11楼仙猫 的帖子

哦,要学会看一个芯片的datasheet。
需要应用一个功能的时候,反复看。自己现在的经验和积累,还不能够做到一看原理框图就能明白八九不离十。但我觉得,实践的多了,可能就可以了。

其实我很想知道,那个控制器在单片机内部究竟是什么?寄存器、存储器、==,究竟是什么样子的呢?
朋友告诉我,就是在硅板上刻出来的,是一种工艺。
慢慢来吧,以后有问题还会在麻烦大家的
哈~
点赞  2008-7-10 15:23

回复 12楼xiaoxif 的帖子

赞!
我觉得理解的很到位!有点翻译的味道了
我很喜欢英语中的翻译,但我的英语确实不好。恩,加油!

我感觉自己现在看单片机英文的资料会有困难。
应该怎么去提高呢?逼着自己只看英文不看中文?
我知道欲速则不达,而且英语也没有捷径可走,但还是忍不住提出了这个问题。
谢谢!
点赞  2008-7-10 16:02

回复 14楼xiaoxif 的帖子

非常非常感谢你!
关于这个接口电路问题,我想是不是可以这样理解呢:
这是集成在单片机内部的一个逻辑单元,是属于IC设计部分的,对于单片机用户而言,这是透明的。我们暂时只要知道“它”可以为我们省去一些软件编写工作。
我们现在的主要任务是深入了解相关寄存器,会应用寄存器了解单片机状态,从而控制单片机就可以了。


这是我的理解,希望指教。
谢谢!
点赞  2008-7-10 16:12

写的好!回复 17/18楼 的帖子

是这样的。

这是集成在单片机内部的一个逻辑单元,是属于IC设计部分的,对于单片机用户而言,这是透明的。我们暂时只要知道“它”可以为我们省去一些软件编写工作和大量的硬件逻辑设计


除上面的少许补充外,再说两句基于理解的话:

这就是单片机之所以为单片机的出发点与归宿。单片机之所以为单片机就是因为它incorporate了包括作为串行片间通信总线的I2C在内的本属于计算机系统的功能,例如Timer, Counter, Communications (UART etc.)等等。
从应用系统开发者角度看,这些功能则大都体现在那些专用寄存器上。因此:


“我们现在的主要任务是深入了解相关寄存器,会应用寄存器了解单片机状态,从而控制单片机(系统)就可以了。”

红色引自君之原文,原文中揉进去的黑字请参考。


[ 本帖最后由 xiaoxif 于 2008-7-11 03:54 编辑 ]
点赞  2008-7-11 03:43

回复 19楼xiaoxif 的帖子

谢谢您的鼓励与支持!
今后还望多多指点。
点赞  2008-7-11 08:47
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复