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

📄 i2c.c

📁 I2C通信子程序 I2C通信子程序 I2C通信子程序 I2C通信子程序
💻 C
字号:
/*********************************************/
/*I2c program*/
/*********************************************/
#include "reg52.h"
#include "I2C.h"
 
sbit SDA=P3^7;
sbit SCL=P3^6;

bit _ack;

/*Wait for some time to get proper I2c timing*/
void I2cWait(void)
{
	unsigned char i;
	for(i=0;i<1;i++) ;
}

/*I2c start condition*/
void I2cStart(void)
{
	SDA=1;
	SCL=1;
	I2cWait();
	SDA=0;
	I2cWait();
	SCL=0;
}

/*I2c stop condition*/
void I2cStop(void)
{
	SDA=0;
	I2cWait();
	SCL=1;
	I2cWait();
	SDA=1;
}

//master transfer data to slave
//and return acknowledge bit
void I2cSentByte(uchar bb)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		if(bb&0x80)
			SDA=1;
		else
			SDA=0;
		bb<<=1;
		SCL=1;
		I2cWait();
		SCL=0;
		I2cWait();
	}
	SDA=1;
	I2cWait();
	SCL=1;
	I2cWait();
	_ack=SDA;
	SDA=1;
	SCL=0;
}

//slave transfer data to master
uchar I2cReceiveByte(void)
{
	uchar i,bb=0;
	for(i=0;i<8;i++)
	{
		SCL=1;
		SDA=1;
		I2cWait();
		bb<<=1;
		CY=SDA;
		if(CY) bb|=0x01;
		SCL=0;
		I2cWait();
	}
	SDA=1;	
	return bb;
}

//Master send acknowledge bit to slave
//acknowledge="0",non-acknowledge="1"
void SendAcknowledge(void)
{
	SDA=_ack;
	I2cWait();	
	SCL=1;
	I2cWait();
	SCL=0;
	SDA=1;
}

void I2cByteWrite(uchar sla,uchar addr,uchar bb)
{
	I2cStart();
	I2cSentByte(sla);
	I2cSentByte(addr);
	I2cSentByte(bb);
	I2cStop();
}

uchar I2cByteRead(uchar sla,uchar addr)
{
	uchar bb;
	I2cStart();
	I2cSentByte(sla);
	I2cSentByte(addr);
	I2cStart();
	I2cSentByte(sla|0x01);
	bb=I2cReceiveByte();
	_ack=1;
	SendAcknowledge();
	I2cStop();
	return bb;
}

void ClrFm24c16(uchar sla,uchar addr,uchar cnt)
{
	uchar i;
	i=XX24C|(sla<<1);
	I2cStart();
	I2cSentByte(i);
	I2cSentByte(addr);
	for (i=0;i<cnt;i++){
		I2cSentByte(0x00);
	}
	I2cStop();
}

void WriteFm24c16(uchar sla,uchar addr,uchar idata *pnt,uchar cnt)
{
	uchar i;
	i=XX24C|(sla<<1);
	I2cStart();
	I2cSentByte(i);
	I2cSentByte(addr);
	for (i=0;i<cnt;i++){
		I2cSentByte(*pnt);
		pnt++;
	}
	I2cStop();
}

void ReadFm24c16(uchar sla,uchar addr,uchar idata *pnt,uchar cnt)
{
	uchar i;
	i=XX24C|(sla<<1);
	I2cStart();
	I2cSentByte(i);
	I2cSentByte(addr);
	I2cStart();
	I2cSentByte(i|0x01);
	for(i=0;i<cnt;i++){
		*pnt=I2cReceiveByte();
		pnt++;
		_ack=0;
		if (i==(cnt-1)) _ack=1;		
		SendAcknowledge();
	}
	I2cStop();
}
	
void Write8576(uchar idata *pnt)
{
	uchar i;	
	I2cStart();
	I2cSentByte(PCF8576);
	I2cSentByte(0xe0);	
	I2cSentByte(0xc8);
	I2cSentByte(0x00);
	for(i=0;i<18;i++) I2cSentByte(*pnt++);
	I2cStop();
}

uchar ReadAd7416(uchar slave)
{
	uchar temp;	
	I2cStart();
	I2cSentByte(AD7416|slave);
	I2cSentByte(0x00);
	I2cStart();
	I2cSentByte(AD7416|slave|0x01);	
	temp=I2cReceiveByte();
	_ack=0;	
	SendAcknowledge();
	I2cReceiveByte();
	_ack=1;
	SendAcknowledge();
	I2cStop();
	return temp;
}

⌨️ 快捷键说明

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