📄 i2c.c
字号:
/*******************************************************************************
* 模块名: I2C程序模块
* 文 件: I2C.C
* 功 能: I2C相关的程序
* 日 期: 2008-11-13
* 版本: 1.0
* 作者: CP
******************************************************************************** *
/*函数定义*/
void I2C_Send_Master_Ack(void);始//I2C发送开始
void I2C_Send_Master_NAck(void);//I2C发送结束
tByte I2C_Write_Byte(const tByte); //MUC向I2C设备写一个字节
tByte I2C_Read_Byte(void); //MCU从I2C设备读一个字节
tByte I2C_Get_Ack_From_Slave(void);//接受从机应答信号
void I2C_Send_Master_Ack(void);//I2C主机应答
void I2C_Send_Master_NAck(void); //I2C主机无应答
void I2C_Delay(void);//I2C延时几微妙
/********************************************************************
函 数 名:I2C_Send_Start
功 能:I2C开始
说 明:主机:发送者;时钟线高电平,数据线有高电平转为低电平
调用函数:I2C延时函数:I2C_Delay()
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void I2C_Send_Start(void)
{
//主机发起
pI2cScl = 1;
pI2cSda = 1; //拉高数据线和时钟线
I2C_Delay(); //延时几微妙,准备开始
pI2cSda = 0; //拉低数据线,开始
I2C_Delay();
pI2cScl = 0;
}
/********************************************************************
函 数 名:I2C_Send_Stop
功 能:I2C结束
说 明:发起者:发送者;时钟线高电平,数据线有低电平转为高电平
调用函数:I2C延时函数:I2C_Delay()
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void I2C_Send_Stop(void)
{
pI2cScl = 0;
pI2cSda = 0;//拉低数据线和时钟线
I2C_Delay(); //延时几微妙,准备结束
pI2cScl = 1;//拉高时钟线
I2C_Delay();
pI2cSda = 1; //拉高时钟线
}
/********************************************************************
函 数 名:tByte I2C_Write_Byte(tByte Data)
功 能:MCU向iic设备发送一个字节
说 明:主机:MCU; SDA线上的数据状态仅在SCL为低电平的期间才能改变
调用函数:I2C延时函数:I2C_Delay()主机等待应答信号I2C_Get_Ack_From_Slave()
全局变量:无
入口参数:待发送的字节数据 tbData
返 回 值:发送成功 1; 发送失败 0
设 计:CP
版本 :1
***********************************************************************/
tByte I2C_Write_Byte(tByte tbData)
{
tByte tbTempSendCount= 0; //临时变量,发送次数
// 一次发送一位数据
for (tbTempSendCount = 0; tbTempSendCount < 8;tbTempSendCount++ )
{
pI2cSda = (bit)((tbData & 0x80) >> 7); // 注意:(一开始时钟线为低电平)在时钟线为低电平的时候,改变数据线上的信号
pI2cScl = 1; //拉高时钟线,保持数据(在这期间不可以改变数据线上的信号)
I2C_Delay();//延时几微妙
pI2cScl = 0; // 拉低时钟线,为下一次写数据做准备
Data <<= 1; //数据移一位,发下一位 从最高位开始发送
}
return(I2C_Get_Ack_From_Slave());
}
/********************************************************************
函 数 名:tByte I2C_Read_Byte(void)
功 能:MCU从iic设备接收一个字节
说 明:主机:iic设备;SDA线上的数据状态仅在SCL为低电平的期间才能改变
调用函数:I2C延时函数:I2C_Delay()
全局变量:无
入口参数:无
返 回 值:接受的数据 tbTempReadresult
设 计:CP
版本 :1
***********************************************************************/
tByte I2C_Read_Byte(void)
{
tByte tbTempReadresult = 0; // 临时变量,用于返回读取值
tByte tbTempSendCount = 0; //临时变量,发送次数
pI2cSda = 1;
for (tbTempSendCount = 0; tbTempSendCount < 8; tbTempSendCount++ )
{
I2C_Delay(); //延时几微妙
tbTempReadresult <<= 1; //数据移一位,接受下一位 从最高位开始接受
pI2cScl = 0; //时钟线为低电平,可以改变数据线上的信号
I2C_Delay(); //延时几微妙
pI2cScl = 1; //时钟做一次从低到高的跳变 可以接收数据;时钟线为高,数据线上的信号保持不变
I2C_Delay(); //延时几微妙,可以采集数据
if (pI2cSda) //如果是数据线是高电平
{
tbTempReadresult |= 0x01; // 则末尾置1
}
}
pI2cScl = 0;
return(tbTempReadresult);
}
/********************************************************************
函 数 名:tByte I2C_Get_Ack_From_Slave(void)
功 能:MCU等待iic设备的应答信号
说 明:主机:iic设备;主机接受客机应答:在响应的时钟脉冲期间,接受器必须将数据线拉低,
使它在这个始终脉冲的高电平保持稳定的低电平
调用函数:I2C延时函数:I2C_Delay()
全局变量:无
入口参数:无
返 回 值:1-无应答;0-有应答
设 计:CP
版本 :1
***********************************************************************/
tByte I2C_Get_Ack_From_Slave(void)
{
tByte tbTempErroeTime=128;//I2C超时临时变量,为0表示超时
pI2cSda = 1;
I2C_Delay(); //延时几微妙
pI2cScl = 1;//主机把数据线和时钟线拉高
I2C_Delay(); //延时几微妙
while (pI2cSda) //判断数据线信号是否是高电平
{
tbTempErroeTime--;// 是高电平,超时变量减一
if(!tbTempErroeTime)//超时变量是否为0
{
pI2cScl = 0;
return 1; //是0,表示超时,返回1;
}
}
pI2cScl = 0; // Generate a clock cycle
return 0; // 低电平,表示接受器有应答,可以响应
}
/********************************************************************
函 数 名:void I2C_Send_Master_Ack(void)
功 能:MCU向iic设备发送应答信号
说 明:主机:MCU;数据线被拉低表示接受成功,并且准备接受下一个信号,
调用函数:I2C延时函数:I2C_Delay()
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void I2C_Send_Master_Ack(void)
{
pI2cSda = 0;
pI2cScl = 1;
I2C_Delay();
pI2cScl = 0;
}
/********************************************************************
函 数 名:void I2C_Send_Master_NAck(void)
功 能:MCU向iic设备发送无应答信号
说 明:主机:MCU;数据线被拉高,表示接受失败,
以通知被控发送器结束数据发送,并释放sda线,以便主控接收器发送一个停止信号
调用函数:I2C延时函数:I2C_Delay()
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void I2C_Send_Master_NAck(void)
{
pI2cSda = 1;
pI2cScl = 1;
I2C_Delay();
pI2cScl = 0;
}
/*******************************************************************
函 数 名:void I2C_Delay(void)
功 能:I2C延时几微妙
说 明:无
调用函数:无
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void I2C_Delay(void)
{
_nop_();
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -