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

📄 i2c.c

📁 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 + -