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

📄 iic.c

📁 c8051f020 实时时钟模块程序 内含IIC模块程序/********************** SYSTEM CLOCK 8M********************************/
💻 C
字号:
/************iic dirver for c8051f020 ************************
  	
			system  clock  8M 

************************************************************/
#include "C8051F020.h"
#include "IIC.h"

void IIC_Config( ){

	WDTCN = 0x07;	// Watchdog Timer Control Register
    WDTCN = 0xDE;   // Disable WDT
    WDTCN = 0xAD;



	XBR0 = 0x07;	// XBAR0: Initial Reset Value
	XBR1 = 0x00;	// XBAR1: Initial Reset Value
	XBR2 = 0x40;	// XBAR2: Initial Reset Value

    P0MDOUT = 0x1D; // Output configuration for P0 
 



	OSCXCN = 0x00;	// EXTERNAL Oscillator Control Register	

	OSCICN = 0x06;	// Internal Oscillator Control Register

	


	SMB0CN = 0x40;	// SMBus Control Register
	SMB0ADR = 0xA0;	// SMBus Address Register
	SMB0CR = 0x60;	// SMBus Clock Rate Register

		
}

void Delay_IIC(){
	unsigned char  i=10;
	while(i--);
	}

void GetBus(){
		SMB0CN=release_bus_sta;
		while(SI==0);
		
		} 

void SendByte( unsigned char dataa ){
		
			SMB0DAT=dataa;
			SMB0CN=release_bus_ack;
			while(SI==0);
				}                // waitting......



bit SmbRec(unsigned char slaadd ,unsigned char subadd ,unsigned char num ,unsigned char *RecPtr )
	
	{	unsigned char  counter;
		
		Delay_IIC();
		
		 GetBus();

		
		Delay_IIC();
		
		SendByte ( slaadd );
		
		Delay_IIC();
			if( SMB0STA!=0X18){
				STO=1;
				return(0);
				}
		SendByte( subadd );
		
			if(SMB0STA!=0X28){
				STO=1;
				return(0);
				}
		
		Delay_IIC();
		
		 SMB0CN=release_bus_sta;
		 
		 while(SI==0);
		
		
		 Delay_IIC();
		SendByte( slaadd+1 ) ;  // send slaadd  + r 
		 Delay_IIC();
		if(SMB0STA!=0X40){
				SMB0CN=generate_stop;
				return(0);
				}
			for(counter=0;counter<(num-1);counter++){
				 	
					
					SMB0CN=release_bus_ack;                              //  set   ACK
					
					while( SI==0);
					
					
					if( SMB0STA!=0X50){
						SMB0CN=generate_stop;
						return(0);
						}
					*RecPtr=SMB0DAT;
					 
					 RecPtr++;
				}
			     SMB0CN=release_bus_nack;                                //  set     NACK
				
				while(SI==0);          // receive the last byte data
			
				*RecPtr=SMB0DAT;	

				SMB0CN=generate_stop;
				
				return(1);

}


bit   SmbSend ( unsigned char slaadd , unsigned char subadd ,unsigned char num ,unsigned char *SendPtr){
		
		unsigned char  counter;		
		
		
	    GetBus();
	
	
		
		SendByte( slaadd );
		
			if(SMB0STA!=0X18){
					STO=1;
					return(0);
					}
		SendByte( subadd );			// send  subaddress 
		
			if( SMB0STA!=0X28){
					STO=1;
					return(0);
					}
		for(counter=0;counter<num; counter++){
			
			SendByte ( *SendPtr );
				if( SMB0STA!=0X28 ){
					STO=1;
					return(0);
					}
			 	SendPtr++;
			}
	
		    SMB0CN=generate_stop;              // stop the bus 
		
		return(1);
 } // end SmbSend	
 

⌨️ 快捷键说明

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