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

📄 i2c.h

📁 很实用的单片机例程
💻 H
字号:
/*********************************************************************
网上收集:  免费共享:慧净电子

目    的:   建立AT24CXX操作库
	
目标系统:   基于任何兼容C51的微处理器

应用软件:   Keil C

版    本:   Version 2.0

收集时间:   2008-08-08

开发人员:   慧净网上收集整理(感谢能放在网上共享的朋友们,功德无量,有你们,中国会更强大)

说    明:  版权:慧净助学产品(包括程序源码,硬件资源)没有版权,欢迎复制共享,功德无量,为中国自动化与单片事业作一点功劳。部分源码技术资料、软件、来源网络,如有伤害到你的利益请来邮:hjmcu@163.com 我们的助学会员会定期删除,谢谢你的理解与支持。

助学小店:http://shop37031453.taobao.com/
慧净空间:http://hi.baidu.com/hjmcu   
助学QQ:  121350852
*********************************************************************/

/*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 + -