i2c.c

来自「基于51单片机实现UART通信 SPI通信 和IIC通信」· C语言 代码 · 共 248 行

C
248
字号
#include    "Includes.h"
/*********************************************************************************************************
** 函数名称: IICRead
** 功能描述: 从IIC总线读取数据	 
** 输 入: Ret:存储读取的数据   
**         Addr:IIC从器件地址  
**         Nbyte:读取的字节数目	  
** 输 出: TRUE:成功  
**         FALSE:失败  
** 全局变量: 无	  
** 调用模块: 无	 
********************************************************************************************************/
unsigned char IICRead(unsigned char  *Ret,unsigned char Addr,unsigned char NByte)
{
    unsigned char i;
    
	//Addr = Addr | 0x01;
	if (IICStart() == FALSE)
	{
	    return 0;//FALSE;
        }
	if (IICSend(0xa0) == FALSE)
	{
	    return 0;//FALSE;
	}
	if(IICSend(Addr) == FALSE)
	{
	    return 0;//FALSE;
	}
	if (IICStart() == FALSE)
	{
	    return 0;//FALSE;
        }
	if (IICSend(0xa1) == FALSE)
	{
	    return 0;
	}
	i = NByte - 1;
	if (i != 0)
	{
	    do
	    {
		    *Ret++ = IICReceive();
		    IIC_ACK();
	    } while (--i != 0);
	}
	*Ret = IICReceive();
	IIC_NO_ACK();
	IICStop();
	return 1;    
}

/*********************************************************************************************************
** 函数名称: IICWrite
** 功能描述: 往IIC总线写数据 
** 输 入: Addr:IIC从器件地址 
**         Data:存储将要写的数据   
**         Nbyte:写的字节数目 
** 输 出: TRUE:成功	 
**         FALSE:失败	 
** 全局变量: 无	    
** 调用模块: 无	    
********************************************************************************************************/
unsigned char IICWrite(unsigned char Addr,unsigned char *Data,unsigned char NByte)
{
	unsigned char i;

	//Addr = Addr & 0xfe;
	if (IICStart() == FALSE)
	{
	    return 0;//FALSE;
	}
	
	if (IICSend(0xa0) == FALSE)
	{
	    return 0;//FALSE;
	}
	if (IICSend(Addr) == FALSE)
	{
	    return 0;// FALSE;
	}
	i = NByte;
	do
	{
		if (IICSend(*Data++) == FALSE)
		{
		    return 0;//FALSE;
		}
	} while (--i !=0 );
	IICStop();
	return 1;
}

/*********************************************************************************************************
** 函数名称: IICInit
** 功能描述: IIC总线初始化
** 输 入: 无 
** 输 出: 无  
** 全局变量: 无	 
** 调用模块: 无	  
********************************************************************************************************/
void IICInit(void)
{
	SCL = 0;
	IICStop();
}
 
/*********************************************************************************************************
** 函数名称: IICStart
** 功能描述: 发送IIC启动信号  
** 输 入: 无	   
** 输 出: TRUE:成功   
**         FALSE:失败   
** 全局变量: 无	 
** 调用模块: 无	  
********************************************************************************************************/
 unsigned char IICStart(void)
{
	SDA = 1;
	SCL = 1;
	if (SDA == 1)
	{
	    SDA = 0;
	    SCL = 0;
	    SDA = 1;
	    return TRUE;
    }
    else
    {
	    return FALSE;
    }
}

/*********************************************************************************************************
** 函数名称: IICStop
** 功能描述: 发送IIC结束信号 
** 输 入: 无  
** 输 出: 无  
** 全局变量: 无	  
** 调用模块: 无	  
********************************************************************************************************/
void IICStop(void)
{
	SDA = 0;
	SCL = 1;
	SDA = 1;
	SCL = 0;
}

/*********************************************************************************************************
** 函数名称: IIC_ACK
** 功能描述: 发送IIC应答信号   
** 输 入: 无	 
** 输 出: 无	 
** 全局变量: 无	  
** 调用模块: 无	   
********************************************************************************************************/
void IIC_ACK(void)
{
	SDA = 0;
	SCL = 1;
	_nop_();
	SCL = 0;
}

/*********************************************************************************************************
** 函数名称: IIC_NO_ACK
** 功能描述: 发送IIC无应答信号 
** 输 入: 无   
** 输 出: 无   
** 全局变量: 无	 
** 调用模块: 无	 
********************************************************************************************************/
void IIC_NO_ACK(void)
{
	SDA = 1;
	SCL = 1;
	_nop_();
	SCL = 0;
	return;
}

/*********************************************************************************************************
** 函数名称: IICSend
** 功能描述: 发送一个字节  
** 输 入: IIC_data:数据  
** 输 出: TRUE:成功    
**         FALSE:失败   
** 全局变量: 无		 
** 调用模块: 无		 
********************************************************************************************************/
unsigned char IICSend(unsigned char IIC_data)
{
	unsigned char i;
	CY=0;
	for (i = 0; i < 8; i++)
	{
		IIC_data=IIC_data<<1;
		F0 = SDA = CY;//???
		SCL = 1;
		if (F0 != SDA)
		{
			SCL = 0;
			return FALSE;
		}
		SCL = 0;
	}
	SDA = 1;
	SCL = 1;
	if (SDA == 1)
	{
		SCL = 0;
		return FALSE;
	}
	else
	{
	    SCL = 0;
	    return TRUE;
	}
}

/*********************************************************************************************************
** 函数名称: IICReceive
** 功能描述: 读取一个字节
** 输 入: 无	 
** 输 出: 读取的字节   
** 全局变量: 无		  
** 调用模块: 无		  
********************************************************************************************************/
unsigned char IICReceive(void)
{
	unsigned char i,r;
	
	r = 0;
	SDA = 1;
	for (i = 0; i < 8; i++)
	{
		r = r * 2;
		SCL = 1;
		if (SDA == 1)
		{
		    r++;
		}
		SCL = 0;
	}
	return r;
}

⌨️ 快捷键说明

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