0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32L083实现SHT30驱动

华仔的编程随笔 ? 来源:华仔的编程随笔 ? 作者:华仔的编程随笔 ? 2023-06-22 09:57 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

SHT3x是新一代的温湿度传感器,精度为±2%RH和±0.3℃,输入电压范围从2.4V到5.5V,采用IIC总线接口,速率可达1MHz。测量温湿度范围分别为是-40℃ ~ 125℃和0 ~ 100%。工作电流为600uA,空闲电流在2ua。因此非常适合用在低功耗温湿度监测项目之上。 SHT3X的获取温度只需要二步,一是发送温度转换命令,接着读取6个字节。进行温湿度测量,需先发送一个开始信号,然后发送一个 I2C的写操作头,然后再跟随一个 16 位的温湿度转换命令。传感器收到上位机发送的每个字节数据后,会通过将 SDA 总线拉到低电平给出ACK 信号。在正确的收到温湿度转换命令并发送 ACK 信号给微处理器之后,SHT3x 内部开始启动温度和湿度的转换测量。二是在传感器完成温湿度测量之后,上位机可以通过发送 START信号+I2C 读取数据头来 读取温湿度数据,如果温湿度数据已经准备好,那么芯片会向上位机发送 ACK 信号,并随后发送 2 字节的温度数据加 1 字节的 CRC 校验数据,然后再发送 2 字节的湿度数据加 1 字节的 CRC 校验数据。上位机需要对接收到的每个字节数据发送 ACK,否则芯片会停止发送数据。微处理器在收到湿度数据的CRC 字节后应该发送一个NACK 和一个 STOP 信号来结束本次数据传输,

下面开始CW32L083的温度采集:

1、选取PB10、PB11为I2C通信,采取软件I2C。初始化代码如下:

void IIC_Init(void)

{

//配置PB10 为输出

//使能GPIOB时钟

CW_SYSCTRL->AHBEN_f.GPIOB = 1;

//配置PB10 为输出

CW_GPIOB->ANALOG_f.PIN10 = 0; //设置 GPIOx_ANALOG.PINy 为 0,将端口配置为数字功能;

CW_GPIOB->DIR_f.PIN10 = 0; //设置 GPIOx_DIR.PINy 为 0,将端口配置成输出;

CW_GPIOB->OPENDRAIN_f.PIN10 = 0; //0:推挽输出

CW_GPIOB->ODR_f.PIN10 = 1;

CW_GPIOB->ANALOG_f.PIN11 = 0; //设置 GPIOx_ANALOG.PINy 为 0,将端口配置为数字功能;

CW_GPIOB->DIR_f.PIN11 = 0; //设置 GPIOx_DIR.PINy 为 0,将端口配置成输出;

CW_GPIOB->OPENDRAIN_f.PIN11 = 0; //0:推挽输出

CW_GPIOB->ODR_f.PIN11 = 1;

}

2、设置IO方向,SDA需要转换输出与输入,我们采用对 GPIOx_DIR.PINy进行设置,来实现IO的数据输入与输出的转换。

//IO方向设置(SDA)

/ xxxxxxxxxxxxxx ****/

void SDA_IN()

{

CW_GPIOB->DIR_f.PIN11 = 1; //设置 GPIOx_DIR.PINy 为 0,将端口配置成输出;

}

void SDA_OUT()

{

CW_GPIOB->DIR_f.PIN11 = 0; //设置 GPIOx_DIR.PINy 为 0,将端口配置成输出;

CW_GPIOB->OPENDRAIN_f.PIN11 = 0; //0:推挽输出

}

3、定义读取SDA的宏:#define READ_SDA PB11_GETVALUE() //输入SDA

4、定义IIC的STAT、STOP、ACK、NACK等时序,代码如下:

//产生IIC起始信号

void IIC_Start(void)

{

SDA_OUT(); //sda线输出

IIC_SDA=1;

IIC_SCL=1;

delay_us(4);

IIC_SDA=0;//START:when CLK is high,DATA change form high to low

delay_us(4);

IIC_SCL=0;//钳住I2C总线,准备发送或接收数据

}

//产生IIC停止信号

void IIC_Stop(void)

{

SDA_OUT();//sda线输出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

delay_us(4);

IIC_SCL=1;

IIC_SDA=1;//发送I2C总线结束信号

delay_us(4);

}

//等待应答信号到来

//返回值:1,接收应答失败

// 0,接收应答成功

/ xxxx修改超时时间 ***/

uint8_t IIC_Wait_Ack(void)

{

uint8_t ucErrTime=0;

SDA_IN(); //SDA设置为输入

IIC_SDA=1;delay_us(3);

IIC_SCL=1;delay_us(3);

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

//printf("超时
");

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//时钟输出0

return 0;

}

//产生ACK应答

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

//不产生ACK应答

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

5、定义发送一个字节:

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答

void IIC_Send_Byte(uint8_t txd)

{

uint8_t t;

SDA_OUT();

IIC_SCL=0;//拉低时钟开始数据传输

for(t=0;t<8;t++)

{

if((txd&0x80)>>7)

IIC_SDA=1;

else

IIC_SDA=0;

txd<<=1;

delay_us(2); //对TEA5767这三个延时都是必须的

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

delay_us(2);

}

}

6、定义读取一个字节

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK

uint8_t IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SDA_IN();//SDA设置为输入

for(i=0;i<8;i++ )

{

IIC_SCL=0;

delay_us(100);

IIC_SCL=1;

receive<<=1;

if(READ_SDA)receive++;

delay_us(100);

}

if (!ack)

IIC_NAck();//发送nACK

else

IIC_Ack(); //发送ACK

return receive;

}

到这里IIC的初始化工作结束。

6、SHT3x的数据获取,采集厂家出厂的标准DEMO。主要是发送转换温度的命令与读取命令,sth30.c代码如下:

#include "sht30.h"

#define POLYNOMIAL_CXDZ 0x31 // X^8 + X^5 + X^4 + 1

//SHT3X CRC校验

unsigned char SHT3X_CRC(uint8_t *data, uint8_t len)

{

unsigned char bit; // bit mask

unsigned char crc = 0xFF; // calculated checksum

unsigned char byteCtr; // byte counter

// calculates 8-Bit checksum with given polynomial @GZCXDZ

for(byteCtr = 0; byteCtr < len; byteCtr++) {

crc ^= (data[byteCtr]);

for(bit = 8; bit > 0; --bit) {

if(crc & 0x80) {

crc = (crc << 1) ^ POLYNOMIAL_CXDZ;

} else {

crc = (crc << 1);

}

}

}

return crc;

}

//SHT30命令函数

//addr:表示产品的序号,因为SHT30使用IIC总线的话一条线上可以挂两个

void SHT30_CMD(uint16_t cmd)

{

IIC_Start();

IIC_Send_Byte(SHT30_ADDR+0); //发送设备地址,写寄存器

IIC_Wait_Ack();

IIC_Send_Byte((cmd>>8)&0xff); //MSB

IIC_Wait_Ack();

IIC_Send_Byte(cmd&0xff); //LSB

IIC_Wait_Ack();

IIC_Stop();

SysTickDelay(500);//命令发完后需要等待20ms以上才能读写

}

//SHT30读取温湿度

//temp:温度,-400~1250,实际温度=temp/10,分辨率0.1℃,精度±0.3℃

//humi:湿度,0~1000,实际湿度=humi/10,分辨率0.1%rh,精度±3

//返回0成功,1失败

uint8_t SHT30_Read_Humiture(int *temp,uint16_t *humi)

{

uint8_t buff[6];

SHT30_CMD(SHT30_READ_HUMITURE);//读温湿度命令

IIC_Start();

IIC_Send_Byte(SHT30_ADDR+1); //发送设备地址,读寄存器

IIC_Wait_Ack();

buff[0]=IIC_Read_Byte(1);//继续读,给应答

buff[1]=IIC_Read_Byte(1);//继续读,给应答

buff[2]=IIC_Read_Byte(1);//继续读,给应答

buff[3]=IIC_Read_Byte(1);//继续读,给应答

buff[4]=IIC_Read_Byte(1);//继续读,给应答

buff[5]=IIC_Read_Byte(0);//不继续给停止应答

IIC_Stop();

//printf("buff=%d,%d,%d,%d,%d,%d
",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5]);

//CRC校验

if(SHT3X_CRC(&buff[0],2)==buff[2] && SHT3X_CRC(&buff[3],2)==buff[5])

{

temp=(-45+(175.0 ((buff[0]<<8)+buff[1])/65535.0)) *10;

humi=10100* ((buff[3]<<8)+buff[4])/65535.0;

if(*temp>1250) *temp=1250;

else if(*temp<-400) *temp=-400;

return 0;

}

else return 1;

}

//SHT30初始化

void SHT30_Init()

{

IIC_Init();

}

sht30.h头文件代码如下:

#ifndef SHT30_H

#define SHT30_H

#include "main.h"

#define SHT30_ADDR (uint8_t)(0x44<<1) //sht30 i2c地址,ADDR管脚接低电平时为0x44,接高电平为0x45

//SHT30命令

#define SHT30_READ_HUMITURE (uint16_t)0x2c06 //读温湿度

//CRC多项式

#define POLYNOMIAL 0x31 // X^8 + X^5 + X^4 + 1

uint8_t SHT30_Read_Humiture(int *temp,uint16_t *humi);

void SHT30_Init(void);

#endif

8、在主程序中,我们把读取到的数据显示到LCD段码屏上:

while(1)

{

SHT30_Read_Humiture(t,h);

temp = t[0];

Lcd_clear();

show_num(2, temp/100,0);

show_num(1, (temp/10)%10,1);

show_num(0, temp%10,0);

temp = h[0];

show_num(7, temp/100,0);

show_num(6, (temp/10)%10,1);

show_num(5, temp%10,0);

SysTickDelay(50000);

}

最后实现的效果如图:

温湿计.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2567

    文章

    53158

    浏览量

    769031
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4522

    浏览量

    171923
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于CW32L010的高性能温控器方案

    CW32L010温控器 方案可实现: 温控范围:5-95℃; 温度开关偏差:0.5-10℃可调; 设定温度与时钟轮流显示,测量温度直接读取; 传感器故障提示; 支持人工控制、时段控制和临时控制三种
    发表于 07-02 09:46

    基于CW32L010单片机的扫振一体电动牙刷应用方案

    大幅摆动实现了高效的刷牙方式,这种设计能够更高效地清洁牙齿和牙龈沟,为用户带来全新的洁牙体验?。本文将介绍武汉芯源半导体CW32L010单片机在扫振一体电动牙刷上的应用方案。 图1:电动牙刷方案
    发表于 06-17 09:38

    CW32L010 ESC Driver 电机控制套件使用

    CW32L010ESC_Driver电机驱动板是武汉芯源科技推出的一款低成本BLDC无刷直流电机开发板。在立创开源硬件平台可以查看该项目的详情。 https://oshwhub.com
    发表于 06-13 18:12

    武汉芯源半导体CW32L010在两轮车仪表的应用介绍

    CW32L010凭借其优异的性能、丰富的外设资源和超低功耗特性,为两轮车仪表盘应用提供了高性价比的解决方案。其宽电压工作范围和工业级温度特性,特别适合车辆电子应用的严苛环境。对于想采用CW32L010进行两轮车仪表盘开发的客户,武汉芯源半导体可提供全面的技术支持,助力客户
    的头像 发表于 05-13 14:07 ?335次阅读
    武汉芯源半导体<b class='flag-5'>CW32L</b>010在两轮车仪表的应用介绍

    武汉芯源半导体CW32L010在两轮车仪表的应用介绍

    介绍的两轮车仪表方案是无锡梓轩电子基于武汉芯源半导体 CW32L010F8P6开发,适用于小规格电动车仪表方案,实现车辆速度、累计里程、单次里程、模式状态、故障状态显示等功能。 电动车仪表盘能够及时
    发表于 05-13 14:06

    【道生物联TKB-620开发板试用】采集温湿度上报

    【前言】 我提交的计划为冷链监控系统,因此采集温湿度是首要步骤。这篇将分享如何采集sht30实现手动上报数据,在接收端打印出接收到的数据。 【硬件】 1、TKB-620开发板*2 2、sht30
    发表于 04-18 15:06

    CW32L010 Motor Control Driver无刷电机驱动板上手体验

    CW32L010无刷电机驱动开发板上手体验
    的头像 发表于 12-26 09:26 ?1153次阅读
    <b class='flag-5'>CW32L</b>010 Motor Control Driver无刷电机<b class='flag-5'>驱动</b>板上手体验

    方案介绍|CW32L010安全低功耗MCU:驱动高速风筒新力量

    ,适合大规模生产?。 CW32L010高速风筒应用方案概述 1、电机控制: CW32L010通过PWM信号精确控制电机转速,实现风速的平滑调节。同时,集成电流检测功能,实时监测电机工作状态,防止过载和过热
    发表于 12-10 09:57

    基于CW32L010F8P6的电机驱动板简易测试

    基于CW32L010F8P6的一款开源电机驱动板,可驱动无刷电机(无感或有感),直流电机或步进电机。
    的头像 发表于 11-19 09:38 ?1181次阅读
    基于<b class='flag-5'>CW32L</b>010F8P6的电机<b class='flag-5'>驱动</b>板简易测试

    CW32L010学习笔记

    记录CW32L010学习过程
    的头像 发表于 11-15 17:40 ?3418次阅读
    <b class='flag-5'>CW32L</b>010学习笔记

    CW32L010 新品初体验

    ,本次体验的核心板为CW32L010的TSSOP20pin的封装版本,它集成了完整的最小系统,所有输入输出接口(GPIO口)均已引出,便于用户进行各类开发与测试。核心板上不仅设有SWD下载接口,还配备了LED指示灯PB0口,通过Type-CUSB接口即可实现便捷供电,为用
    的头像 发表于 11-14 17:45 ?1018次阅读
    <b class='flag-5'>CW32L</b>010 新品初体验

    CW32模块使用 SHT30温湿度传感器

    资料文件 三、移植过程 我们的目标是将例程移植至CW32F030C8T6开发板上【测量温湿度的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。 3.1查看资
    的头像 发表于 11-14 17:39 ?649次阅读
    <b class='flag-5'>CW</b>32模块使用 <b class='flag-5'>SHT30</b>温湿度传感器

    基于CW32模块的SHT30温湿度传感器设计

    我们的目标是将例程移植至CW32F030C8T6开发板上【测量温湿度的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
    的头像 发表于 11-12 11:14 ?953次阅读
    基于<b class='flag-5'>CW</b>32模块的<b class='flag-5'>SHT30</b>温湿度传感器设计

    CW32L0100核心板的使用体验

    最近我们迎来了CW32L010新品的正式发布,标志着嵌入式技术领域的又一次创新突破。今日,我们有幸进行该新品的首次使用体验,以一块L010核心板为例,体验一下这颗芯片。
    的头像 发表于 10-30 15:29 ?724次阅读
    <b class='flag-5'>CW32L</b>0100核心板的使用体验

    【RA-Eco-RA0E1-32PIN-V1.0开发板试用】sht30温湿度传感器

    这一章节,继续探究RA0E1的硬件iic外设。来驱动SHT30温湿度传感器,该款温湿度传感器具有高精度稳定性,可以精确到0.125度的分辨率,特别适合用来做环境的监测。 硬件连接如下: 该传感器功耗
    发表于 10-14 23:40