基于cubemx生成的hal库读取sht20传感器的值。
主控使用的是f407vet6,使用keil5.
**
一,生成iic底层驱动代码。
**
打开cubemx,选择对应的主控,同时打开串口1,和iic1.
打开串口是为了将温度的值,输出到串口助手上。
这一步,网上有许多教程,在此就不做赘述了。
将生成好的工程,使用keil打开。
**
二 ,配置串口函数
**
在生成的 usart,c底部加上
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
加上这一句,就可以正常的使用printf()。来输出了。
**
三 ,认识iic驱动函数
这是我们读取数据所使用的函数
第一个参数,使我们的iic的结构体。
第二个参数,读取数据,或者发送指令的地址
第三个参数 读取,发送数据的指针
第四个 数据的大小
第五个,超时时间
**
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
**
四,编写驱动函数
**
我们只需要用到前两个寄存器的值,用来读取温度,和湿度。所谓的保持主机,非保持主机,就是在读取数据的时候,iic总线能不能执行其他操作。
用户寄存器就是我们用来配置sht20的温湿度数据的精度,使用默认精度。
sht20的地址是0x80 ,写数据采用0x80 ,读数据使用0x81.
读取数据的时序图,如上图所示。
首先发送 0x80 ,在发送读取温湿度的指令,在发送0x81 ,读取数据,
最后一位是校验位,本次实验中没有读取。知道了以上步骤,就可以来读取温湿度了。
sht20.h 的宏定义如下
#define add_w 0x80 //d地址写
#define add_r 0x81 //地址读
#define measure_temp 0xe3 //读取温度
#define measure_hum 0xe5 //读取湿度
#define user_code_w 0xe6 //Óû§¼Ä´æÆ÷д
#define user_code_r 0xe7 //Óû§¼Ä´æÆ÷¶Á
#define RST_code 0xfe //Èí¸´Î»
读取温度函数如下
float read_temp(uint8_t cmd)
{
uint8_t date=cmd,buff[2];
uint16_t temp=0;
float temp1;
HAL_I2C_Master_Transmit(&hi2c1,add_w,&date,1,100);
// 发送写指令,在将读取温度的指令发送
HAL_I2C_Master_Receive(&hi2c1,add_r,buff,2,100);
//发送读指令,将读取数据的指针传过去
//temp=(buff[0]<<8)|buff[1];
temp=(uint16_t)buff[0];
temp=temp<<8;
temp=buff[1]|temp;
因为读取的数据是两个八位数,转换为16位
temp1=-46.85+175.72*((float)temp/65536);
转换公式,来自数据手册,见下图。
return temp1;
}
读取湿度函数
float read_humi(uint8_t cmd)
{
uint8_t date=cmd,buff[2];
uint16_t humi=0;
float temp1;
HAL_I2C_Master_Transmit(&hi2c1,add_w,&date,1,100);
HAL_I2C_Master_Receive(&hi2c1,add_r,buff,2,100);
//temp=(buff[0]<<8)|buff[1];
humi=(uint16_t)buff[0];
humi=humi<<8;
humi=buff[1]|humi;
temp1=-6+125*((float)humi/65536);
return temp1;
}
程序编写完成以后。主循环里面进行调用
查看上位机的数据
sht20 读取大功告成。
有什么不明白的地方,留言告诉我就好了。