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 + -
显示快捷键?