📄 smbus.c
字号:
///////////主机发送调试程序////////////////
////////Smbus_M_T.c/////////////////////////////////
#include<c8051f020.h>
void senddata(unsigned char,unsigned char);
void setoff(unsigned char);
#define S_AD_R 0x6f
#define S_AD_W 0x6e
unsigned char k,dat,f=0;
void smbusMasterStart(void);
void config(void);
//void yan50m(unsigned char);
void smbusM_Start(void);
void main(){
//char i;
config();
//smbus_cfg(0x40,0xf1,0x70);
SMB0CN=0x40;
SMB0CR=0xF1;
SMB0ADR=0x70;
EIE1=0x02;
setoff(2);
EA=1;//打开全局中断
//smbusMasterStart();//主机发送起始位
k=0;
dat=0xff;
smbusMasterStart();
while(f);
smbusM_Start();
SMB0ADR=0x70;
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中断,此中断只考虑关键状态处理,以便调
//此句可省略,在此设断点观察寄存器变化
if(f)
{
if(SMB0STA==0x08){//起始位发送成功
SMB0DAT=S_AD_W;//将地址和写控制装入发送缓冲区
k=1;
STA=0;//将STA清零,注意,若不清零则将一直为重发状态
}
if(SMB0STA==0x28||SMB0STA==0x18){//数据或地址发送成功处理
if(k==2)
{
STO=1;
f=0;
}
if(k==1)
SMB0DAT=dat;
senddata(3,dat/100);
senddata(2,dat%100/10);
senddata(1,dat%10);
}
if(SMB0STA==0x10){
//若处于重发状态,则将从机地址和写控制重新发送,并将STA清零
SMB0DAT=0x6e;
STA=0;
}
if(SMB0STA==0x08){//起始位发送成功,将地址+读控制装入发送缓冲区
SMB0DAT=S_AD_R;
k=0;
STA=0;//将STA清零,否则将处于重发状态
}
}
else
{
if(SMB0STA==0x40){
//地址+读控制发送成功,此时SMB0DAT里的数据无意义,不作为接收数据,
k=0;
AA=1;
//要确保AA为1,因为接下去是主机发送ACK确认信号
}
if(SMB0STA==0x50){//数据成功接收,ACK成功发送
if(k>=1)//共接收5个数据,所以在接收到第四个时将AA清零,注意第一个数据是从k=1时接收
AA=0;
}
if(SMB0STA==0x10){//重发状态的处理
SMB0DAT=0x6f;
STA=0;
}
if(SMB0STA==0x58){//最后一个数据接收成功,将STO置1,释放总线
STO=1;
dat=SMB0DAT;
senddata(3,dat/100);
senddata(2,dat%100/10);
senddata(1,dat%10);
}
}
k++;
SI=0;
}
/****************************起始条件*****************************/
void smbusMasterStart(void)
{//此函数用来启动主机发送起始位,主机发送完起始位将引发中断
f=1;
STA=1;
}
void smbusM_Start(void)
{//此函数用来启动主机发送起始位,主机发送完起始位将引发中断
f=0;
STA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -