TMP112配置-GD32F350程序

#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();
}


 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值