访问SMBus设备

article/2025/9/14 15:45:41

使用SMBus访问温度传感器,并控制smart Fan

首先聊聊SMBus的访问方法
硬件上:两条线SMBus Clock和Data信号
在这里插入图片描述
当clock信号为高时data信号才有效,data信号下降,意味着Start。data信号上升,意味着Stop。开始后会发送九位,包括八位数据,一个应答位,如下图,
在这里插入图片描述
从示波器上可以看到(蓝为clock,黄为data),可以看到发送的为01011100,第9为应答位为高,即NACK,设备无响应。最后为stop。
在这里插入图片描述
这样就可以通过示波器知道SMBus设备是否响应。
软件上:在SMBus基地址后续寄存器有状态、访问方式、命令、从地址、数据等寄存器,这些寄存器都可查看datasheet。访问方式即为:
1、清状态(清完后为0x40)
2、写从地址(从地址最后一位1为读,0为写)
3、写数据(读不用)
4、设置访问方式(字节、字、双字访问)
5、等待应答(ACK状态寄存器变0x42,NACK则为0x44)
6、读数据(写不用)
举个栗子:下面代码为SMBus访问内存SPD信息

#include <stdio.h>
#include <conio.h>
#include <dos.h>/*register add*/
#define SMB_Base_Add 0xf000/*read SPD by byte*/
#define HST_STS 0x00
#define HST_CNT 0x02
#define HST_CMD 0x03
#define XMIT_SLVA 0x04
#define HST_D0 0x05void D_delay();
int SMB_ACK();
int Register_Configuration(int SPD_add);void main()
{int data,k;printf("  ");for(k=0x0;k<=0xf;k++){printf("  %02x",k);}printf("\n");for(k=0x0;k<=0xff;k++){if(k%16==0){printf("\n");printf("%02x",k);}data = Register_Configuration(k);/*read data*/printf("  %02x",data);}getch();
}
int Register_Configuration(int SPD_add)
{int state,data;outportb(SMB_Base_Add|HST_STS,0xFE);/*clear */outportb(SMB_Base_Add|XMIT_SLVA,0xA1);/*slave/SPD base address *///1 is read,0 is write/* last bit is w/r,must be 1 */outportb(SMB_Base_Add|HST_CMD,SPD_add);/*offset*/outportb(SMB_Base_Add|HST_CNT,0x48);/*byte read*/D_delay();	·state = SMB_ACK();if(state!=0){return 0xff;}data = inportb(SMB_Base_Add|HST_D0);D_delay();return data;}
void D_delay()
{int i;for(i=100;i>0;i--);
}
int SMB_ACK()                     /*check smbus ready*/
{int state_A,state_B,i,s=0;for(i=0;i<0x80;i++)               /*circle until ACK = 0*/{state_A = inportb(SMB_Base_Add|HST_STS);D_delay();outportb(SMB_Base_Add|HST_STS,state_A);D_delay();state_B = state_A;state_B = state_A&0x02;if(state_B!=0)          /*   INTR = 1 BIT1    */{goto ret;}state_B = state_A;state_B = state_B&0xbf;     /*  INUSE_STS = 0   BIT6   */if(state_B==0){goto ret;}state_B = state_A;state_B = state_B&0x04;      /*  DEV_ERR = 1(Invalid Command/Time-out/Unclaimed Cycle)    BIT2    */if(state_B){break;}}s = 1;ret:return s;}

下面为温度传感器并能智能控制风扇的芯片EMC2103-1,该芯片slave address为0x5c
在这里插入图片描述
DP、DN接thermal,TRIP_SET引脚由硬件接多大电阻决定shutdown的温度,使用smbus访问
有四种方式控制(查看datasheet)
1、PWM直接控制风扇,不根据温度,EN_ALGO、LUT_LOCK写0,无需配置Look Up Table,直接写Fan Driver Setting
2、FSC:Fan Speed Control Mode, EN_ALGO写1、LUT_LOCK写0,
3、PWM Setting w/LUT Mode
首先配置LUT,八个温度设置和八个改温度下对应风扇PWM设置,然后LUT_LOCK写1,RPM/PWM写1。注:LUT_LOCK置1时无法改写LUT
在这里插入图片描述
代码如下,注:如果无法连续写,应该是状态没清掉

void Smbus_delay()
{int i,j;for(i=0;i<256;i++)for(j=0;j<256;j++)IoWrite8(0x400+0x00,0xdf);
}
void Smbus_Write(UINT8 address,UINT8 value)
{IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x04,0x5c);IoWrite8(0x400+0x03,address);IoWrite8(0x400+0x05,value);IoWrite8(0x400+0x02,0x48);IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x00,0xdf);IoWrite8(0x400+0x00,0xdf);
}
void main()
{Smbus_Write(0x50,0x00);Smbus_delay();Smbus_Write(0x51,0x44);Smbus_delay();Smbus_Write(0x52,0x30);Smbus_delay();Smbus_Write(0x56,0x66);Smbus_delay();Smbus_Write(0x57,0x35);Smbus_delay();Smbus_Write(0x5b,0x88);Smbus_delay();Smbus_Write(0x5c,0x3e);Smbus_delay();Smbus_Write(0x60,0xaa);Smbus_delay();Smbus_Write(0x61,0x42);Smbus_delay();Smbus_Write(0x65,0xbb);Smbus_delay();Smbus_Write(0x66,0x48);Smbus_delay();Smbus_Write(0x6a,0xdd);Smbus_delay();Smbus_Write(0x6b,0x4e);Smbus_delay();Smbus_Write(0x6f,0xee);Smbus_delay();Smbus_Write(0x70,0x50);Smbus_delay();Smbus_Write(0x74,0xff);Smbus_delay();Smbus_Write(0x75,0x55);Smbus_delay();Smbus_Write(0x50,0x30);Smbus_delay();
}

