收藏 分销(赏)

SMBus与I2C总线的区别.doc

上传人:a199****6536 文档编号:3560672 上传时间:2024-07-09 格式:DOC 页数:4 大小:112KB 下载积分:5 金币
下载 相关 举报
SMBus与I2C总线的区别.doc_第1页
第1页 / 共4页
SMBus与I2C总线的区别.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
. SMBus与I2C总线的区别 The I²C bus and the SMBus are popular 2-wire buses that areessentially compatible with each other. Below,significantdifferences between the two buses.   I²C SMBus Timeout No Yes Minimum Clock Speed DC 10kHz Maximum Clock Speed 100kHz (400kHz and 2MHz also available) 100kHz VHIGH 0.7 × VDD, 3.0V Fixed 2.1V VLOW 0.3 × VDD, 1.5V Fixed 0.8V Max I 3mA 350µA Clock Nomenclature SCL SMBCLK Data Nomenclature SDA SMBDAT General Call Yes Yes Alert# No Yes SMBus与I2C的差别      SMBus与I2C总线之间在时序特性上存在一些差别。首先,SMBus需要一定数据保持时间,而 I2C总线则 是从内部延长数据保持时间。SMBus具有超时功能,因此当SCL太低而超过35 ms时,从器件将复位正在进行的通信。相反,I2C采用硬件复位。SMBus具有一种警报响应地址(ARA),因此当从器件产生一个中断时,它不会马上清 除中断,而是一直保持到其收到一个由主器件发送的含有其地址的ARA为止。SMBus只工作在从10kHz到最高100kHz。最低工作频率10kHz是由SMBus超时功能决定的 (1)SMBus是一种二线制串行总线,1996年第一版规范开始商用。它大部分基于I2C总线规范。和 I2C一样,SMBus不需增加额外引脚,创建该总线主要是为了增加新的功能特性,但只工作在100KHZ且专门面向智能电池管理应用。它工作在主/从模式:主器件提供时钟,在其发起一次传输时提供一个起始位,在其终止一次传输时提供一个停止位;从器件拥有一个唯一的7或10位从器件地址。       SMBus与I2C总线之间在时序特性上存在一些差别。首先,SMBus需要一定数据保持时间,而 I2C总线则是从内部延长数据保持时间。SMBus具有超时功能,因此当SCL太低而超过35 ms时,从器件将复位正在进行的通信。相反,I2C采用硬件复位。SMBus具有一种警报响应地址(ARA),因此当从器件产生一个中断时,它不会马上清除中断,而是一直保持到其收到一个由主器件发送的含有其地址的ARA为止。SMBus只工作在从10kHz到最高100KHZ。最低工作频率10kHz是由SMBus超时功能决定的。 (2)参照i2c时序图,才用smbus总线完成对应读写函数。 A,mma7660   static int mma7660_write_register( const u8 subAddress, u8 *bufP ) {       int ret;       unsigned long flags;       spinlock_t *lock = get_i2c_lock();       if( g_client == NULL || lock == NULL) /* No global client pointer? */              return -1;       spin_lock_irqsave(lock,flags);       ret =  i2c_smbus_write_byte_data(g_client, subAddress, *bufP);  //写一个字节的数据       spin_unlock_irqrestore(lock, flags);       return ret; } static int mma7660_read_register( const u8 subAddress, u8 *bufP ) {        int ret = 0;        unsigned long flags;          spinlock_t *lock = get_i2c_lock();        if( g_client == NULL || lock == NULL) /* No global client pointer? */              return -1;          spin_lock_irqsave(lock,flags);        g_client->flags|=I2C_M_NOSTOP;  //注意写两个器件地址之间的SR,中间没有STOP,相当于重发。所以要置标志        ret = i2c_smbus_write_byte(g_client, subAddress);   //写一次写命令地址,及子地址        if(ret){              printk("mma7660_read_register read error/r/n");              spin_unlock_irqrestore(lock, flags);              return ret;        }        ret = i2c_smbus_read_byte(g_client);//开始读,发个读命令地址        g_client->flags&=(~I2C_M_NOSTOP);   //使用完后清该标志。此标志用不用与具体实例有关,有的器件两种都支持        if (ret >= 0) {              *bufP = ret;        }        spin_unlock_irqrestore(lock, flags);        return ret; }   B,DA9034 写时序与7660是相同的;读时序也基本一样,只不过中间的重发开始是可有可无,都支持。 int micco_read(u8 reg, u8 *pval) {        int ret;        int status;        unsigned long flags;        spinlock_t *lock = get_i2c_lock();        if (g_client == NULL || lock == NULL) /* No global client pointer? */              return -1;        spin_lock_irqsave(lock, flags);        ret = i2c_smbus_read_byte_data(g_client, reg);        if (ret >= 0) {              *pval = ret;              status = 0;        }        else               status = -EIO;        spin_unlock_irqrestore(lock,flags);        return status; } 该smbus总线函数与i2c总线的缺点在于,不能带读数据的数据长度参数。 4 / 4
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服