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

📄 i2c.c

📁 Keil 8051 C example RS232 to I2c
💻 C
字号:
#include <at89x52.H>              // SFR definition header file

#include "SystemEvent.h"
#include "Function.h"
#include "ExtVar.h" 
#include <intrins.h>
 // ********************************************************************************
// Function: i2c_start;                  
// Description:  Sending a start waveform to I2C bus.            				 		    
// Input parameters:   None.
// Output parameters:  None. 
// Return values:      None. 
// ********************************************************************************  
void i2cStart(void){ 

    _sda=1; 
    _sclk=1;
	_nop_();	_nop_();	_nop_();	_nop_();
    _sda=0; 
	_nop_();	_nop_();	_nop_();	_nop_();
 }

// ********************************************************************************
// Function: i2c_stop;                  
// Description:  Sending a stop waveform to I2C bus.           				 		    
// Input parameters:   None.
// Output parameters:  None. 
// Return values:      None. 
// ******************************************************************************** 
void i2cStop(void){
unsigned int _timeOut;
	_timeOut=0;
   _sda=0; 
	_nop_();	_nop_();	_nop_();	_nop_();
 	_sclk=1; 
 
if((_IDCodeOfI2C==0xb8)||(_IDCodeOfI2C==0xba)){
	while((_sclk==0)&&(_timeOut<0x4f00))
	{
		_nop_();
		_timeOut++;	
	}
}
	_sda=1; 	
	_nop_();	_nop_();	_nop_();_nop_();
}

// ********************************************************************************
// Function: i2cTransmit;                  
// Description:  Transmit a byte to the I2C slaver.           				 		    
// Input parameters:   unsigned char valueX: value to transmit.
// Output parameters:  unsigned char i: i=0; Ack from slaver was receved
//                                      i=1; Ack was not receved   
// Return values:      None. 
// ******************************************************************************** 
unsigned char i2cTransmit( unsigned char valueX )
{
unsigned char i;
unsigned int _Timeout;
unsigned char value=valueX;   
	_sda=0;
	_sclk=0; 
	_nop_();	_nop_();	_nop_();	_nop_();
    for (i=0; i<8; i++){ 		
   		_sclk=0;   
		_nop_();	_nop_();	_nop_();	_nop_();
   		if (value & 0x80) _sda=1; 	    
		else   _sda=0; 
		_nop_();	_nop_();	_nop_();	_nop_();
		_sclk=1; 
		_nop_();	_nop_();	_nop_();	_nop_();
		value <<= 1;
    }  
	_sclk=0;  
	_nop_();	_nop_();	_nop_();	_nop_();		
	_sda=1; 
	_nop_();	_nop_();	_nop_();	_nop_();
	_Timeout=0;	 	    
	_sclk=1; 
     while((_sda==1)&&(_Timeout<0x2)){             
               _Timeout++;
 	}
    i=(unsigned char)_sda; 
	_nop_();	_nop_();	_nop_();	_nop_();
   _sclk=0;  
	_nop_();	_nop_();	_nop_();	_nop_();
	return(i);  
} 

// ********************************************************************************
// Function: i2cLocate;                  
// Description:  Transmit ID and sub addr to the I2C slaver.           				 		    
// Input parameters:	unsigned char slave_addr: I2C device slave ID.
//			unsigned char sub_addr: sub address to access of the I2C slaver.
// Output parameters:  	unsigned char i: i=1; Ack from slave was receved
//                                      i=0; Ack was not receved   
// Return values:      None. 
// ******************************************************************************** 
unsigned char i2cLocate( unsigned char slave_addr, unsigned char  sub_addr )
{
     i2cStart();
	if(i2cTransmit(slave_addr)) {     i2cStop(); return(FALSE); }	
    else {	if(i2cTransmit(sub_addr))  {  i2cStop();   return(FALSE);}}
	return(TRUE);   
}

 
// ********************************************************************************
// Function: i2cNotAck;                  
// Description:  Return a "Hight" to I2C slaver   .           				 		    
// Input parameters:   None.
// Output parameters:  None.  
// Return values:      None. 
// ********************************************************************************    
void i2cNotAck( void )
{ 
	_sclk=0;  
	_sda=1;   
	_sclk=1;  
	_sclk=0;  
}
 
 
// ********************************************************************************
// Function: i2cReceive;                  
// Description:  Return 1 byte of data which received from I2C bus. 
// Input parameters:   None.
// Output parameters:  unsigned char value: data been received from I2C bus.  
// Return values:      None. 
// ********************************************************************************  
unsigned char i2cReceive( void )
{
    /*Read ack.*/
    unsigned char     i;
    unsigned char    value;     
	_sclk=0;    
   /*Set value bit by bit...MSB first*/
   value = 0;
   for (i=0; i<8; i++)
   {  
		value <<= 1;
		_sclk=0;   
		if(_sda==1) value|=0x01;
		_sclk=1;  
    } 
	_sclk=0; 
    return(value);
}

