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

📄 i2c.h

📁 梵天科技FM模块:9903-80110C,9903-80110H,9805M8-1418.C51代码例程!
💻 H
字号:
//===================================================
// I2C协议脚位定义(用于80110H)
//===================================================
sbit P_SDA  = P3^7;
sbit P_SCL  = P3^6;

//===================================================
//	I2C延时
//===================================================
void I2cDelay()
{
	BYTE j;
	for(j = 0; j < 50; j++)
	{
		// 延时够用就行 NOP;
	}
}

//===================================================
//	I2c开始
//===================================================
void I2cStart()
{
	P_SDA = 1;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	P_SDA = 0;
	I2cDelay();

	P_SCL = 0;
	I2cDelay();
}

//===================================================
//	I2c停止
//===================================================
void I2cStop()
{
 	P_SDA = 0;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	P_SDA = 1;
	I2cDelay();
}

//===================================================
//	I2c读应答
//===================================================
BYTE I2cGetAck()
{
	BYTE iAck = 0;

	I2cDelay();

	P_SDA = 1;
	P_SCL = 1;
	I2cDelay();

	if(!P_SDA)
		iAck = 1;
	else
		iAck = 0;
	I2cDelay();

	P_SCL = 0;
	I2cDelay();

	return iAck;
}

//===================================================
//	I2c写应答
//===================================================
void I2cSetAck()
{
	P_SDA = 0;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();
	I2cDelay();

	P_SCL = 0;
	I2cDelay();
}

//===================================================
//	I2c写入一个字节
//===================================================
void I2cWriteByte(BYTE nData)
{
	char i;
	for(i = 0;i < 8;i ++)
	{
		if(nData & 0x80)
		{
			P_SDA = 1;
		}
		else
		{
			P_SDA = 0;
		}
		I2cDelay();

		nData <<= 1;

		P_SCL = 1;
		I2cDelay();
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}

	I2cDelay();
}

//===================================================
//	I2c读取一个字节
//===================================================
BYTE I2cReadByte()
{
	BYTE nData = 0;
	char i;
	
	for(i = 0;i < 8;i ++)
	{
		nData <<= 1;
		I2cDelay();	
		
		P_SCL = 1;
		I2cDelay();

		if(P_SDA)
		{
			nData |= 1;	
		}
		else
		{
			nData &= 0xfe;	
		}
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}

	I2cDelay();

	return nData;
}

#if 0
//===================================================
//	写I2C设备,DEV器件地址,ADDR片内地址,DATA数据
//===================================================
#define I2C_ERROR		0x100
int I2cWrite(BYTE DEV,BYTE ADDR,BYTE DATA)
{
	BYTE iAck = 0;

	I2cStart();

	I2cWriteByte(DEV);
	iAck = I2cGetAck();
	if(!iAck)
		return I2C_ERROR + 1;
	
	I2cWriteByte(ADDR);
	iAck = I2cGetAck();
	if(!iAck)
		return I2C_ERROR + 2;

	I2cWriteByte(DATA);
	iAck = I2cGetAck();
	if(!iAck)
		return I2C_ERROR + 3;

	I2cStop();

	return DATA;
}

//===================================================
//	读I2C设备
//===================================================
int I2cRead(BYTE DEV,BYTE ADDR)
{
	BYTE nData = 0;
	BYTE iAck = 0;
		
	I2cStart();

	I2cWriteByte(DEV);
	iAck = I2cGetAck();
	if(!iAck)
		return I2C_ERROR + 0x11;

	I2cWriteByte(ADDR);
	iAck = I2cGetAck();
	if(!iAck)
		return I2C_ERROR + 0x12;

	I2cStart();
	I2cWriteByte(DEV | 0x01);
	iAck = I2cGetAck();
	if(!iAck)
		return I2C_ERROR + 0x13;
 	
	nData = I2cReadByte();
	I2cSetAck(); 
	I2cStop();

	return nData;
}
#endif

⌨️ 快捷键说明

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