http://chatgpt.dhexx.cn/article/XyQHK76Z.shtml

相关文章

SMBUS通信波形分析

SMbus通信协议 1.特性 SMBus是 System Management Bus 的缩写&#xff0c;译为系统管理总线&#xff0c;SMBus是一种二线制串行总线&#xff0c;1996年第一版规范开始商用。它大部分基于I2C总 线规范。和 I2C一样&#xff0c;SMBus不需增加额外引脚&#xff0c;创建该总线主要…

DSP SMBus总线通信

参考文档&#xff1a;System Management Bus (SMBus) Specification Version 3.0.pdf 简介&#xff1a; SMBus&#xff08;System Management Bus&#xff09;于1995年被 Intel 提出&#xff0c;应用于低速率通信&#xff0c;是一种二线制串行总线&#xff0c;该总线大部分基…

linux i2c smbus驱动

目录 目录 数据收发流程 驱动层 收发接口 驱动层注册 smbus控制器 i2c控制器 协议接口使用 总体流程 数据收发关键数据结构 使用示例--eeprom的读写 使用示例--smbus的读写接口 数据收发流程 驱动层 收发接口 首先了解&#xff0c;驱动层向协议&#xff08;算法&a…

初学 SMBus

(这篇主要对象为固件工程师&#xff0c;简单介绍SMBus的一些基本概念而已) 概述 System Management Bus (简称SMBus或是SMB) &#xff0c;是1995年由Intel提出的&#xff0c;用来访问主机板上的设备(EEPROM、温度感测器、电压感测器等) 并收集相应的资讯(SPD、温度、电压、版…

SMBus协议

SMBus协议 文章目录 SMBus协议参考资料&#xff1a;一、 SMBus是I2C协议的一个子集二、 SMBus协议分析2.1 symbols(符号)2.2 SMBus Quick Command2.3 SMBus Receive Byte2.4 SMBus Send Byte2.5 SMBus Read Byte2.6 SMBus Read Word2.7 SMBus Write Byte2.8 SMBus Write Word2.…

系统管理总线(SMBus)介绍

SMBus介绍 系统管理总线协议概要系统管理总线 关键标记表SMBus接口函数1. SMBus Quick Command2. SMBus接收字节函数&#xff1a;i2c_smbus_read_byte()3. SMBus发送字节函数&#xff1a;i2c_smbus_write_byte()4. SMBus读取字节函数&#xff1a;i2c_smbus_read_byte_data()5. …

SMBus学习记录

SMBus学习记录 注&#xff1a;本文基于对于smb3.0 spec的学习总结。更多时序要求需要查阅spec。 SMBus 是 System Management Bus 的缩写&#xff0c;译为系统管理总线&#xff0c;SMBus是一种二线制串行总线&#xff0c;1996年第一版规范开始商用。它大部分基于I2C总线规范。…

SMBus通信,与IIC通信的差异

SMbus总线 SMBus是System Management Bus的缩写&#xff0c;它是一种简单的串行通信总线&#xff0c;用于连接计算机上的系统管理芯片和其他设备&#xff0c;如电池、风扇、温度传感器等。SMBus是由英特尔公司开发的&#xff0c;它基于I2C总线协议&#xff0c;但是增加了一些额…

【Linux】特别篇--SMBus 协议

【Linux】特别篇--SMBus 协议 一、SMBus 简介二、SMBus 与 I2C 区别三、SMBus协议分析3.1 符号含义3.2 SMBus Quick Command3.3 SMBus Receive Byte3.4 SMBus Send Byte3.5 SMBus Read Byte3.6 SMBus Read Word3.7 SMBus Write Byte3.8 SMBus Write Word3.9 SMBus Block Read3.…

SMBUS的介绍与访问

博文是为了总结自己在bios学习上面的点点滴滴&#xff0c;并且加深印象&#xff0c;由于本人水平有限&#xff0c;难免存在不足之处&#xff0c;望指正&#xff0c;同时感谢CSDN提供的平台。本文主要介绍的是SMBUS。 1 SMBUS的简介 特点&#xff1a; SMBUS&#xff0c;System …

java完整开发环境搭建_如何搭建一个完整的Java开发环境

这篇文章主要教大家如何搭建一个完整的Java开发环境&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 作为一个Java程序员&#xff0c;配置一个java开发环境是必备的技能&#xff0c;今天给广大菜鸟初学者补上一课。环境的配置&#xff0c;大概就分三个…

1.1-java开发环境搭建

java开发环境搭建 回到第一章&#xff1a;目录 文章目录 java开发环境搭建前言一、下载jdk1.安装前检查 二、安装jdk1.安装2.配置环境变量3.验证安装 前言 本节内容是搭建java的开发环境。 分为三步&#xff1a;下载jdk&#xff1b;安装jdk&#xff1b;配置环境变量&#xff…

Windows Java开发环境搭建

1.下载安装配置 JDK 8 打开 https://developer.oracle.com/找到 Java8 下载位置&#xff0c;点击下载链接&#xff0c;下载JDK 8 下载后如下图所示&#xff0c;双击安装一直选择选择下一步 2.下载安装 Eclipse点击官网下载 Eclipse下载后就是一个压缩包&#xff0c;只需解压即…

基于Centos7的Java开发环境搭建

基于Centos7的Java服务器搭建 前提&#xff1a;Centos常用命令安装 1. 安装wget yum -y install wget2. 安装gcc yum -y install gcc1. Centos7下的防火墙操作 systemctl status firewalld # 查看防火墙状态 systemctl start firewalld # 开启防火墙 systemctl stop fi…

Java开发环境的搭建与配置

Java开发环境的搭建与配置 1、JDK、JRE、JVM的关系 2、JDK的下载&#xff1a;http://java.sun.com 3、JDK安装&#xff1a;可以自定义安装路径 4、JDK环境变量配置&#xff1a; 鼠标右击【计算机】->【属性】->【高级系统设置】->【高级】->【环境变量】 系统变…

Java开发环境搭建实践

前言 刚刚弄完python的环境搭建&#xff0c;今年打算也要好好学习Java&#xff0c;所以把Java的环境弄起来 搭建过程 jdk下载和安装 下载 官网&#xff1a;Oracle 甲骨文中国 | 云应用和云平台 打开官网 点击产品后下拉找到Java点进去。 下载Java 我就下载最新的jdk把…

程序员福音 【完整的Java开发环境搭建】 系列篇

原文地址 BY Jason 文章目录 原文地址Java开发环境搭建统一问题解决&#xff08;更新中&#xff09;1. vim常用操作命令2. 关于Linux防火墙开放端口问题 环境安装目录&#xff08;更新中&#xff09;Docker安装容器安装SSHJDK安装MySQL安装Redis安装RabbitMQ安装 Java开发环境…

Windows下Java开发环境搭建

本文以Win7操作系统解压版Eclipse安装版JDK1.7为例&#xff0c;展示如何搭建初级Java开发环境。 第一步&#xff1a;根据自己电脑的操作系统的位数选择相应版本的安装包进行安装&#xff1a; &#xff08;1&#xff09;查看自己电脑操作系统位数&#xff1a;找到“计算机”图标…

Java开发环境搭建详细教程(JDK+Eclipse)

前言 学习 Java 编程的第一件事情就是把开发环境搭建起来&#xff0c;这样才能开始快乐的编程学习之旅。然而&#xff0c;很多萌新经常因为种种问题无法搭建好开发环境&#xff0c;导致自己信心受挫&#xff0c;学习兴趣和激情也大减&#xff0c;甚至因此彻底放弃学习 Java 编…

【Java编程进阶】Java开发环境搭建

文章详细讲述了 Java 开发环境的搭建,编写并运行第一个 Java 程序,为后续的 Java 学习做了准备工作。 推荐学习专栏:Java编程进阶之路 文章目录 1. 为什么安装JDK?2. JDK的下载安装3. 配置环境变量4. 第一个Java程序1. 为什么安装JDK? 什么是JDK? JDK是java软件开发包,…