SMBUS编程访问
阅读了访问SMBUS的文档,有byte方式和block方式两种方式。
通过多次实操,了解了从SMBUS读取数据的详细过程。
编程实现如下:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <bios.h> #include <ctype.h> #include <dos.h> #include <time.h> #include <string.h> #define HST_STS 0x00 #define HST_CNT 0x02 #define HST_CMD 0x03 #define XMIT_SLVA 0x04 #define HST_D0 0x05 #define HST_D1 0x06 #define HOST_BLOCK_DB 0x07 #define AUX_CTL 0x0d unsigned long int get(); void main() { unsigned long int SMBaddr,Bus,Dev,Fun,Data; unsigned long int addr,offset,addr1,SMBaddr1,i,a; static unsigned long int Baseaddress; Baseaddress = 0x80000000; Bus = 0; Dev = 31; Fun = 3; offset = 0x20; addr = Baseaddress+(Bus<<16)+(Dev<<11)+(Fun<<8)+offset; SMBaddr = get(addr)&0x0000fffe; outportb(SMBaddr+HST_D0,0x00); outportb(SMBaddr+AUX_CTL,0x00); delay(100); outportb(SMBaddr+HST_STS,0x1e); delay(100); outportb(SMBaddr+XMIT_SLVA,0xd3); delay(100); outportb(SMBaddr+HST_CMD,0x00); delay(100); outportb(SMBaddr+HST_CNT,0x54); delay(100); a = inport(SMBaddr+HST_D0); printf("%lx\n ",a); for(i = 0x00;i<0x0a;i++) { outportb(SMBaddr+HST_STS,0xc1); Data = inport(SMBaddr+HOST_BLOCK_DB); printf("%02x ",Data); } /*}while(inport(SMBaddr+HST_STS)&0x03 == 0x02); }*/ outportb(SMBaddr+HST_CNT,0x16); getch(); } unsigned long int get(unsigned long int Addr) { unsigned long int data; asm mov dx,0xcf8 asm db 0x66 asm mov ax, Addr asm db 0x66 asm out dx,ax asm mov dx,0xcfc asm db 0x66 asm in ax,dx asm db 0x66 asm mov data,ax return data; }