// ********************************************************************************
// Function:   i2c_write;                  
// Description: Transmit 1 byte of data to slave end with assigned ID and sub address.            				 		    
// Input parameters:   unsigned char slave_addr:   I2C slave ID of destination chip. 
//                     unsigned char sub_addr:  sub address of destination chip. 
//					   unsigned char _Count: count of data to write 	
//					   unsigned char *_DataX: pointer to the data stream will be tramsitted.
// Output parameters:  None. 
// Return values:      None. 
// ******************************************************************************** 
void i2c_write( unsigned char slave_addr, unsigned char sub_addr,unsigned char _Count,unsigned char *_DataX)
{
  unsigned int _ix;
  i2cStop();               
	if(((slave_addr&0xf0)!=0x20)&&(slave_addr!=0x78)&&((slave_addr&0xf0)!=0x60)){ 
     if (i2cLocate(slave_addr, sub_addr )){               
		for(_ix=0;_ix<(unsigned int)_Count;_ix++) 
			{ i2cTransmit(*(_DataX+(unsigned int)(_ix)));   } 
     } 	
	 i2cStop();
    }
    else {  
		for(_ix=0;_ix<_Count;_ix++) {         
    	 if (i2cLocate(slave_addr, sub_addr+_ix))   i2cTransmit(*(_DataX+_ix));  
		 i2cStop();   
		}  			   	 
	}
}
 
// ********************************************************************************
// Function: i2cAck;                  
// Description:  Return a "Low" to I2C slaver as a acknowledgment.           				 		    
// Input parameters:   None.
// Output parameters:  None.  
// Return values:      None. 
// ********************************************************************************     
void i2cAck( void )
{    //receive state, ack set by master  
 _sclk=0;  	 
 _sda=0;  		     
 _sclk=1; 
 _sclk=0;  
 _sda=1; 
}

// ********************************************************************************
// Function:   i2c_read;                  
// Description: Read data stream from I2C slaver.            				 		    
// Input parameters:		unsigned char slave_addr:   I2C slave ID of destination chip. 
//                     	unsigned char sub_addr:  sub address of destination chip. 
//							   unsigned char _Count: count of data to write 	
//								unsigned char *_DataX: pointer to the data stream will be read.
// Output parameters:  None. 
// Return values:      None. 
// ******************************************************************************** 
void i2c_read( unsigned char slave_addr, unsigned char  sub_addr,unsigned char _Count,unsigned char *_DataX )
{
	unsigned char _ix;
	if(((slave_addr&0xf0)!=0x20)&&(slave_addr!=0x78)&&((slave_addr&0xf0)!=0x60)){
		if (i2cLocate(slave_addr,  sub_addr)) {
      	i2cStart();    
			if(i2cTransmit((unsigned char)(slave_addr | 0x0001))){
				i2cStop();   
	      	return; 
	    	}  
        	for(_ix=0;_ix<_Count;_ix++) { 
		  		*(_DataX+(unsigned int)_ix) = i2cReceive();  	       
	      	if(_ix==(_Count-1))  i2cNotAck();
		  		else i2cAck();	            
	    	} 
	   	i2cStop();
      }
    }
    else { 
		for(_ix=0;_ix<_Count;_ix++) {
      	if (i2cLocate(slave_addr,sub_addr+_ix)){  
				i2cStart(); 
    			if(i2cTransmit(slave_addr|0x0001)){    
					i2cStop();            
					return;	
				}  
      		*(_DataX+(unsigned int)_ix) = i2cReceive(); 
				i2cNotAck();  i2cStop();     
			}	                                  	                                      
      }
 	}
}

 

⌨️ 快捷键说明

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