#include "TMP_Config.h"
void TMP_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14); //PB6,PB7 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void SDA_TMP_IN(void)//SDA????-PA1
{
//SDA PC13
GPIOC->CRH&=0XFF0FFFFF;GPIOC->CRH|=(u32)8<<20;
}
//SDA PC13
void SDA_TMP_OUT(void)//SDA????-PA1
{
GPIOC->CRH&=0XFF0FFFFF;GPIOC->CRH|=(u32)3<<20;
}
//??IIC????
void IIC1_Start(void)
{
SDA_TMP_OUT(); //sda???
SetSDA1;
SetSCL1;
delay_us(100);
ResetSDA1;//START:when CLK is high,DATA change form high to low
delay_us(100);
ResetSCL1;//??I2C??,????????? //scl?????,????????
}
//??IIC????
void IIC1_Stop(void)
{
SDA_TMP_OUT();//sda???
ResetSDA1 ;//STOP:when CLK is high DATA change form low to high
SetSCL1;
delay_us(100);
SetSDA1;
//??I2C??????
delay_us(100);
}
//????????
//????????
//???:1,??????
// 0,??????
//uint8_t IIC1_Wait_Ack(void)
//{
// uint8_t ucErrTime=0;
//
// SDA_TMP_IN(); //SDA?????
// SetSCL1;
// delay_1us(100);
//
// if(InputSDA1==0)
// {
// ResetSCL1;//????0
// return 0; //????
// }
// else
// {
// while(InputSDA1)
// {
// ucErrTime++;
// if(ucErrTime>250)
// {
// IIC1_Stop();
// return 1; //????
// break; //?????,????
// }
//
// }
// }
//
//}
uint8_t IIC1_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SDA_TMP_IN(); //SDA?????
SetSDA1;
delay_us(100);
SetSCL1;
delay_us(100);
while(InputSDA1)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC1_Stop();
return 1;
}
}
ResetSCL1;//????0
return 0;
}
//??ACK??
//????????
void IIC1_Ack(void)
{
ResetSCL1;
SDA_TMP_OUT();
ResetSDA1 ;
delay_us(100);
SetSCL1;
delay_us(100);
ResetSCL1;
}
//???ACK??
//????????
void IIC1_NAck(void)
{
ResetSCL1;
SDA_TMP_OUT();
SetSDA1;
delay_us(100);
SetSCL1;
delay_us(100);
ResetSCL1;
}
//IIC??????
//????????
void IIC1_Send_Byte(uint8_t txd)
{
uint8_t t,IIC_SDA;
SDA_TMP_OUT();
ResetSCL1;//??????????
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
if(IIC_SDA==1)
SetSDA1;
else
ResetSDA1;
txd<<=1;
delay_us(100);
SetSCL1;
delay_us(100);
ResetSCL1;
delay_us(100);
}
}
//?1???,ack=1?,??ACK,ack=0,??nACK
//???:????????
uint8_t IIC1_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_TMP_IN();//SDA?????
for(i=0;i<8;i++ )
{
ResetSCL1;
delay_us(100);
SetSCL1;
receive<<=1;
if(InputSDA1)receive++; //???,receive 2???10???????
delay_us(100);
}
if (!ack)
IIC1_NAck();//??nACK
else
IIC1_Ack(); //??ACK
return receive;
}
/******************************************************************************
function: Send one byte of data to TMP112 via I2C
parameter:
Addr: Register address
Value: Write to the value of the register
Info:
******************************************************************************/
void TMP112_Write_Byte(uint8_t Addr,uint8_t Value)
{
IIC1_Start();
IIC1_Send_Byte(0X92); //?????,????
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr); //???????
IIC1_Wait_Ack();
IIC1_Send_Byte(Value);
IIC1_Wait_Ack();
IIC1_Stop();//????????
delay_us(100);
}
/******************************************************************************
function: read one byte of data to TMP112 via I2C
parameter:
Addr: Register address
Value: Write to the value of the register
Info:
******************************************************************************/
int TMP112_Read_Byte(uint8_t Addr)
{
uint8_t slave=0;
IIC1_Start();
IIC1_Send_Byte(0X92);//??????
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????
IIC1_Wait_Ack();
IIC1_Start();
IIC1_Send_Byte(0X93);//????????,???
IIC1_Wait_Ack();
slave=IIC1_Read_Byte(0);
IIC1_Stop();//????????
delay_us(100);
return slave;
}
uint8_t TempH,TempL=0;
/******************************************************************************
function: read one temparature to TMP112 via I2C
parameter:
Addr: Register address
Value: Write to the value of the register
Info:
******************************************************************************/
float TMP112_Read_temp(uint8_t Addr)
{
float temp=0;
IIC1_Start();
//
//GND A1 A0(0,0)
//V+ A1 A0(0,1)
//SDA A1 A0(1,0)
//SCL A1 A0(1,1)
IIC1_Send_Byte(0X92);//?????? //写入的 从机的地址 1001 0 A1(0) A0() 0往里写数据所以是0Write
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????-?????
IIC1_Wait_Ack();
IIC1_Stop();
IIC1_Start();
// IIC1_Send_Byte(0X92);//????????,???
// IIC1_Wait_Ack();
// IIC1_Send_Byte(Addr);//???????-?????
// IIC1_Wait_Ack();
IIC1_Send_Byte(0X93);//????????,???
IIC1_Wait_Ack();
TempH=IIC1_Read_Byte(1);
TempL=IIC1_Read_Byte(1);
IIC1_Stop();//????????
delay_us(100);
// TempH=TempH>>4;
// TempL=TempL>>4;
temp=(TempH*256+TempL)*0.0625*0.0625;
return temp;
}
float TMP112_Read_Top_Temp(uint8_t Addr)
{
float Top_Temp=0;
IIC1_Start();
//
//GND A1 A0(0,0)
//V+ A1 A0(0,1)
//SDA A1 A0(1,0)
//SCL A1 A0(1,1)
IIC1_Send_Byte(0X92);//?????? //写入的 从机的地址 1001 0 A1(0) A0(1) 0往里写数据所以是0Write
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????-?????
IIC1_Wait_Ack();
IIC1_Stop();
IIC1_Start();
// IIC1_Send_Byte(0X92);//????????,???
// IIC1_Wait_Ack();
// IIC1_Send_Byte(Addr);//???????-?????
// IIC1_Wait_Ack();
IIC1_Send_Byte(0X93);//????????,???
//写入的 从机的地址 1001 0 A1(0) A0(1) 1往里写数据所以是0Write
IIC1_Wait_Ack();
TempH=IIC1_Read_Byte(1);
TempL=IIC1_Read_Byte(1);
IIC1_Stop();//????????
delay_us(100);
// TempH=TempH>>4;
// TempL=TempL>>4;
Top_Temp=(TempH*256+TempL)*0.0625*0.0625;
return Top_Temp;
}
u16 TMP112_Read_Configuration(uint8_t Addr)
{
u16 Res=0;
u8 Res_H=0;
u8 Res_L=0;
IIC1_Start();
//
//GND A1 A0(0,0)
//V+ A1 A0(0,1)
//SDA A1 A0(1,0)
//SCL A1 A0(1,1)
IIC1_Send_Byte(0X92);//?????? //写入的 从机的地址 1001 0 A1(0) A0(1) 0往里写数据所以是0Write
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????-?????
IIC1_Wait_Ack();
IIC1_Stop();
IIC1_Start();
// IIC1_Send_Byte(0X92);//????????,???
// IIC1_Wait_Ack();
// IIC1_Send_Byte(Addr);//???????-?????
// IIC1_Wait_Ack();
IIC1_Send_Byte(0X93);//????????,???
//写入的 从机的地址 1001 0 A1(0) A0(1) 1往里写数据所以是0Write
IIC1_Wait_Ack();
Res_H=IIC1_Read_Byte(1);
Res_L=IIC1_Read_Byte(1);
IIC1_Stop();//????????
delay_us(100);
// TempH=TempH>>4;
// TempL=TempL>>4;
return Res_L;
}
float TMP112_Read_Bot_Temp(uint8_t Addr)
{
float Bot_Temp=0;
IIC1_Start();
//
//GND A1 A0(0,0)
//V+ A1 A0(0,1)
//SDA A1 A0(1,0)
//SCL A1 A0(1,1)
IIC1_Send_Byte(0X92);//?????? //写入的 从机的地址 1001 0 A1(0) A0(1) 0往里写数据所以是0Write
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????-?????
IIC1_Wait_Ack();
IIC1_Stop();
IIC1_Start();
// IIC1_Send_Byte(0X92);//????????,???
// IIC1_Wait_Ack();
// IIC1_Send_Byte(Addr);//???????-?????
// IIC1_Wait_Ack();
IIC1_Send_Byte(0X93);//????????,???
//写入的 从机的地址 1001 0 A1(0) A0(1) 1往里写数据所以是0Write
IIC1_Wait_Ack();
TempH=IIC1_Read_Byte(1);
TempL=IIC1_Read_Byte(1);
IIC1_Stop();//????????
delay_us(100);
// TempH=TempH>>4;
// TempL=TempL>>4;
Bot_Temp=(TempH*256+TempL)*0.0625*0.0625;
return Bot_Temp;
}
void TMP112_Write_Bot_Temp(uint8_t Addr,uint8_t Set_Bot_Temp)
{
//以75举例 75/0.0625=1200
//1200换算成16进制就是4B0但是 它吧 4B放在一起去发送了
// 4B *256=19200 19200 *0.0625*0.0625
uint8_t Bot_TempH,Bot_TempL,Bot_Temp_Mid=0;
uint32_t Set_Bot_Temp_Final=(u32)(Set_Bot_Temp/0.0625);
uint8_t Save_High=Set_Bot_Temp_Final/256;
Bot_TempH=(Set_Bot_Temp_Final/256)<<4;
Bot_TempH=Bot_TempH&(0xF0);
Bot_Temp_Mid=(Set_Bot_Temp_Final-Save_High*256)>>4;
Bot_Temp_Mid=Bot_Temp_Mid&(0X0F);
Bot_TempH=Bot_TempH|Bot_Temp_Mid;
Bot_TempL=(Set_Bot_Temp_Final-Save_High*256)<<4;
Bot_TempL=Bot_TempL&(0xF0);
IIC1_Start();
//
//GND A1 A0(0,0)
//V+ A1 A0(0,1)
//SDA A1 A0(1,0)
//SCL A1 A0(1,1)
IIC1_Send_Byte(0X92);//?????? //写入的 从机的地址 1001 0 A1(0) A0(1) 0往里写数据所以是0Write
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????-?????
IIC1_Wait_Ack();
IIC1_Send_Byte(Bot_TempH);//???????-?????
IIC1_Wait_Ack();
IIC1_Send_Byte(Bot_TempL);//???????-?????
IIC1_Wait_Ack();
IIC1_Stop();
}
void TMP112_Write_Top_Temp(uint8_t Addr,uint8_t Set_Top_Temp)
{
//以75举例 75/0.0625=1200
//1200换算成16进制就是4B0但是 它吧 4B放在一起去发送了
// 4B *256=19200 19200 *0.0625*0.0625
uint8_t Top_TempH,Top_TempL,Top_Temp_Mid=0;
uint32_t Set_Top_Temp_Final=(u32)(Set_Top_Temp/0.0625);
uint8_t Save_High=Set_Top_Temp_Final/256;
Top_TempH=(Set_Top_Temp_Final/256)<<4;
Top_TempH=Top_TempH&(0xF0);
Top_Temp_Mid=(Set_Top_Temp_Final-Save_High*256)>>4;
Top_Temp_Mid=Top_Temp_Mid&(0X0F);
Top_TempH=Top_TempH|Top_Temp_Mid;
Top_TempL=(Set_Top_Temp_Final-Save_High*256)<<4;
Top_TempL=Top_TempL&(0xF0);
IIC1_Start();
//
//GND A1 A0(0,0)
//V+ A1 A0(0,1)
//SDA A1 A0(1,0)
//SCL A1 A0(1,1)
IIC1_Send_Byte(0X92);//?????? //写入的 从机的地址 1001 0 A1(0) A0(1) 0往里写数据所以是0Write
IIC1_Wait_Ack();
IIC1_Send_Byte(Addr);//???????-?????
IIC1_Wait_Ack();
IIC1_Send_Byte(Top_TempH);//???????-?????
IIC1_Wait_Ack();
IIC1_Send_Byte(Top_TempL);//???????-?????
IIC1_Wait_Ack();
IIC1_Stop();
}