Beispiel #1
0
/**************************实现函数********************************************
*函数原型:void iic_nack(void)
*功  能:产生NACK应答
*******************************************************************************/	    
void iic_nack(void)
{
	IIC_SCL_L();
	SDA_OUT();
	IIC_SDA_H();
	delay_us(1);
	IIC_SCL_H();
	delay_us(1);
	IIC_SCL_L();
}					 				     
Beispiel #2
0
u8 IIC_ReadBit(void)
{
	u8 i,Temp=0;
	IIC_SDA_In();
	for(i=0;i<8;i++)
	{
		IIC_SCL_L();
		IIC_Delay(1);
		IIC_SCL_H();
		Temp<<=1;
		if(IIC_SDA_Read())
		   Temp++;
		IIC_Delay(1);
	}
	IIC_SCL_L();
	return Temp;
}
Beispiel #3
0
/**************************实现函数********************************************
*函数原型:void iic_stop(void)
*功  能:产生IIC停止信号
*******************************************************************************/	  
void iic_stop(void)
{
	SDA_OUT();	//sda线输出
	IIC_SCL_L();
	IIC_SDA_L();	//STOP:when CLK is high DATA change form low to high
 	delay_us(1);
	IIC_SCL_H(); 
	IIC_SDA_H();	//发送I2C总线结束信号
	delay_us(1);
}
Beispiel #4
0
/**************************实现函数********************************************
*函数原型:void iic_start(void)
*功  能:产生IIC起始信号
*******************************************************************************/
void iic_start(void)
{
	SDA_OUT();	//sda线输出
	IIC_SDA_H();
	IIC_SCL_H();
	delay_us(1);
 	IIC_SDA_L();	//START:when CLK is high,DATA change form high to low 
	delay_us(1);
	IIC_SCL_L();	//钳住I2C总线,准备发送或接收数据 
}
Beispiel #5
0
/**************************实现函数********************************************
*函数原型:void iic_send_8bits(uint8_t txd)
*功  能:IIC发送一个字节
*******************************************************************************/		  
void iic_send_8bits(uint8_t txd)
{                        
	uint8_t t;   
	SDA_OUT(); 	    
	IIC_SCL_L();	//拉低时钟开始数据传输
	for(t=0;t<8;t++)
	{              
		if( txd & 0x80 ) 
			IIC_SDA_H();
		else 
			IIC_SDA_L();
		txd <<= 1; 	  
		delay_us(1);
		IIC_SCL_H();
		delay_us(1);
		IIC_SCL_L();	
		delay_us(1);
	}	 
} 	 
Beispiel #6
0
void IIC_WriteBit(u8 Temp)
{
	u8 i;
	IIC_SDA_Out();
	IIC_SCL_L();
	for(i=0;i<8;i++)
	{
		if(Temp&0x80)
		{
			IIC_SDA_H();
		}
		else
		{
			IIC_SDA_L();
		}
		Temp<<=1;
		IIC_Delay(1);
		IIC_SCL_H();
		IIC_Delay(1);
		IIC_SCL_L();
	}
}
Beispiel #7
0
/**************************实现函数********************************************
*函数原型:uint8_t iic_read_8bits(uint8_t ack)
*功  能:读1个字节
*          ack = SEND_ACK时,发送ACK
*          ack = SEND_NACK时,发送NACK
*******************************************************************************/  
uint8_t iic_read_8bits(uint8_t ack)
{
	uint8_t i,receive = 0;
	SDA_IN();	//SDA设置为输入
	for(i=0;i<8;i++ )
	{
		IIC_SCL_L(); 
		delay_us(1);
		IIC_SCL_H();
		receive <<= 1;
		if(READ_SDA)
			receive++;   
		__NOP();
	}					 
	if (ack)
		iic_ack();	//发送ACK 
	else
		iic_nack();	//发送nACK  
	return receive;
}
Beispiel #8
0
/*
void IIC_Start(void)								  
{
	IIC_SDA_Out();
	IIC_SDA_H();
	IIC_SCL_H();
	IIC_Delay(1);
	IIC_SDA_L();
	IIC_Delay(1);
	IIC_SCL_L();
}

void IIC_Stop(void)
{
	IIC_SDA_Out();
	IIC_SCL_L();
	IIC_SDA_L();
	IIC_Delay(1);
	IIC_SCL_H();
	IIC_SDA_H();
	IIC_Delay(1);
}

void IIC_Ack(u8 re)					     
{
	IIC_SDA_Out();
	if(re)
	   IIC_SDA_H();
	else
	   IIC_SDA_L();
	IIC_SCL_H();
	IIC_Delay(1);
	IIC_SCL_L();
	IIC_Delay(1);
}
*/
int IIC_WaitAck(void)
{
	u16 Out_Time=1000;
    
    IIC_SDA_H();
	IIC_SDA_In();
	IIC_Delay(1);
	IIC_SCL_H();
	IIC_Delay(1);
	while(IIC_SDA_Read())
	{
		if(--Out_Time)
		{
			IIC_Stop();
            printf("error 2A\r\n");
            return 0xff;
		}
	}
	IIC_SCL_L();
    return 0;
}
Beispiel #9
0
/**************************实现函数********************************************
*函数原型:uint8_t iic_wait_ack(void)
*功  能:等待应答信号到来 
*返 回 值:DEBUG_ACK_TIMEOUT,接收应答失败
*          DEBUG_SUCCESS,接收应答成功
*******************************************************************************/
uint8_t iic_wait_ack(void)
{
	uint8_t ucErrTime=0;
	SDA_IN();	//SDA设置为输入  
	IIC_SDA_H();
	delay_us(1);
	IIC_SCL_H();
	delay_us(1);
	while(READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>100)
		{
			iic_stop();
			ack_timeout_cnt++;
			return IIC_ACK_TIMEOUT;
		}
		delay_us(1);
	}
	IIC_SCL_L();	//时钟输出0 

	ack_success_cnt++;
	return IIC_SUCCESS;  
}