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

📄 i2c.h

📁 c51的各典型应用模块库
💻 H
字号:
/*********************************************************************
	微 雪 电 子   WaveShare   http://www.waveShare.net            	

目    的:   建立I2C操作库

目标系统:   基于任何兼容C51的微处理器

应用软件:   Keil C                                               

版    本:   Version 1.0

圆版时间:   2004-08-25

开发人员:   SEE

说    明:   若用于商业用途,请保留此段文字或注明代码来源

	深 圳 微 雪 电 子 保 留 所 有 的 版 权
*********************************************************************/

/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
版本更新记录:

----------------------------------------------------------------------
入口参数说明:
	sbit I2C_SDA	= P1^7;
	sbit I2C_SCL	= P1^6;

----------------------------------------------------------------------
待定参数说明:
	#define DELAY()		{NOP();NOP();NOP();}

----------------------------------------------------------------------	
对外变量说明:

----------------------------------------------------------------------
对外函数说明:


----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/

#ifndef I2C_H
#define I2C_H

#include "D:\C51_H\CmmC51.H"

#define DELAY()	 {NOP();NOP();NOP();NOP();}

#define TRUE	1
#define FALSE	0
bool I2CErr = FALSE;

/*--------------------------------------------------------------------
函数名称:I2C Stop
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_Stop(void)
{
	I2C_SCL=0; 
	I2C_SDA=0; 
	DELAY();
	I2C_SCL=1; 
	DELAY(); 
	I2C_SDA=1; 
	//EA=1;
}
/*--------------------------------------------------------------------
函数名称:I2C Wait Ack
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
bool I2C_WaitAck(void)
{
	uint8 times=255;			//避免故障,设定错误次数

	I2C_SDA=1;
	I2C_SCL=1;
	while(I2C_SDA)
	{ 
		times--;
		if(!times)				//超时值为255
		{
			I2C_Stop();
			I2CErr=TRUE;			
			return FALSE;
		}
	}
	I2C_SCL=0; 
	I2CErr=FALSE;
	return TRUE;
}
/*--------------------------------------------------------------------
函数名称:I2C Start
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_Start(void)
{
	//EA=0;
	I2C_SDA=1;
	I2C_SCL=1;
	DELAY();					
	I2C_SDA=0; 
	DELAY(); 
	I2C_SCL=0;
}
/*--------------------------------------------------------------------
函数名称:I2C Send Ack
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_SendAck(void)
{
	I2C_SDA=0; 
	DELAY();	
	I2C_SCL=1; 
	DELAY();
	I2C_SCL=0;
}
/*--------------------------------------------------------------------
函数名称:I2C Send No Ack
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_SendNoAck(void)
{
	I2C_SDA=1; 
	DELAY(); 
	I2C_SCL=1; 
	DELAY();
	I2C_SCL=0;
}
/*--------------------------------------------------------------------
函数名称:I2C发送数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_SendByte(uint8 dat)
{
	uint8 i;

	for(i=0;i<=7;i++)
	{
		if((dat&0x80)==0x80)
			I2C_SDA=1;
		else 
			I2C_SDA=0;
		dat<<=1; 
		I2C_SCL=1; 
		DELAY();
		I2C_SCL=0;
	}
	I2C_WaitAck();
}
/*--------------------------------------------------------------------
函数名称:I2C接收数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_RcvDat(uint8 *pRdDat)
{
	uint8 i;

	I2C_SDA=1;
	for(i=0;i<=7;i++)
	{
		I2C_SCL=1;
		DELAY(); 
		*pRdDat<<=1;
		*pRdDat|=I2C_SDA;
		I2C_SCL=0;
		DELAY();
	}
}
/*--------------------------------------------------------------------
函数名称:I2C接收数据且不产生应答
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_RcvAckDat(uint8 *pRdDat)
{
	I2C_RcvDat(pRdDat);
	I2C_SendAck();
}
/*--------------------------------------------------------------------
函数名称:I2C接收数据且产生应答
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_RcvNAckDat(uint8 *pRdDat)
{
	I2C_RcvDat(pRdDat);
	I2C_SendNoAck();
}
/*--------------------------------------------------------------------
函数名称:I2C写器件,写一个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
{
	I2C_Start();

	I2C_SendByte(wrDAdr);

	I2C_SendByte(wordAdr); 			

	I2C_SendByte(dat); 

	I2C_Stop();
}
/*--------------------------------------------------------------------
函数名称:I2C写器件,写N个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
//void I2C_Write_(uint16 wrDAdr,uint8 wordAdr,
//				  uint8 *pWrDat,uint8 num)
//{
//
//} 
/*--------------------------------------------------------------------
函数名称:I2C读器件,读一个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_Read(uint16 wrDAdr,uint8 wordAdr,
			  uint8 rdDAdr,uint8 *pRdDat)
{
 	uint8 i;

	I2C_Start();

	I2C_SendByte(wrDAdr); 			

	I2C_SendByte(wordAdr); 			

	I2C_Start();

	I2C_SendByte(rdDAdr);

	I2C_RcvNAckDat(pRdDat+i);

	I2C_Stop();
}
/*--------------------------------------------------------------------
函数名称:I2C读器件,读N个数据
函数功能:
注意事项:对于高速CPU,应加延时
提示说明:无
输    入:
返    回:
--------------------------------------------------------------------*/
void I2C_Read_(uint16 wrDAdr,uint8 wordAdr,
			   uint8 rdDAdr,uint8 *pRdDat,uint8 num)
{
 	uint8 i;

	I2C_Start();

	I2C_SendByte(wrDAdr); 			

	I2C_SendByte(wordAdr); 			

	I2C_Start();

	I2C_SendByte(rdDAdr);

	for(i=0;i<num-1;i++)
		I2C_RcvAckDat(pRdDat+i);
	I2C_RcvNAckDat(pRdDat+i);

	I2C_Stop();
}

#endif

⌨️ 快捷键说明

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