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

📄 i2c.h

📁 基于51类单片机RTX51多任务系统
💻 H
字号:
/****************	Video Codec Head File	****************/
#ifndef	__I2C_H__
#define	__I2C_H__

/**************** Function declare ********************/
void CPU_I2C_Start(void);
void I2C_Init ( void ); 
void I2C_S_Start ( void );
void I2C_Stop ( void );
void I2C_Ack ( void );
void  Test_Ack( void );
void Set_I2C_P2S ( unsigned char );
void Write_I2C_1Byte ( unsigned char, unsigned char, unsigned char );
unsigned char Get_I2C_S2P ( void );
unsigned char Read_I2C_1Byte ( unsigned char, unsigned char );
unsigned char Read_I2Cs_1Byte ( unsigned char, unsigned char );
void Write_I2C_nByte ( unsigned char, unsigned char, unsigned char code *, unsigned char );

//==================================================================================
//==================================================================================
//						I2C function description
//==================================================================================
void short_delay(int n)
{
	for(;n>0;n--);
}
//==================================================================================
void I2C_Init ( void )
{
	
	ATP_SDA = 1;
	ATP_SCL = 1;

}
//==================================================================================
void I2C_S_Start ( void )
{
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保证启动和停止之间的空闲时间
//	ATP_SDA = 1;
//	ATP_SCL = 1;
	ATP_SDA = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//起始条件保持时间
	ATP_SCL = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保证SCL的低电平时间

}
//==================================================================================
void I2C_Sr_Start ( void )
{
	ATP_SCL = 1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//重复起始条件建立时间
	ATP_SDA = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//起始条件保持时间
	ATP_SCL = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保证SCL的低电平时间

}
//==================================================================================
void I2C_Stop ( void )
{

	ATP_SDA = 0;
	_nop_();_nop_();
	ATP_SCL = 1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//停止条件建立时间
	ATP_SDA = 1;
	_nop_();_nop_();
}
//==================================================================================
void I2C_Ack ( void )
{
	
	ATP_SDA = 1;		//... SDA input mode
	_nop_();_nop_();_nop_();_nop_();_nop_();//数据建立时间
	ATP_SCL = 1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//scl高电平时间
	ATP_SCL = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保持时间
}
//==================================================================================
void Test_Ack()                       //测试ACK信号
{	
//  bit ErrorBit;
//	ATP_SDA = 1;
	_nop_();_nop_();_nop_();_nop_();//数据建立时间
	ATP_SCL = 1;
	_nop_();_nop_();_nop_();_nop_();
//    ErrorBit=ATP_SDA;
	while(ATP_SDA); 
	_nop_();_nop_();_nop_();_nop_();//scl高电平时间
	ATP_SCL = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保持时间
   // return(ErrorBit);             //若SDA=1,说明尚未处理完
   //return(0);
   return;
} 
//==================================================================================

void Set_I2C_P2S ( unsigned char wdata )
{
	unsigned char i;
 
     /* MSB is sent first */
	for ( i = 0; i < 8; i ++ )
	{
		( wdata & 0x80 ) ?  ( ATP_SDA = 1 ) : ( ATP_SDA = 0 );
		_nop_();_nop_();_nop_();_nop_();	//数据建立时间	
		ATP_SCL = 1;
		wdata <<=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//SCL高电平时间
		ATP_SCL = 0;
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//数据保持时间
	}
	ATP_SDA = 1;
}
//==================================================================================
unsigned char Get_I2C_S2P ( void )
{
	unsigned char i, rdata = 0;

	ATP_SDA = 1;		// ... SDA input mode
	for ( i = 1; i <= 8; i ++ )
	{
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//数据建立时间
		ATP_SCL = 1;
		_nop_();_nop_();_nop_();_nop_();
		if ( ATP_SDA == 1 )	rdata |= 0x01;
		_nop_();_nop_();
		ATP_SCL = 0;
		_nop_();_nop_();_nop_();_nop_();_nop_();//数据保持时间
		if ( i == 8 ) continue;		//
		rdata <<= 1;
	}
	return rdata;
}
//==================================================================================
void Write_I2C_1Byte ( unsigned char slave_addr, unsigned char start_addr, unsigned char wdata )
{

	I2C_S_Start ( );
	Set_I2C_P2S ( slave_addr << 1 );			// I2C write mode
	Test_Ack ( );
	Set_I2C_P2S ( start_addr );
	Test_Ack ( );
	Set_I2C_P2S ( wdata );
	Test_Ack ( );
	I2C_Stop ( );

}
//==================================================================================
void Write_I2C_nByte ( unsigned char slave_addr, unsigned char start_addr, unsigned char code *tbl_ptr, unsigned char length )
{
	unsigned char count;
	
	I2C_S_Start ( );
	Set_I2C_P2S ( slave_addr << 1 );			// I2C write mode
	Test_Ack ( );
	Set_I2C_P2S ( start_addr );
	Test_Ack ( );
	for ( count = 0; count < length; count ++ )
	{	
		Set_I2C_P2S ( tbl_ptr [ count ] );
		Test_Ack ( );
	}
	I2C_Stop ( );	
}

//==================================================================================
unsigned char Read_I2C_1Byte ( unsigned char slave_addr, unsigned char start_addr )
{
	unsigned char rdata = 0;

	I2C_S_Start ( );
	Set_I2C_P2S ( slave_addr << 1 );			// I2C write mode
	Test_Ack ( );
	Set_I2C_P2S ( start_addr );
	Test_Ack ( );
	I2C_Stop ( );
	I2C_Sr_Start ( );				// write -> read 
	Set_I2C_P2S ( ( slave_addr << 1 ) | 0x01 );	// I2C read mode
	Test_Ack ( );
	rdata = Get_I2C_S2P ( );
	I2C_Ack ( );
	I2C_Stop ( );

	return rdata;
}

//==================================================================================

unsigned char Read_I2Cs_1Byte ( unsigned char slave_addr, unsigned char start_addr )
{
	unsigned char rdata = 0;

	I2C_S_Start ( );
	Set_I2C_P2S ( ( slave_addr << 1 ) | 0x01 );			// I2C read mode
	Test_Ack ( );
	Set_I2C_P2S ( start_addr );
	Test_Ack ( );
	rdata = Get_I2C_S2P ( );
	ATP_SDA = 1;		//... SDA input mode
	ATP_SCL = 1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	I2C_Stop ( );

	return rdata;
}


//==================================================================================
void CPU_I2C_Start(void)
{		
	I2C_S_Start();
	Set_I2C_P2S(0x1);
	Test_Ack ( );
	I2C_Sr_Start();			
}		   

//==================================================================================
#endif

⌨️ 快捷键说明

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