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