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

📄 io-smbus.c

📁 用51单片机IO口实现SMBUS总线的源程序
💻 C
字号:
/****************************************************************
 *文件名:I2C.c
 *描述:提供I2C的底层驱动,可选的400K或100K速度。
 *环境:KEIL C51
 *版本:v1.0
 *作者:wentsing
 *日期:2006/03/07
*****************************************************************/

#include "include.h"

//#define I2C_C		1

uchar SystemError;

/****************************************************************
调用方式:void DelayI2C(void) 函数说明:I2C专用
*****************************************************************/
static void DelayI2C(void)
{
	#if I2C_SPEED == I2C_100K
	SomeNOP();
	#endif
}

/****************************************************************
调用方式:void I2CStart(void) 函数说明:I2C专用
*****************************************************************/

void I2CStart(void)
{
//	EA = 0;
	SDA = 1; SCL = 1; DelayI2C();		//INI
	SDA = 0; DelayI2C(); 				//START
	SCL = 0;
}

/****************************************************************
调用方式:void I2CStop(void)  函数说明:I2C专用
*****************************************************************/
void I2CStop(void)
{
	SCL = 0; SDA = 0; DelayI2C();	 //INI
	SCL = 1; DelayI2C(); SDA = 1;	 //STOP
//	EA = 1;
}

/****************************************************************
调用方式:bit WaitAck(void)
函数说明:I2C专用,等待从器件接收方的应答
*****************************************************************/
bool WaitAck(void)
{
	uchar errtime = 255;		//因故障接收方无ACK,超时值为255。
	SDA = 1;DelayI2C();
	SCL = 1;DelayI2C();
	while(SDA) 
	{
		errtime--; 
		if (!errtime) 
		{
		  	I2CStop();
			SystemError=0x11;
			return false;
		}
	}
	SCL = 0;
	return true;
}
/****************************************************************
调用方式:void SendAck(void) 
函数说明:I2C专用,主器件为接收方,从器件为发送方时,应答信号。
*****************************************************************/
void SendAck(void)
{
	SDA = 0; DelayI2C();
	SCL = 1; DelayI2C();
	SCL = 0;
}

/****************************************************************
调用方式:void SendNotAck(void) 
函数说明:I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
*****************************************************************/
void SendNotAck(void)
{
	SDA = 1; DelayI2C();
	SCL = 1; DelayI2C();
	SCL = 0;
}
/****************************************************************
调用方式:void I2CSendByte(uchar ch) 
函数说明:I2C专用
*****************************************************************/
void I2CSendByte(byte ch)
{
	uchar i = 8;
	while (i--)
	{
		SCL = 0; NOP();
		SDA = (bool)(ch&0x80); 
		ch <<= 1; DelayI2C();
		SCL = 1; DelayI2C();
	}
	SCL = 0;
}

/****************************************************************
调用方式:uchar I2CReceiveByte(void) 
函数说明:I2C专用
*****************************************************************/
unsigned char I2CReceiveByte(void)
{
	uchar i = 8;
	uchar ddata = 0;
	SDA = 1;
	while (i--)
	{
		ddata <<= 1;
		SCL = 0; DelayI2C();
		SCL = 1; DelayI2C();
		ddata |= SDA;
	}
	SCL = 0;
	return ddata;
}

⌨️ 快捷键说明

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