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

289 lines
5.9 KiB
C
Raw Normal View History

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