www.pudn.com > TMP112.zip > i2c.c, change:2016-07-21,size:3037b


#include "i2c.h" 
//初始化IIC 
void IIC_Init(void) 
{					      
	GPIO_InitTypeDef GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStructure); 
	IIC_SCL1; 
	IIC_SDA1; 
} 
void SDA_IN(void) 
{ 
		GPIO_InitTypeDef GPIO_InitStructure; 
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 
		GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7; 
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入  
		GPIO_Init(GPIOB, &GPIO_InitStructure); 
} 
void SDA_OUT(void) 
{ 
	GPIO_InitTypeDef GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStructure); 
} 
//产生IIC起始信号 
void IIC_Start(void) 
{ 
	SDA_OUT();     //sda线输出 
	IIC_SDA1;	  	   
	IIC_SCL1; 
	delay_us(4); 
 	IIC_SDA0;//START:when CLK is high,DATA change form high to low  
	delay_us(4); 
	IIC_SCL0;//钳住I2C总线,准备发送或接收数据  
}	   
//产生IIC停止信号 
void IIC_Stop(void) 
{ 
	SDA_OUT();//sda线输出 
	IIC_SCL0; 
	IIC_SDA0;//STOP:when CLK is high DATA change form low to high 
 	delay_us(4); 
	IIC_SCL1;  
	IIC_SDA1;//发送I2C总线结束信号 
	delay_us(4);							   	 
} 
//等待应答信号到来 
//返回值:1,接收应答失败 
//        0,接收应答成功 
u8 IIC_Wait_Ack(void) 
{ 
	u8 ucErrTime=0; 
	SDA_IN();      //SDA设置为输入   
	IIC_SDA1;delay_us(1);	    
	IIC_SCL1;delay_us(1);	  
	while(READ_SDA) 
	{ 
		ucErrTime++; 
		if(ucErrTime>250) 
		{ 
			IIC_Stop(); 
			return 1; 
		} 
	} 
	IIC_SCL0;//时钟输出0 	    
	return 0;   
}  
//产生ACK应答 
void IIC_Ack(void) 
{ 
	IIC_SCL0; 
	SDA_OUT(); 
	IIC_SDA0; 
	delay_us(2); 
	IIC_SCL1; 
	delay_us(2); 
	IIC_SCL0; 
} 
//不产生ACK应答		     
void IIC_NAck(void) 
{ 
	IIC_SCL0; 
	SDA_OUT(); 
	IIC_SDA1; 
	delay_us(2); 
	IIC_SCL1; 
	delay_us(2); 
	IIC_SCL0; 
}					 				      
//IIC发送一个字节 
//返回从机有无应答 
//1,有应答 
//0,无应答			   
void IIC_Send_Byte(u8 txd) 
{                         
    u8 t;    
	  SDA_OUT(); 	     
    IIC_SCL0;//拉低时钟开始数据传输 
    for(t=0;t<8;t++) 
    {    
        if((txd&0x80)==0x80)	IIC_SDA1; 
        else		IIC_SDA0;	 
        //IIC_SDA=(txd&0x80)>>7; 
        txd<<=1; 	   
		delay_us(2);   //对TEA5767这三个延时都是必须的 
		IIC_SCL1; 
		delay_us(2);  
		IIC_SCL0;	 
		delay_us(2); 
    }	  
} 	     
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK    
u8 IIC_Read_Byte(unsigned char ack) 
{ 
	unsigned char i,receive=0; 
	SDA_IN();//SDA设置为输入 
    for(i=0;i<8;i++ ) 
	{ 
        IIC_SCL0;  
        delay_us(2); 
		IIC_SCL1; 
        receive<<=1; 
        if(READ_SDA)receive++;    
		delay_us(1);  
    }					  
    if (!ack) 
        IIC_NAck();//发送nACK 
    else 
        IIC_Ack(); //发送ACK    
    return receive; 
}