By LightSeed
2009-7-18
SMBus 是 System Management Bus 的缩写,是1995年由Intel提出的,应用于移动PC和桌面PC系统中的低速率通讯。它主要是希望通过一条廉价并且功能强大的总线(由两条线组成),来控制主板上的设备并收集相应的信息。
SMBus 为系统和电源管理这样的任务提供了一条控制总线,使用 SMBus 的系统,设备之间发送和接收消息都是通过 SMBus,而不是使用单独的控制线,这样可以节省设备的管脚数。
使用 SMBus,设备还可以提供它的生产信息,告诉系统它的型号,部件号等,针对挂起事件保存它的状态,报告不同类别的错误,接收控制参数,并返回它的状态等。
SMBus的数据传输率为100kbps,虽然速度较慢,却以其结构简洁造价低廉的特点,成为业界普遍欢迎的接口标准。Windows中显示的各种设备的制造商名称和型号等信息,都是通过SMBus总线收集的。主板监控系统中传送各种传感器的测量结果,以及BIOS向监控芯片发送命令,也是利用SMBus实现的
SMBus器件存在现有7层OSI网络模型中的前3层,即物理层,数据链路层和网络层。
SMBus最初的目的是为智能电池,充电电池和与其他系统通信的微控制器之间的通信链路而定义的。SMBus也被用来连接各种设备,包括电源相关设备,系统传感器,EEPROM通讯设备等等。
SMbus设备,他们的逻辑连接用图来说明比较好。见图1,SMbus 连接的设备他们可以有各自的
图1 设备的逻辑连接示意图
这样连接以来,bus上的从设备(slave device)就可以接受主设备(master)的数据(data),或者是可以自己提供数据给master。
根据smbus spec2.0协议,在任何时候,总线上只有一个master,如果有多个设备想要成为master来控制总线的话,那么就会进入仲裁。细节的话,如果您有兴趣就看看spec吧。^.^
在这个层里,主要是讲了一些电气特性呀什么的,目前来看我先过滤掉了。大致的意思SMBUS 2.0希望能运行在至少两种环境中。一种就是low-power环境,比如说电池这种设备。另一种就是能够可靠地工作在高噪声的环境中(higher-noise)比如说,PCI插卡。这两中设备的存在,而且smbus也都要去处理,那么他们都是直接连接在bus上的吗?答案当然是否定的。它们中间是通过了一个适配桥的设备来连接的。如果您有兴趣可以看看spec2.0的附录B,我想对您的理解很有帮助。物理层的东西我就不说太多了,那个毕竟不是我能做到的。
一些信息的传输都是1和0编码的,那么我们只要掌握了1和0在SMBUS上的传输过程,那么传输一个字节还会很难去理解么?
首先我们来看看传输过程的图解,见图2
图2 位的传输
从图2中我们可以清楚地看到,当clock处于high的时候我们的数据是可以传输的,而当我们的clock处于low的时候我们的数据可以在这个时间段内发生改变。那么随着clock的节拍我们就可以把1或者0一个一个地传输出去了。
单纯语言来说,我觉得晦涩又难懂,索性就不说了,让我们来结合图3看看在SMBUS上传输数据的开始和终止条件是什么呢?
图3 SMbus传输的开始和终止条件
当clock为high时,假如data线上有下降沿,那么这构成了开始传输的条件,总线也会准备好要传输数据了!
当clock为high时,假如data线上有上升沿,那么这构成了终止传输的条件,总线也会准备结束传输数据了!
经过上面三点的对开始,终止,传输位的说明,那么我们来看看SMBUS传输byte的过程。同样让我们来结合图看看。见图4
图4 字节的传输过程示意
见红色方框处,在我们任何一个字节(1 byte=8 bits)传输好了以后,SMBUS上总会紧随一个ACK bit。注意这是和I2C的不同之处哦。而且每个字节的传输都是从高位(MSB)先传。
在数据链路层中,还有一个事情要做就是仲裁,不过机制比较简单,就是逐一比较每个bit。直到某个device获得BUS控制权为止。
应该说这个层是我接触做多的层,在这个层里我着重说一说几种传输方式中的read by byte和read by block。在这篇文章我就只说说原理性的东西,而对它们的实践放在了后面的SPD和clock generator这两个部分中去实践。如果您对SMBUS的操作有兴趣的话,看看我后面的两篇文章也许是个有趣的经历。
言归正传,我们的master和slave device之间要实现通信,(我们可以看看图1,总线上连接了N多的设备,那么不我随便挑一个slave来通信吧。您说对么?)在spec中就有address这么一说,关于address我也不想多说了,它其实是一个在BUS访问的是提供的一个ID,而在我们的业界里某些设备都是有某些的ID的。比如说clock generator,内存等等。所以,这里不是我们的重点。
4.2.4.1 Read by byte
我们来先定义一下一些特殊的表示方法,见图5
图5 一些符号的定义
老方法我们来看看spec是怎么定义的,结合图形我们一起来分析一下。Read by byte的时候总线上的信息,见图6
图6 当read byte时bus上的信息
从图6中我们可以清楚地看到,当我们要读数据的时候(read data)总线上会有个重复的start过程,这个是于write的过程是不一样的。(您有兴趣的话可以去看看spec中的定义。)其实我们可以这样理解,第一个start是为了给slave device下命令,而第二个start是为了读取数据而又重新开始的。我们来详细看看图6中的第一个slave address是7bits,最后一位是Wr。而第二个slave address紧跟的第8bit是Rd。我们在编程的时候也会有相应地表现的。详细请看SPD的操作。
4.2.4.2 Read by block
呃。。。不用说了,外甥打灯笼(照旧)我们来看看总线上的动作,见图7
图7 block read时总线上的过程
这下让我来看着图7,一口一口说出总线都做了什么。
第一步:我们先把slave address放到总线上,(当然是通过写的动作啦。当然我们在时间的操作的时候,是不用自己来实现图7中的高低电平的。起码以前我开始学习的时候就一直都以为,我们工程师要亲自把什么0101…的东西放在总线上。>.< 当时我就抓狂了。不过后来才晓得原来我们有个controller来帮我们做了这些事情。那么我们平时接触的ICH系列的南桥就必定会有这么一个controller,它的名字叫做SMBUS controller。在这个controller中,有相应的port给我们来放这个slave address。Command,data等也是有专门的port给我用的,所以你就不用像我这样抓狂了J)
第二步:再写入我们要操作的命令。(比如说read还是write?byte还是block?等等)
第三步:controller会帮我们再repeat一次start(与read by byte是一样的),这个时候是要说明是要读取数据了哦,然后我们就可以进行第四步了。
第四步:那么我们要读多少个byte呢?这个是host最想关心的,不过这点有这样一个机理,当slave有20个byte要传输的时候,那么在counter这里就是20。(主要这是不用我们去操作的哦,在编程的时候,我们只需要清零它即可,因为至于究竟要读多少个byte,我们的controller会自己帮我们做好的。切忌我们block一次最多只能读取32个byte,如果是超过了的话那么你自己就要想好办法了哦。)不过不多读几个byte,然怎么叫做read block呢?就是因为可以一下子读出了N多的bytes。
那么上面就是我想要重点介绍的,在这篇文章中,我着重从原理上去和大家探讨了一下SMBUS的东西。而且重中之重又是我们操作读取设备的信息。那么后面两篇文章我会用SPD和clock generator来做实际例子和大家探讨一下。希望大家指正,因为我也是今天写这篇文章的时候才把smbus中以前觉得似是而非的东西搞清楚了。看来写总是能够让人学会很多的。(毕竟担心写出来的东西错的太离谱了,尽量想写出来都是对的J)