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

📄 i2c_.c

📁 单片机与pc机通讯例程的mcu部分
💻 C
字号:
#include "Def_.h"

/*----------------------------------------------------
标准IIC器件操作函数
----------------------------------------------------*/


#define USE_STD_I2C_DRIVER		1
#if USE_STD_I2C_DRIVER
static unsigned char StdI2cSerIn(unsigned char x);
static unsigned char StdI2cSerOut(unsigned char ack);
static unsigned char StdI2cBusyCheck(unsigned char icAddr);
static void StdI2cStart(void);
static void StdI2cStop(void);
static void StdI2cClk(void);
static void StdI2cNop(void);


static void StdI2cNop(void)
/*
IIC时序延时
*/
{
	_nop_();
	_nop_();
}

static void StdI2cStart(void)
/*
IIC开始时序
*/
{
//while PStdI2cClk=1,PStdI2cDat=1->0
	PStdI2cClk=0;
	PStdI2cDat=1;
	StdI2cNop();
	PStdI2cClk=1;
	StdI2cNop();
	PStdI2cDat=0;
	StdI2cNop();
	PStdI2cClk=0;
}

static void StdI2cStop(void)
/*
IIC停止时序
*/
{
//while scl=1,sda=0->1
	PStdI2cClk=0;
	PStdI2cDat=0;
	StdI2cNop();
	PStdI2cClk=1;
	StdI2cNop();
	PStdI2cDat=1;
	StdI2cNop();
	PStdI2cClk=0;
}

static void StdI2cClk(void)
/*
IIC脉冲时序
*/
{
	StdI2cNop();
	PStdI2cClk=1;
	StdI2cNop();
	PStdI2cClk=0;
}

static unsigned char StdI2cSerIn(unsigned char x)
/*
写入一个byte
*/
{
	unsigned char i;
	unsigned char result;
	for(i=8;i;i--)
	{
		PStdI2cDat=x&0x80;
		x<<=1;
		StdI2cClk();
	}
	PStdI2cDat=1;
	StdI2cNop();
	if(PStdI2cDat)		result = 0;
	else			result = 1;
	StdI2cClk();
	return (result);
}


#define CHECK_IIC_TIMES		20
static unsigned char StdI2cBusyCheck(unsigned char icAddr)
/*	返回非零表示IIC忙线	*/
{
	unsigned char i;
	for(i=0;i<CHECK_IIC_TIMES;i++)
	{
		StdI2cStart();
		if(StdI2cSerIn(icAddr))	break;
	}
	if(CHECK_IIC_TIMES == i)	return 1;
	else					return 0;
}

static unsigned char StdI2cSerOut(unsigned char ack)
/*
读取一个byte
*/
{
	unsigned char i,val;
	PStdI2cDat=1;
	for(i=8;i;i--)
	{
		val<<=1;
		if(PStdI2cDat) val++;
		StdI2cClk();
	}
	if(ack)
	{
		PStdI2cDat=0;
		StdI2cClk();
	}
	return(val);
}

#endif

#if USE_STD_I2C_IC_8BITS_ADDR
/*
IIC内部地址为8位
*/
unsigned char RdStdI2cIcByte(unsigned char icAddr,unsigned char addr, unsigned char* x)
/*
在对应IIC地址读取一个字节
*/
{
	if(StdI2cBusyCheck(icAddr)) return 0;
	StdI2cSerIn(addr);
	StdI2cStart();
	StdI2cSerIn(icAddr+1);
	*x=StdI2cSerOut(0);
	StdI2cStop();
	return 1;
}

unsigned char RdStdI2cIcBuff(unsigned char icAddr,unsigned char buff[],unsigned char addr,unsigned char length)
/*
在对应IIC地址读取少于8个byte的buffer
*/
{
	unsigned char loop;
	if(StdI2cBusyCheck(icAddr))	return 0;
	if(length>8) 			length = 8;
	StdI2cSerIn(addr);
	StdI2cStart();
	StdI2cSerIn(icAddr+1);
	for(loop=0;loop<(length-1);loop++)
		*(buff+loop) = StdI2cSerOut(1);
	*(buff+loop) = StdI2cSerOut(0);
	StdI2cStop();
	return 1;
}

unsigned char WrStdI2cIcByte(unsigned char icAddr,unsigned char addr,unsigned char x)
/*
在对应IIC地址写入一个字节
*/
{
	if(StdI2cBusyCheck(icAddr))	return 0;
	StdI2cStart();
	StdI2cSerIn(icAddr);
	StdI2cSerIn(addr);
	StdI2cSerIn(x);
	StdI2cStop();
	return 1;
}

unsigned char WrStdI2cIcBuff(unsigned char icAddr,unsigned char buff[],unsigned char addr,unsigned char length)
/*
在对应IIC地址写入少于8个byte的buffer
*/
{
	unsigned char loop;
	if(StdI2cBusyCheck(icAddr))	return 0;
	if(length>8)	length = 8;

	StdI2cStart();
	StdI2cSerIn(icAddr);
	StdI2cSerIn(addr);
	for(loop=0;loop<length;loop++)
		StdI2cSerIn(buff[loop]);
	StdI2cStop();
	return 1;
}
#endif


#if USE_STD_I2C_IC_16BITS_ADDR
/*
IIC内部地址为16位
*/
unsigned char RdStdI2cIcByte_1(unsigned char icAddr,unsigned int addr, unsigned char* x)
/*
在对应IIC地址读取一个字节
*/
{
	if(StdI2cBusyCheck(icAddr)) return 0;
	StdI2cSerIn(addr>>8);
	StdI2cSerIn(addr&0xff);
	StdI2cStart();
	StdI2cSerIn(icAddr+1);
	*x=StdI2cSerOut(0);
	StdI2cStop();
	return 1;
}

unsigned char RdStdI2cIcBuff_1(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
在对应IIC地址读取少于8个byte的buffer
*/
{
	unsigned char loop;
	if(StdI2cBusyCheck(icAddr))	return 0;
	if(length>8) 			length = 8;
	StdI2cSerIn(addr>>8);
	StdI2cSerIn(addr&0xff);
	StdI2cStart();
	StdI2cSerIn(icAddr+1);
	for(loop=0;loop<(length-1);loop++)
		*(buff+loop) = StdI2cSerOut(1);
	*(buff+loop) = StdI2cSerOut(0);
	StdI2cStop();
	return 1;
}

unsigned char WrStdI2cIcByte_1(unsigned char icAddr,unsigned int addr,unsigned char x)
/*
在对应IIC地址写入一个字节
*/
{
	if(StdI2cBusyCheck(icAddr))	return 0;
	StdI2cStart();
	StdI2cSerIn(icAddr);
	StdI2cSerIn(addr>>8);
	StdI2cSerIn(addr&0xff);
	StdI2cSerIn(x);
	StdI2cStop();
	return 1;
}

unsigned char WrStdI2cIcBuff_1(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
在对应IIC地址写入少于8个byte的buffer
*/
{
	unsigned char loop;
	if(StdI2cBusyCheck(icAddr))	return 0;
	if(length>8)	length = 8;

	StdI2cStart();
	StdI2cSerIn(icAddr);
	StdI2cSerIn(addr>>8);
	StdI2cSerIn(addr&0xff);
	for(loop=0;loop<length;loop++)
		StdI2cSerIn(buff[loop]);
	StdI2cStop();
	return 1;
}
#endif


⌨️ 快捷键说明

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