📄 smbus_m_r.c
字号:
///////////主机接收调试程序////////////////
////////Smbus_M_R.c/////////////////////////////////
#include "smbus.h"
#define S_AD_R 0x6f
#define S_AD_W 0x6e
xdata uchar aa[7];//用于存放接收数据
void config(){
//看门狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉开关配置,SMBUS配置到P0.0和P0.1上
XBR0 = 0x01;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x01;
//管脚输出配置,P0口为开漏输出
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用内部晶振8分频
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(){
char i;
config();
smbus_cfg(0x44,0xf1,0x70);
/*
smbus使能,AA=1,SCL高电平和低电平超时禁止
smbus时钟频率为100khz
自身从机地址为0x70/2,即为56(十进制),且广播寻址禁止
*/
EA=1;//打开全局中断
smbusMasterStart();//主机发送起始位
while(1){
if(k>=6)
k=0;//在此设断点观察全速运行结果
}
}
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_R;
k=0;
STA=0;//将STA清零,否则将处于重发状态
}
if(SMB0STA==0x40){
//地址+读控制发送成功,此时SMB0DAT里的数据无意义,不作为接收数据,
k=0;
AA=1;
//要确保AA为1,因为接下去是主机发送ACK确认信号
}
if(SMB0STA==0x50){//数据成功接收,ACK成功发送
if(k>=4)//共接收5个数据,所以在接收到第四个时将AA清零,注意第一个数据是从k=1时接收
AA=0;
aa[k]=SMB0DAT;
}
if(SMB0STA==0x10){//重发状态的处理
SMB0DAT=0x6f;
STA=0;
}
if(SMB0STA==0x58){//最后一个数据接收成功,将STO置1,释放总线
STO=1;
aa[k]=SMB0DAT;
}
k++;
SI=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -