⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 SMBUS对eeprom的操作
💻 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 + -