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

📄 i2c.c

📁 8051下的I2C驱动软件
💻 C
字号:
/*============================================================================
Copyright (c) 2004 Sunplus Technology Co., Ltd.
Module Name:          I2C.C
Abstract:             Module related to RTC.C routine
Environment:          Keil C51 Compiler
Revision History:     10/15/2003    XYQ    created
=============================================================================*/
#include "general.h"
#include "intrins.h"
#include "I2C.h"

#ifdef USE_I2C_SerialPort

/*-----------------------------------------------------
〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C
包括100Khz(T=10us)的标准模式(慢速模式)选择,
和400Khz(T=2.5us)的快速模式选择,
-------------------------------------------------------*/

#define SomeNOP(); _nop_();_nop_();_nop_();
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
	EA=0;
	I2C_SDA=1;
	I2C_SCL=1;
	SomeNOP();//INI
	I2C_SDA=0;
	SomeNOP();//START
	I2C_SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
	I2C_SCL=0;
	I2C_SDA=0;
	SomeNOP();//INI
	I2C_SCL=1;
	SomeNOP();
	I2C_SDA=1; //STOP
	EA=1;
}

/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bit WaitAck(void)
{
	unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
	
	I2C_SDA=1;
	XBYTE[0x2102]=XBYTE[0x2102]&0x7f;//set I2C_SDA input
	SomeNOP();
	while(I2C_SDA)
	{
		errtime--;
		if (!errtime)
		{
			I2CStop();
			//printf("I2C fail!\n");
			return false;
		}
	}
	XBYTE[0x2102]=XBYTE[0x2102]|0x80;//set I2C_SDA output
	I2C_SCL=1;
	SomeNOP();
	I2C_SCL=0;
	return true;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
bit I2CSendByte(unsigned char ch)
{
	unsigned char i=8;
	while (i--)
	{
		I2C_SDA=(bit)(ch&0x80);
		ch<<=1;
		SomeNOP();
		I2C_SCL=1;
		SomeNOP();
		I2C_SCL=0;
	}
	
	return(WaitAck());
}

/**--------------------------------------------------------------------------------
调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte(bit SendAck)
{
	unsigned char i=8;
	unsigned char ddata=0;
	I2C_SDA=1;
	XBYTE[0x2102]=XBYTE[0x2102]&0x7f;//set I2C_SDA input
	while (i--)
	{
		I2C_SCL=1;
		ddata<<=1;
		SomeNOP();
		SomeNOP();
		ddata|=I2C_SDA;
		I2C_SCL=0;
	}
	XBYTE[0x2102]=XBYTE[0x2102]|0x80;//set I2C_SDA output
//send ACK or NotACK
	I2C_SDA=SendAck;
	SomeNOP();
	I2C_SCL=1;
	SomeNOP();
	I2C_SCL=0;
	return ddata;
}

#endif//#ifdef USE_I2C_SerialPort

⌨️ 快捷键说明

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