/*
*********************************************************************************************************
*	函 数 名: i2c_ReadByte
*	功能说明: CPU从I2C总线设备读取8bit数据
*	形    参:无
*	返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;

	I2C_SDA_1();
 	I2C_SCL_0(); 
	/* 读到第1个bit为数据的bit7 */
	value = 0;
	for (i = 0; i < 8; i++)
	{
		I2C_SCL_1();
		i2c_Delay();
		value <<= 1;
		
		if (I2C_SDA_READ())
		{
			value++;
		}
		I2C_SCL_0();
		i2c_Delay();
	}
	i2c_NAck();
	return value;
}
Exemple #2
0
/*******************************************************************************
 * 名    称: i2c_SendByte
 * 功    能: CPU向I2C总线设备发送8bit数据
 * 入口参数: _ucByte : 等待发送的字节
 * 出口参数: 无
 * 作  者: Roger-WY
 * 创建日期: 2016-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
void i2c_SendByte(uint8_t _ucByte)
{
	uint8_t i;

	/* 先发送字节的高位bit7 */
	for (i = 0; i < 8; i++) {
        I2C_SCL_0();
		i2c_Delay();

		if (_ucByte & 0x80) {
			I2C_SDA_1();
		} else {
			I2C_SDA_0();
		}

        _ucByte <<= 1;	/* 左移一个bit */

		i2c_Delay();

		I2C_SCL_1();
		i2c_Delay();
	}
    I2C_SCL_0();
	i2c_Delay();

}
Exemple #3
0
/*
*********************************************************************************************************
*	函 数 名: i2c_NAck
*	功能说明: CPU产生1个NACK信号
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{
	I2C_SCL_0();
	I2C_SDA_1();	/* CPU驱动SDA = 1 */
	i2c_Delay();
	I2C_SCL_1();	/* CPU产生1个时钟 */
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();	
}
Exemple #4
0
/*
*********************************************************************************************************
*	函 数 名: i2c_Ack
*	功能说明: CPU产生一个ACK信号
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{
	I2C_SCL_0();
	I2C_SDA_0();	/* CPU驱动SDA = 0 */
	i2c_Delay();
	I2C_SCL_1();	/* CPU产生1个时钟 */
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
	I2C_SDA_1();	/* CPU释放SDA总线 */
	i2c_Delay();
}
Exemple #5
0
/*
*********************************************************************************************************
*	函 数 名: i2c_WaitAck
*	功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*	形    参:无
*	返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{
	uint8_t re;
	I2C_SCL_0();
	I2C_SDA_1();	/* CPU释放SDA总线 */
	i2c_Delay();
	I2C_SCL_1();	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
	i2c_Delay();
	if (I2C_SDA_READ())	/* CPU读取SDA口线状态 */
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	I2C_SCL_0();
	return re;
}
Exemple #6
0
/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线启动信号
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c0_Start(void)
{
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
	I2C_SDA_1();
	I2C_SCL_1();
	i2c0_Delay();
	I2C_SDA_0();
	i2c0_Delay();
	I2C_SCL_0();
	i2c0_Delay();
}
/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线停止信号
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{
	SDA_OUT();               //sda线输出
	/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
	I2C_SCL_0();
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_1();
	I2C_SDA_1();
	i2c_Delay();
}
/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线启动信号
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
	SDA_OUT();               //sda线输出
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
	I2C_SDA_1();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();
}
void i2c_Delay_Test(void)
{
	u8 i;
	SDA_OUT();               //sda线输出
	for(i=0;i<10;i++) {
		//I2C_SDA_0();
		I2C_SCL_1();
		i2c_Delay();
		//I2C_SDA_1();
		I2C_SCL_0();
		i2c_Delay();
	}
}
uint8_t i2c_ReceiveByte_WithACK(void)
{
	uint8_t i,i2c_data;
	//
 	I2C_SDA_1();
 	I2C_SCL_0(); 
 	i2c_data=0;
	//
 	for(i=0;i<8;i++)
 	{
  		I2C_SCL_1();
  		i2c_Delay();
  		i2c_data<<=1;
			//
  		if(I2C_SDA_READ())	i2c_data|=0x01; 
  
  		I2C_SCL_0();  
  		i2c_Delay();     
 	}
	i2c_Ack();
 	return i2c_data;
}
/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线启动信号
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
	I2C_SDA_1();
	i2c_Delay();
	
	I2C_SCL_1();
	i2c_Delay();

	if(!I2C_SDA_READ()) 
		return ;
	
	I2C_SDA_0();
	i2c_Delay();

	I2C_SCL_0();
	i2c_Delay();
	
	if(I2C_SDA_READ()) return;
}
Exemple #12
0
/*******************************************************************************
 * 名    称: i2c_WaitAck
 * 功    能: CPU产生一个时钟,并读取器件的ACK应答信号
 * 入口参数: 无
 * 出口参数: 返回0表示正确应答,1表示无器件响应
 * 作  者: Roger-WY
 * 创建日期: 2016-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
uint8_t i2c_WaitAck(void)
{
	uint8_t re;
    uint8_t TimeOutCnt = 20;  /* 超时计数器 */

	I2C_SDA_1();	/* CPU释放SDA总线 */
	i2c_Delay();
	I2C_SCL_1();	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
	i2c_Delay();

    while(TimeOutCnt -- ) {
        if (I2C_SDA_READ())	{/* CPU读取SDA口线状态 */
            re = 1;
        } else {
            re = 0;
        }
    }
	I2C_SCL_0();
	i2c_Delay();
	return re;
}
/*
*********************************************************************************************************
*	函 数 名: i2c_ReadByte
*	功能说明: CPU从I2C总线设备读取8bit数据
*	形    参:  无
*	返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(uint8_t ack)
{
	uint8_t i;
	uint8_t receive=0;
	SDA_IN();
	
	for (i = 0; i < 8; i++) {
		I2C_SCL_0();
		i2c_Delay();
		I2C_SCL_1();
		receive <<= 1;
		if (I2C_SDA_READ()){
			receive++;
		}
		i2c_Delay();
	}
	if(ack) {
		i2c_Ack();
	} else {
		i2c_NAck();
	}
	return receive;
}
/*
*********************************************************************************************************
*	函 数 名: i2c_WaitAck
*	功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*	形    参:  无
*	返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{
	uint8_t ucErrTime=0;
	
	SDA_IN();      //SDA设置为输入

	I2C_SDA_1();	/* CPU释放SDA总线 */
	
	i2c_Delay();
	I2C_SCL_1();	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
	i2c_Delay();
	while (I2C_SDA_READ())	/* CPU读取SDA口线状态 */
	//while (SDA_READ())
	{
		ucErrTime++;
		if(ucErrTime>250) {
			i2c_Stop();
			return 1;
		}
	}
	I2C_SCL_0();
	i2c_Delay();
	return 0;
}
Exemple #15
0
/*
*********************************************************************************************************
*	函 数 名: i2c_ReadByte
*	功能说明: CPU从I2C总线设备读取8bit数据
*	形    参:无
*	返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;

	/* 读到第1个bit为数据的bit7 */
	value = 0;
	I2C_SDA_1();
	for (i = 0; i < 8; i++)
	{
		value <<= 1;
		I2C_SCL_0();
		i2c_Delay();
		I2C_SCL_1();
		i2c_Delay();
		if (I2C_SDA_READ())
		{
			value|=0x01;
		}

	}

	return value;
}