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

📄 smbus.c

📁 C8051F读写SMBUS
💻 C
字号:
/////////////////////////////////////
//  /////////////begain//////////////
/////////////////////////////////////

#include "C8051F340.h"
#include <STDIO.H>
#include <INTRINS.H>
#define WRITE 0x00
#define READ 0x01

#define CHIP_ID 0xc4
#define SMB0STA       SMB0CN&0xFC
#define SMB_START     0xE0
#define SMB_MTDATADD  0xC0
#define SMB_MRDAT     0x88
sbit TTQH6_RST0=P0^6;
bit BUSY;
bit flag=0;
bit rd_flag=0;
char command;
char t_word;
char r_word;
void T3_interrupt(void);
void SmBus_ISR(void);
void SM_Send(char chip_select,unsigned char byte_address,char out_byte);
char SM_Receive(char chip_select,unsigned char byte_address);
unsigned char register_add;
char count;

/////////////////////////////////////
//  Generated Initialization File  //
/////////////////////////////////////

#include "C8051F340.h"

// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;	   //禁止看门狗
}

void Timer_Init()
{
    TCON      = 0x10;
    TMOD      = 0x02;
    CKCON     = 0x04;
    TH0       = 0xEC;  //  200kbps
}

void SMBus_Init()
{
    SMB0CF    = 0xD0;	 // SMBUS允许,从事件禁止,SCL低电平扩展
}

void Port_IO_Init()
{
    // P0.0  -  SDA (SMBus), Open-Drain, Digital
    // P0.1  -  SCL (SMBus), Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  Unassigned,  Open-Drain, Digital
    // P0.5  -  Unassigned,  Open-Drain, Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    // P2.0  -  Unassigned,  Open-Drain, Digital
    // P2.1  -  Unassigned,  Open-Drain, Digital
    // P2.2  -  Unassigned,  Open-Drain, Digital
    // P2.3  -  Unassigned,  Open-Drain, Digital
    // P2.4  -  Unassigned,  Open-Drain, Digital
    // P2.5  -  Unassigned,  Open-Drain, Digital
    // P2.6  -  Unassigned,  Open-Drain, Digital
    // P2.7  -  Unassigned,  Open-Drain, Digital

    // P3.0  -  Unassigned,  Open-Drain, Digital
    // P3.1  -  Unassigned,  Open-Drain, Digital
    // P3.2  -  Unassigned,  Open-Drain, Digital
    // P3.3  -  Unassigned,  Open-Drain, Digital
    // P3.4  -  Unassigned,  Open-Drain, Digital
    // P3.5  -  Unassigned,  Open-Drain, Digital
    // P3.6  -  Unassigned,  Open-Drain, Digital
    // P3.7  -  Unassigned,  Open-Drain, Digital

    XBR0      = 0x04;
    XBR1      = 0x40;		//SMBUS引脚使能,交叉开关允许	 
}

void Oscillator_Init()
{
    OSCICN    = 0x83;		//12MHz系统时钟
}

void Interrupts_Init()
{
    EIE1      = 0x01;
    IE        = 0x80;	//全局中断允许,SMBUS中断允许
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    PCA_Init();
    Timer_Init();
    SMBus_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}


void Delay(unsigned char x)
{
    unsigned char i, j;
    
    for (i=0; i<x; i++)
    {
        for (j=0; j<0xff; j++)
        {;}
    }
}
void Init_TTQH6(void)	  //初始化器件TTQH6
{
    TTQH6_RST0 = 0;
    Delay(1);
    TTQH6_RST0 = 1;
    Delay(5);
}




void main(void)
{

  unsigned char check;
//  Init_TTQH6();	  //初始化器件TTQH6
    Init_Device();
   _nop_;

   _nop_;

   _nop_;

   _nop_;

   _nop_;

   _nop_;

    BUSY=0;
    BUSY=0;
  //  SM_Send(CHIP_ID,0x01,0x52);
    check=SM_Receive(CHIP_ID,0x01);
    while(1);

}


void SM_Send(char chip_select,unsigned char byte_address,char out_byte)
{
 while(BUSY);
 BUSY=1;

 SMB0CF    = 0xD0; //////////////

 count=2;
 command=(chip_select|WRITE);
 register_add=byte_address;
 t_word=out_byte;
 STA=1;
 while(BUSY);



}
char SM_Receive(char chip_select,unsigned char byte_address)
 {
 while(BUSY);
 BUSY=1;
 count=2;
 
 SMB0CF    = 0xD0; //////////

 rd_flag=1;
 flag=1;
 command=chip_select|READ;
 register_add=byte_address;
 STA=1;
 while(BUSY);
 return r_word;

 }
void SmBus_ISR(void) interrupt 7
{
  switch(SMB0STA)
  {
    case SMB_START:
	  	 SMB0DAT=(command&0xFE);
		 STA=0;
		 break;
    case SMB_MTDATADD: 
	      if(ACK)
			{
 		 
		    	if( rd_flag)
		    	{
		    	 SMB0DAT= command;
			      rd_flag=0;
				  
		    	}
		    	else
		        {
		    	 switch(count)
		     	{
		         case 2:
		  	     SMB0DAT=register_add;
			     count--;
			     break;
			     case 1:
				   if(flag)
				   {
					break;
				   }
				   else
		  	        { SMB0DAT=t_word;
			          count--;
			          break;
				     }
			     default:
			     STO=1;
			     BUSY=0;
		         break;
		        }
				
		        }
			   }
			else
	    
		       { STO=1;
			    STA=1;
				}
			break;
    case SMB_MRDAT:

	     r_word=SMB0DAT;
		 ACK=1;
		 STO=1;
         BUSY=0;
		 break;
	default:
	     STO=1;
         BUSY=0;
		 break;
   }
  SI=0;
}
/*void T3_interrupt(void)	 interrupt 14
{
         STO=1;
         BUSY=
		 TMR3CN&=0x7f;
}

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -