289 lines
5.9 KiB
C
289 lines
5.9 KiB
C
|
#include "bsp_temperature.h"
|
|||
|
|
|||
|
|
|||
|
rt_device_t bsp_temper_dev = RT_NULL;
|
|||
|
extern iic_control_t iic_ctl_temper;
|
|||
|
|
|||
|
#if USE_IIC_EXTEND_TEMP
|
|||
|
|
|||
|
rt_err_t temper_init(rt_device_t dev)
|
|||
|
{
|
|||
|
uint32_t serial_number = 0;
|
|||
|
|
|||
|
user_iic_init();
|
|||
|
|
|||
|
LOG_OUT("temper_init\r\n");
|
|||
|
|
|||
|
uint8_t data_read[6] = {0};
|
|||
|
|
|||
|
user_iic_read_byte_more_16bit(SHT3X_ADDR, SHT3X_SERIAL_NUM, data_read, 6);
|
|||
|
|
|||
|
if( SHT3X_CRC_Check(data_read, 2, data_read[2]) == 1)
|
|||
|
{
|
|||
|
if( SHT3X_CRC_Check(data_read+3, 2, data_read[5]) == 1)
|
|||
|
{
|
|||
|
LOG_OUT("SHT3X_CRC_Check ok\r\n");
|
|||
|
}
|
|||
|
}
|
|||
|
for(uint8_t t=0; t<6; t++)
|
|||
|
{
|
|||
|
LOG_OUT("%x=%x\r\n", t, data_read[t]);
|
|||
|
}
|
|||
|
LOG_OUT("\r\n");
|
|||
|
|
|||
|
serial_number = (data_read[0]<<24) |
|
|||
|
(data_read[1]<<16) |
|
|||
|
(data_read[3]<<8) |
|
|||
|
(data_read[4]) ;
|
|||
|
|
|||
|
LOG_OUT("serial_number=%d \r\n", serial_number);
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
#else
|
|||
|
|
|||
|
rt_err_t temper_init(rt_device_t dev)
|
|||
|
{
|
|||
|
uint32_t serial_number = 0;
|
|||
|
//打开
|
|||
|
SHT3X_HIGH;
|
|||
|
SHT3X_SCL_HIGH;
|
|||
|
SHT3X_SDA_HIGH;
|
|||
|
rt_thread_mdelay(1000);
|
|||
|
|
|||
|
user_iic_init_extend(&iic_ctl_temper);
|
|||
|
|
|||
|
LOG_OUT("temper_init\r\n");
|
|||
|
|
|||
|
uint8_t data_read[6] = {0};
|
|||
|
|
|||
|
user_iic_read_byte_more_16bit_extend(&iic_ctl_temper, SHT3X_ADDR, SHT3X_SERIAL_NUM, data_read, 6);
|
|||
|
|
|||
|
for(uint8_t t=0; t<6; t++)
|
|||
|
{
|
|||
|
LOG_OUT("%x=%x\r\n", t, data_read[t]);
|
|||
|
}
|
|||
|
LOG_OUT("\r\n");
|
|||
|
|
|||
|
if( SHT3X_CRC_Check(data_read, 2, data_read[2]) == 1)
|
|||
|
{
|
|||
|
if( SHT3X_CRC_Check(data_read+3, 2, data_read[5]) == 1)
|
|||
|
{
|
|||
|
LOG_OUT("SHT3X_CRC_Check ok\r\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
serial_number = (data_read[0]<<24) |
|
|||
|
(data_read[1]<<16) |
|
|||
|
(data_read[3]<<8) |
|
|||
|
(data_read[4]) ;
|
|||
|
|
|||
|
LOG_OUT("serial_number=%d \r\n", serial_number);
|
|||
|
|
|||
|
//关闭
|
|||
|
SHT3X_LOW;
|
|||
|
SHT3X_SCL_LOW;
|
|||
|
SHT3X_SDA_LOW;
|
|||
|
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
rt_err_t temper_open(rt_device_t dev, rt_uint16_t oflag)
|
|||
|
{
|
|||
|
//LOG_OUT("temper_open\r\n");
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
|
|||
|
rt_err_t temper_close(rt_device_t dev)
|
|||
|
{
|
|||
|
//LOG_OUT("temper_close\r\n");
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
|
|||
|
#if USE_IIC_EXTEND_TEMP
|
|||
|
|
|||
|
rt_size_t temper_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
|
|||
|
{
|
|||
|
LOG_OUT("temper_read\r\n");
|
|||
|
|
|||
|
uint8_t data_r[6] = {0};
|
|||
|
float Temperature = 0;
|
|||
|
float Humidity = 0;
|
|||
|
|
|||
|
user_iic_read_byte_more_16bit(SHT3X_ADDR, SHT3X_READ_DATA, data_r, 6);
|
|||
|
|
|||
|
for(uint8_t t=0; t<6; t++)
|
|||
|
{
|
|||
|
LOG_OUT("%x ",data_r[t]);
|
|||
|
}
|
|||
|
LOG_OUT("\r\n");
|
|||
|
|
|||
|
if( SHT3X_CRC_Check(data_r, 2, data_r[2]) == 1)
|
|||
|
{
|
|||
|
if( SHT3X_CRC_Check(data_r+3, 2, data_r[5]) == 1)
|
|||
|
{
|
|||
|
LOG_OUT("SHT3X_CRC_Check ok\r\n");
|
|||
|
|
|||
|
Temperature = data_r[0] << 8 | data_r[1];
|
|||
|
Humidity = data_r[3] << 8 | data_r[4];
|
|||
|
Temperature = (Temperature * 175.0 / 65535) - 45.0;
|
|||
|
Humidity = Humidity * 100.0 / 65535;
|
|||
|
LOG_OUT("Temperature=%f \r\n", Temperature);
|
|||
|
LOG_OUT("Humidity=%f \r\n", Humidity);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
#else
|
|||
|
|
|||
|
|
|||
|
rt_size_t temper_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
|
|||
|
{
|
|||
|
LOG_OUT("temper_read\r\n");
|
|||
|
|
|||
|
uint8_t data_r[6] = {0};
|
|||
|
float Temperature = 0;
|
|||
|
float Humidity = 0;
|
|||
|
|
|||
|
int temp =0;
|
|||
|
uint8_t temp_buff[4] = {0};
|
|||
|
|
|||
|
//打开
|
|||
|
SHT3X_HIGH;
|
|||
|
SHT3X_SCL_HIGH;
|
|||
|
SHT3X_SDA_HIGH;
|
|||
|
rt_thread_mdelay(1000);
|
|||
|
|
|||
|
user_iic_read_byte_more_16bit_extend(&iic_ctl_temper, SHT3X_ADDR, SHT3X_READ_DATA, data_r, 6);
|
|||
|
for(uint8_t t=0; t<6; t++)
|
|||
|
{
|
|||
|
LOG_OUT("%x ",data_r[t]);
|
|||
|
}
|
|||
|
LOG_OUT("\r\n");
|
|||
|
|
|||
|
//关闭
|
|||
|
SHT3X_LOW;
|
|||
|
SHT3X_SCL_LOW;
|
|||
|
SHT3X_SDA_LOW;
|
|||
|
|
|||
|
if( SHT3X_CRC_Check(data_r, 2, data_r[2]) == 1)
|
|||
|
{
|
|||
|
if( SHT3X_CRC_Check(data_r+3, 2, data_r[5]) == 1)
|
|||
|
{
|
|||
|
LOG_OUT("CRC_Check ok\r\n");
|
|||
|
|
|||
|
Temperature = data_r[0] << 8 | data_r[1];
|
|||
|
Humidity = data_r[3] << 8 | data_r[4];
|
|||
|
Temperature = (Temperature * 175.0 / 65535) - 45.0;
|
|||
|
Humidity = Humidity * 100.0 / 65535;
|
|||
|
LOG_OUT("Temperature=%f \r\n", Temperature);
|
|||
|
LOG_OUT("Humidity=%f \r\n", Humidity);
|
|||
|
|
|||
|
temp = (short int)((Temperature+0.05)*10);
|
|||
|
|
|||
|
if(temp >= 0)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
temp = (-(temp))|0x8000;
|
|||
|
}
|
|||
|
|
|||
|
temp_buff[0] = (temp>>8)&0xFF;
|
|||
|
temp_buff[1] = (temp)&0xFF;
|
|||
|
LOG_OUT("temp=%d \r\n", temp);
|
|||
|
|
|||
|
|
|||
|
temp = (int)((Humidity+0.05)*10);
|
|||
|
temp_buff[2] = (temp>>8)&0xFF;
|
|||
|
temp_buff[3] = (temp)&0xFF;
|
|||
|
LOG_OUT("hum=%d \r\n", temp);
|
|||
|
|
|||
|
memcpy(buffer, temp_buff, 4);
|
|||
|
|
|||
|
return 4;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
rt_size_t temper_write(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
|
|||
|
{
|
|||
|
//LOG_OUT("temper_write\r\n");
|
|||
|
}
|
|||
|
|
|||
|
rt_err_t temper_control(rt_device_t dev, int cmd, void *args)
|
|||
|
{
|
|||
|
//LOG_OUT("temper_control\r\n");
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int bsp_temper_init(void)
|
|||
|
{
|
|||
|
bsp_temper_dev = rt_device_create(RT_Device_Class_Char, 1);
|
|||
|
if(bsp_temper_dev == RT_NULL)
|
|||
|
{
|
|||
|
LOG_OUT("bsp_temper_dev ERR!!!\r\n");
|
|||
|
}
|
|||
|
|
|||
|
bsp_temper_dev->init = temper_init;
|
|||
|
bsp_temper_dev->open = temper_open;
|
|||
|
bsp_temper_dev->close = temper_close;
|
|||
|
bsp_temper_dev->read = temper_read;
|
|||
|
bsp_temper_dev->write = NULL;
|
|||
|
bsp_temper_dev->control = NULL;
|
|||
|
|
|||
|
rt_device_register(bsp_temper_dev, "temper", RT_DEVICE_FLAG_RDWR);
|
|||
|
|
|||
|
LOG_OUT("bsp_temper_init ok\r\n");
|
|||
|
return RT_EOK;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
uint8_t SHT3X_CRC_Check(uint8_t *check_data, uint8_t num, uint8_t check_crc)
|
|||
|
{
|
|||
|
uint8_t bit = 0; // bit mask
|
|||
|
uint8_t crc = 0xFF; // calculated checksum
|
|||
|
uint8_t byteCtr = 0; // byte counter
|
|||
|
|
|||
|
// calculates 8-Bit checksum with given polynomial x8+x5+x4+1
|
|||
|
for(byteCtr = 0; byteCtr < num; byteCtr++)
|
|||
|
{
|
|||
|
crc ^= (*(check_data+byteCtr));
|
|||
|
//crc校验,最高位是1就^0x31
|
|||
|
for(bit = 8; bit > 0; --bit)
|
|||
|
{
|
|||
|
if(crc & 0x80)
|
|||
|
crc = (crc << 1) ^ 0x31;
|
|||
|
else
|
|||
|
crc = (crc << 1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LOG_OUT("crc=%x \r\n", crc);
|
|||
|
|
|||
|
if(crc==check_crc)
|
|||
|
return 1;
|
|||
|
else
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|