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