Wells_RTthread/app_wells_0415/source insight/wells.si4project/Backup/bsp_temperature(495).c

289 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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