LW21-02B-DcStep-V1.0/Hyt2/BSP/Driver/tmp75/tmp75.c

275 lines
4.5 KiB
C
Raw Permalink Normal View History

///Copyright (c) 2022, <20>Ĵ<EFBFBD><C4B4><EFBFBD>Դ<EFBFBD><D4B4>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
///All rights reserved.
///@file tmp75.C
///@brief tmp75<37><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///
///@details
///@note
///@author lqc
///@date 2022/05/23
///
///@version v1.0 2022/05/23 <20><>ʼ<EFBFBD>
#include "tmp75.h"
/*
@ brief <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-5-23
*/
static void delay_us(int us)
{
for(int i = 0; i < us; i++ )
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/*
@ brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>tmp75оƬGPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-5-23 lqc
*/
void temp75_gpio_init()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOB);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ:PB6
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PB7<42><37><EFBFBD><EFBFBD>ģʽ
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
TMP75_SCL_HIGH;
TMP75_SDA_HIGH;
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
@ param
@ return
@ note 2022-5-25 lqc
*/
static void tmp75_sda_output()
{
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
@ param
@ return
@ note 2022-5-25 lqc
*/
static void tmp75_sda_input()
{
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
// gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}
/*
@ brief I2C start<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note 2022-5-25
*/
static void i2c_start()
{
TMP75_SDA_HIGH;
TMP75_SCL_HIGH;
TMP75_SDA_LOW;
delay_us(40);
}
/*
@ brief I2C stop<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note 2022-05-25
*/
static void i2c_stop()
{
TMP75_SDA_LOW;
TMP75_SCL_HIGH;
TMP75_SDA_HIGH;
}
/*
@ brief дһ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-05-25
*/
static void tmp75_write_byte(uint8_t byte)
{
for(int i = 0; i < 8; i++)
{
TMP75_SCL_LOW;
delay_us(4);
if(byte & 0x80)
{
TMP75_SDA_HIGH;
}else{
TMP75_SDA_LOW;
}
byte <<= 1;
TMP75_SCL_HIGH;
delay_us(40);
}
TMP75_SCL_LOW;
}
/*
@ brief д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>TMP75<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ACK<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note
*/
static void tmp75_ack()
{
int i = 0;
//<2F><>sda<64><61><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ
tmp75_sda_input();
TMP75_SCL_HIGH;
while((TMP75_SDA_GET) && (i < 1000))
{
i++;
}
TMP75_SCL_LOW;
//<2F><>sda<64><61><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ
tmp75_sda_output();
}
/*
@ brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return value:<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ note 2022-05-25
*/
static uint8_t tmp75_read_byte()
{
uint8_t value = 0;
tmp75_sda_input();
TMP75_SCL_LOW;
for(int i = 0; i < 8; i++)
{
TMP75_SCL_HIGH;
value <<= 1;
delay_us(10);
if(TMP75_SDA_GET)
{
value = value | 0x01;
}
TMP75_SCL_LOW;
delay_us(10);
}
tmp75_sda_output();
return value;
}
/*
@ brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ack<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note 2022-05-25
*/
static void master_ack()
{
TMP75_SDA_LOW;
delay_us(5);
TMP75_SCL_HIGH;
delay_us(5);
TMP75_SCL_LOW;
delay_us(5);
}
/*
@ brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>noack<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note 2022-05-26
*/
static void master_noack()
{
TMP75_SDA_HIGH;
delay_us(5);
TMP75_SCL_HIGH;
delay_us(5);
TMP75_SCL_LOW;
delay_us(5);
}
/*
@ brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ֵ
@ param
@ return
@note 2022-05-25
*/
float tmp75_read_temp(void)
{
uint8_t tempH = 0;
uint8_t tempL = 0;
uint16_t tempCode = 0;
float temp = 0;
//<2F><>ʼ<EFBFBD>ź<EFBFBD>
i2c_start();
//дtmp75<37><35>ַ
tmp75_write_byte(TMP75_ADDRESS);
//<2F><><EFBFBD><EFBFBD>tmp75<37><35>ack<63><6B>Ϣ
tmp75_ack();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݵĵ<DDB5>ַ
tmp75_write_byte(TEMP_REGISTER_ADDRESS);
tmp75_ack();
i2c_start();
//дtmp75<37><35>ַ
tmp75_write_byte(TMP75_ADDRESS + 1); //<2F><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
tmp75_ack();
tempH = tmp75_read_byte();
master_ack();
tempL = tmp75_read_byte();
master_noack();
i2c_stop();
tempCode = (tempH << 8) | tempL;
tempCode = tempCode >> 6;
if(tempCode & 0x200) //<2F><><EFBFBD><EFBFBD>
{
tempCode &= 0x1ff;
temp = ((float)tempCode -512) / 4;
}
else
{
temp = (float)tempCode / 4;
}
TMP75_SDA_LOW;
TMP75_SCL_LOW;
return (temp);
}