#include "iic2.h" #include "delay.h" #include "includes.h" void iic2_init(void) { rcu_periph_clock_enable(RCU_GPIOB);//使能GPIOB时钟 rcu_periph_clock_enable(RCU_GPIOE); //IIC时钟信号位 gpio_init(IIC2_SCL_PORT,GPIO_MODE_OUT_OD,GPIO_OSPEED_50MHZ,IIC2_SCL_PIN); gpio_bit_set(IIC2_SCL_PORT,IIC2_SCL_PIN); //IIC数据信号位 gpio_init(IIC2_SDA_PORT,GPIO_MODE_OUT_OD,GPIO_OSPEED_50MHZ,IIC2_SDA_PIN); gpio_bit_set(IIC2_SDA_PORT,IIC2_SDA_PIN); } //产生IIC起始信号 void IIC2_Start(void) { IIC2_SDA_OUT(); IIC2_SDA(1);//IIC_SDA = 1; IIC2_SCL(1);//IIC_SCL = 1; delay_us(4); IIC2_SDA(0);//IIC_SDA = 0;//START:when CLK is high,DATA change form high to low delay_us(4); IIC2_SCL(0);//IIC_SCL = 0;//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC2_Stop(void) { IIC2_SDA_OUT(); IIC2_SDA(0);//IIC_SDA = 0; IIC2_SCL(0);//IIC_SCL = 0; delay_us(4); IIC2_SCL(1);//IIC_SCL = 1; IIC2_SDA(1);//IIC_SDA = 1; delay_us(4); } //等待应答信号到来 //返回值: // 1,接收应答失败 // 0,接收应答成功 u8 IIC2_Wait_Ack(void) { uint8_t ucErrTime=0; IIC2_SDA_IN(); // SDA 配置成输入 IIC2_SDA(1);//IIC_SDA=1; delay_us(1); IIC2_SCL(1);//IIC_SCL=1; delay_us(1); while(IIC2_READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC2_Stop(); return 1; } } IIC2_SCL(0);//IIC_SCL=0; return 0; } //产生ACK应答 void IIC2_Ack(void) { IIC2_SCL(0);//IIC_SCL = 0; IIC2_SDA_OUT(); IIC2_SDA(0);//IIC_SDA = 0; delay_us(4); IIC2_SCL(1);//IIC_SCL = 1; delay_us(2); IIC2_SCL(0);//IIC_SCL = 0; } //不产生ACK应答 void IIC2_NAck(void) { IIC2_SCL(0);//IIC_SCL = 0; IIC2_SDA_OUT(); IIC2_SDA(1);//IIC_SDA = 1; delay_us(4); IIC2_SCL(1);//IIC_SCL = 1; delay_us(2); IIC2_SCL(0);//IIC_SCL = 0; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC2_Send_Byte(u8 txd) { uint8_t t; IIC2_SCL(0);//IIC_SCL=0;// 电平置低,开始传输数据 IIC2_SDA_OUT(); for(t=0;t<8;t++) { // IIC_SDA=(txd&0x80)>>7; if((txd&0x80)>>7) IIC2_SDA(1); else IIC2_SDA(0); txd<<=1; delay_us(4); // IIC2_SCL(1);//IIC_SCL=1; delay_us(2); IIC2_SCL(0);//IIC_SCL=0; delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC2_Read_Byte(u8 ack) { uint8_t i,receive=0; IIC2_SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { IIC2_SCL(0);//IIC_SCL=0; delay_us(4); IIC2_SCL(1);//IIC_SCL=1; receive<<=1; if(IIC2_READ_SDA)receive++; delay_us(1); } if(!ack) IIC2_NAck();//发送nACK else IIC2_Ack(); //发送ACK return receive; } ////////////////////////////////////////////////////////////////////////////////// void Tmp75_read(u8 *pBuffer) { u16 lentow; lentow = 2; IIC2_Start(); IIC2_Send_Byte(0x90);//写 IIC2_Wait_Ack(); IIC2_Send_Byte(0x00); //发送寄存器地址 IIC2_Wait_Ack(); delay_us(4); IIC2_Start(); IIC2_Send_Byte(0x91); //读 //进入接收模式 IIC2_Wait_Ack(); while(lentow) { *pBuffer=IIC2_Read_Byte(1); pBuffer++; //ReadAddr++; lentow--; } IIC2_Stop();//产生一个停止条件 } u8 Temp_buf[4]; float Temp_test(void) { float temp_data,tmp; iic2_init(); Tmp75_read(Temp_buf); //data_dump("temp Read", Temp_buf, 2); // printf("\ntemp Read "); // printf("%d ",Temp_buf[0]); // printf("%d \n",Temp_buf[1]); tmp = (float)(Temp_buf[1]>>4); tmp /= 16.0; temp_data = (float)Temp_buf[0] + tmp; // printf("\ntemp Read: "); // printf("%f\n",temp_data); return temp_data; }