iic.c

来自「一个非常好的微处理器烧录EEPROM的C++ 原代码项目文件,直接可用,一拖一」· C语言 代码 · 共 230 行

C
230
字号
#include	"Publicdef.h"
#include	"publicfunction.h"

BYTE	IIC_Type;

BIT	SDA_IN(void)
{
	switch	(IIC_Type)
	{
		case	IIC_AT24CXX_R:
				return Pin_IIC_Sda_AT24CXX_R;
		case	IIC_AT24CXX_D:
				return Pin_IIC_Sda_AT24CXX_D;	
	}
}

BIT	SCL_IN(void)
{
	switch	(IIC_Type)
	{
		case	IIC_AT24CXX_R:
				return Pin_IIC_Scl_AT24CXX_R;
		case	IIC_AT24CXX_D:
				return Pin_IIC_Scl_AT24CXX_D;	
	}
}

void	SDA_HIGH(void)
{
	switch	(IIC_Type)
	{
		case	IIC_AT24CXX_R:
				Pin_IIC_Sda_AT24CXX_R=H_LEVEL;
				break;
		case	IIC_AT24CXX_D:
				Pin_IIC_Sda_AT24CXX_D=H_LEVEL;	
				break;
	}
}	
void	SDA_LOW(void)		
{
	switch	(IIC_Type)
	{
		case	IIC_AT24CXX_R:
				Pin_IIC_Sda_AT24CXX_R=L_LEVEL;
				break;
		case	IIC_AT24CXX_D:
				Pin_IIC_Sda_AT24CXX_D=L_LEVEL;	
				break;
	}
}
void	SCL_HIGH(void)
{
	switch	(IIC_Type)
	{
		case	IIC_AT24CXX_R:
				Pin_IIC_Scl_AT24CXX_R=H_LEVEL; 
				break;
		case	IIC_AT24CXX_D:
				Pin_IIC_Scl_AT24CXX_D=H_LEVEL;	
				break;
	}
}
void	 SCL_LOW(void)
{
	switch	(IIC_Type)
	{
		case	IIC_AT24CXX_R:
				Pin_IIC_Scl_AT24CXX_R=L_LEVEL;
				break;
		case	IIC_AT24CXX_D:
				Pin_IIC_Scl_AT24CXX_D=L_LEVEL;	
				break;
	}
}
void	IIC_Start(void)
{
	SDA_HIGH();
	SCL_HIGH();
	IIC_DELAY();
	SDA_LOW();
	SCL_LOW();
}

void	IIC_Stop(void)
{
	SCL_HIGH();
	IIC_DELAY();
	SDA_HIGH();
}

void	 IIC_Ack(BIT Ack)
{
	if	(Ack)
	SDA_HIGH();
	else
	SDA_LOW();
	SCL_HIGH();
	IIC_DELAY();
	SCL_LOW();
	SDA_LOW();
}

BIT	IIC_SendByte(BYTE IIC_Data)
{
	BYTE	DATA 	loop;
	BIT		DATA	Error=0;
	for	(loop=0;loop<=7;loop++)
	{
		if	(IIC_Data&(0x80>>loop))
		SDA_HIGH();
		else
		SDA_LOW();
		SCL_HIGH();
		IIC_DELAY();
		SCL_LOW();
		IIC_DELAY();
	}
	SDA_HIGH();
	SCL_HIGH();
	IIC_DELAY();
	if	(SDA_IN()||(SCL_IN()==0))
	Error=btIIC_ERROR;
	SCL_LOW();
	SDA_LOW();
	return	Error;
}

void	IIC_ReceiveByte(BYTE	*ptIIC_Data)
{
	BYTE	loop;
	
	*ptIIC_Data=0;
	SDA_HIGH();
	for	(loop=0;(loop<=7);loop++)
	{
		SCL_LOW();
		IIC_DELAY();
		SCL_HIGH();
		IIC_DELAY();
		if	(SDA_IN())
		*ptIIC_Data|=(0x80>>loop);
	}
	SCL_LOW();
	SDA_LOW();
}

BIT	IIC_Write(BYTE	Addr,BYTE	SubAddr,BYTE	Number)
{
	BYTE	DATA 	loop;
	BIT		DATA	Error=btIIC_RIGHT;
	IIC_Start();
	if	(IIC_SendByte(Addr))
	Error=btIIC_ERROR;
	if	(IIC_SendByte(SubAddr))
	Error=btIIC_ERROR;
	for	(loop=0;loop<Number;loop++)
	{
		if	(IIC_SendByte(*ptGpBuffer++))
		Error=btIIC_ERROR;		
	}
	IIC_Stop();
	return	Error;
}

BIT	IIC_WriteW(BYTE	Addr,WORD	SubAddr,BYTE	Number)
{
	BYTE	DATA 	loop;
	BIT		DATA	Error=btIIC_RIGHT;
	IIC_Start();
	if	(IIC_SendByte(Addr))
	Error=btIIC_ERROR;
	if	(IIC_SendByte(Hi_Byte(SubAddr)))
	Error=btIIC_ERROR;
	if	(IIC_SendByte(Lo_Byte(SubAddr)))
	Error=btIIC_ERROR;
	for	(loop=0;loop<Number;loop++)
	{
		if	(IIC_SendByte(*ptGpBuffer++))
		Error=btIIC_ERROR;		
	}
	IIC_Stop();
	return	Error;
}

BIT	IIC_Read(BYTE	Addr,BYTE	SubAddr,BYTE  Number)
{
	BIT		DATA	Error=0;
	BYTE	DATA	loop;
	IIC_Start();
	if	(IIC_SendByte(Addr))
	Error=btIIC_ERROR;	
	if	(IIC_SendByte(SubAddr))
	Error=btIIC_ERROR;	
	IIC_Start();
	if	(IIC_SendByte(Addr+1))
	Error=btIIC_ERROR;	
	for	(loop=0;loop<Number;loop++)
	{
		IIC_ReceiveByte(ptGpBuffer++);
		IIC_Ack(loop/(Number-1));
	}
	IIC_Stop();
	return	Error;
}

BIT	IIC_ReadW(BYTE	Addr,WORD	SubAddr,BYTE  Number)
{
	BIT		DATA	Error=0;
	BYTE	DATA	loop;
	IIC_Start();
	if	(IIC_SendByte(Addr))
	Error=btIIC_ERROR;	
	if	(IIC_SendByte(Hi_Byte(SubAddr)))
	Error=btIIC_ERROR;	
	if	(IIC_SendByte(Lo_Byte(SubAddr)))
	Error=btIIC_ERROR;	
	IIC_Start();
	if	(IIC_SendByte(Addr+1))
	Error=btIIC_ERROR;	
	for	(loop=0;loop<Number;loop++)
	{
		IIC_ReceiveByte(ptGpBuffer++);
		IIC_Ack(loop/(Number-1));
	}
	IIC_Stop();
	return	Error;
}

⌨️ 快捷键说明

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