📄 text1.c
字号:
#include <c8051f020.h>
#include <niao.h>
#define SomeNop() _nop_();_nop_();_nop_();_nop_();_nop_();\
////////)///////////////全局变量//////////////////////////////////
char COMMAND;
char WORD;
char BYTE_NUMBER;
unsigned char HIGH_ADD,LOW_ADD;
bit SMB_BUSY;
//////////////////////全局变量/////////////////////////////////
//////////////////////函数原型声明//////////////////////////
void SMBus_ISR(void);
void SM_Send(unsigned int byte_address,char out_byte);
char SM_Receive(unsigned int byte_address);
void SYSCLK_Init(void);
void PortInit(void);
//////////////////////函数原型声明//////////////////////////
//////////////////////////主程序///////////////////////////////////
void main(void)
{
unsigned char check;
WDTCN=0xde;
WDTCN=0xad;
SYSCLK_Init();
PortInit();
SMB0CN=0x44;
SMB0CR=-90;
EIE1|=2;
EA=1;
SomeNop();
SomeNop();
SMB_BUSY=0;
SMB_BUSY=0;
SMB_BUSY=0;
/////////////////测试程序代码///////////////////////
check=SM_Receive(0x0099);
SM_Send(0x0099,0x44);
check=SM_Receive(0x0099);
while(1);
/////////////////测试程序代码///////////////////////////
}
//////////////////////////////主程序////////////////////////////////////
/////////////////////////////////功能函数定义////////////////////////////////
void SYSCLK_Init(void)
{
int j=0;
OSCXCN=0x67;
for (j=0; j < 256; j++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88;
}
void PortInit(void)
{
XBR0 = 0x01; // Enable SPI0
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT=0xff;
}
void SM_Send(unsigned int byte_address,char out_byte)
{
while(SMB_BUSY);
SMB_BUSY=1;
SMB0CN=0x44;
BYTE_NUMBER=2;
COMMAND=(0xA0|WRITE);
HIGH_ADD=((byte_address>>8)&0x00ff);
LOW_ADD=(byte_address&0x00ff);
WORD=out_byte;
STA=1;
}
char SM_Receive(unsigned int byte_address)
{
while(SMB_BUSY);
SMB_BUSY=1;
SMB0CN=0x44;
BYTE_NUMBER=2;
COMMAND=(0xA0|READ);
HIGH_ADD=((byte_address>>8)&0x00ff);
LOW_ADD=(byte_address&0x00ff);
STA=1;
while(SMB_BUSY);
return WORD;
}
/////////中断服务程序/////////
void SMBus_ISR(void) interrupt 7
{
switch(SMB0STA)
{
case SMB_START:
SMB0DAT=(COMMAND&0xFE);
STA=0;
break;
case SMB_RP_START:
SMB0DAT=COMMAND;
STA=0;
break;
case SMB_MTADDACK:
SMB0DAT=HIGH_ADD;
break;
case SMB_MTADDNACK:
STO=1;
STA=1;
break;
case SMB_MTDBACK:
switch(BYTE_NUMBER)
{
case 2:
SMB0DAT=LOW_ADD;
BYTE_NUMBER--;
break;
case 1:
if(COMMAND&0x01)
STA=1;
else
{
SMB0DAT=WORD;
BYTE_NUMBER--;
}
break;
default:
STO=1;
SMB_BUSY=0;
}
break;
case SMB_MTDBNACK:
STO=1;
STA=1;
break;
case SMB_MRADDACK:
AA=0;
break;
case SMB_MRADDNACK:
STA=1;
break;
case SMB_MRDBNACK:
WORD=SMB0DAT;
STO=1;
SMB_BUSY=0;
break;
default:
STO=1;
SMB_BUSY=0;
break;
}
SI=0;
}
/////////中断服务程序/////////
/////////////////////////////////功能函数定义////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -