?? smbus_m_t.c
字號:
///////////主機發送調試程序////////////////
////////Smbus_M_T.c/////////////////////////////////
#include "smbus.h"
#define S_AD_R 0x6f
#define S_AD_W 0x6e
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關配置,SMBUS配置到P0.0和P0.1上
XBR0 = 0x01;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x01;
//管腳輸出配置,P0口為開漏輸出,其中P0.6接上拉電阻,P0為數字輸入口
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用內部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(){
char i;
config();
smbus_cfg(0x40,0xf1,0x70);
/*
smbus使能,AA=0,SCL高電平和低電平超時禁止
smbus時鐘頻率為100khz
自身從機地址為0x70/2,即為56(十進制),且廣播尋址禁止
*/
EA=1;//打開全局中斷
smbusMasterStart();//主機發送起始位
while(1);//此句很重要,若無此句,main()函數執行完以上代碼可能復位重新執行程序
}
/*
以下空中斷的作用是使相應中斷矢量空間保留,使keil c不將其空間用來存放程序代碼。
若沒有空中斷定義,代碼空間0x0003-0x003a地址存放程序代碼,采用空中斷后,這些地址
均編譯成RETI指令,其好處是若程序受到干擾產生誤中斷能保證正常退出中斷。
*/
void int0() interrupt 0{
}
void int1() interrupt 1{
}
void int2() interrupt 2{
}
void int3() interrupt 3{
}
void int4() interrupt 4{
}
void int5() interrupt 5{
}
void int6() interrupt 6{
}
void smbusInt() interrupt 7{//smbus中斷,此中斷只考慮關鍵狀態處理,以便調試
SFRPAGE=0x00;//此句可省略,在此設斷點觀察寄存器變化
if(SMB0STA==0x08){//起始位發送成功
SMB0DAT=S_AD_W;//將地址和寫控制裝入發送緩沖區
k=1;
STA=0;//將STA清零,注意,若不清零則將一直為重發狀態
}
if(SMB0STA==0x28||SMB0STA==0x18){//數據或地址發送成功處理
if(k>=7)
STO=1;//數據發送完畢,將STO置1,結束發送
if(k==1)
SMB0DAT=0x30;//發送第一個調試數據
if(k==2)
SMB0DAT=0x31;
if(k==3)
SMB0DAT=0x32;
if(k==4)
SMB0DAT=0x33;
if(k==5)
SMB0DAT=0x34;
if(k==6)
SMB0DAT=0x35;//一共發送6個數據
k++;
}
if(SMB0STA==0x10){
//若處于重發狀態,則將從機地址和寫控制重新發送,并將STA清零
SMB0DAT=0x6e;
STA=0;
}
SI=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -