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;  
}  

 

posted on 2018-02-27 21:29  米兰达莫西  阅读(1445)  评论(0编辑  收藏  举报