GD32F303移植ATH10温湿度模块

2023-11-14

目录

前期准备

移植准备

开始移植

        ATH10.c

        ATH10.h

        main.c

效果图

总结


前期准备

开发硬件:GD32F303RCT6开发板

开发平台:Keil5

网盘资料:见文章底部

移植准备

        ATH10模块I2C驱动使用到us延时,因此需要调整时钟频率,调整方法详细请看GD32F303移植4针0.96寸OLED显示屏(I2C)时钟频率调整部分,这里就不过多讲解了。

开始移植

        ATH10.c

#include "gd32f30x.h"
#include "systick.h"
#include <stdio.h>
#include "ath10.h"

/*
	初始化ATH10 GPIO引脚
*/
void ath10_iic_gpio_init(void)
{
	//	使能GPIOB时钟
    rcu_periph_clock_enable(ATH10_ENABLE_GPIO);
	
	//	配置ATH10_SDA_PIN为输出
    gpio_init(ATH10_SDA_GPIO, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, ATH10_SDA_PIN);	
	
	//	配置ATH10_SCL_PIN为输出
    gpio_init(ATH10_SCL_GPIO, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, ATH10_SCL_PIN);	
	
	ATH10_SDA_H;
	ATH10_SCL_H;
}

/*
	SDA模式切换

	mode:	1:输出	
			0:输入
*/
void ath10_iic_sda_mode(uint8_t mode)
{
	//	使能GPIOB时钟
    rcu_periph_clock_enable(ATH10_ENABLE_GPIO);
	
	if (mode)
	{
		//	配置ATH10_SDA_PIN为输出
		gpio_init(ATH10_SDA_GPIO, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,ATH10_SDA_PIN);	
	}
	else
	{
		//	配置ATH10_SDA_PIN为上拉输入
		gpio_init(ATH10_SDA_GPIO, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ,ATH10_SDA_PIN);	
	}
}

/*
	读取SDA 输入模式下的引脚状态
*/
uint8_t read_sda_in_mode_data(void)
{
	return gpio_input_bit_get(ATH10_SDA_GPIO, ATH10_SDA_PIN);
}

/*
	主机发送开始信号
*/
void ath10_start(void)
{
	ATH10_SDA_OUT;	//	SDA为输出模式
	
	ATH10_SCL_H;	//	拉高SCL
	ATH10_SDA_H;	//	拉高SDA
	delay_us(5);
	
	ATH10_SDA_L;	//	先拉低SDA,持续5us
	delay_us(5);
	ATH10_SCL_L;	//	再拉低SCL
}

/*
	主机发送停止信号
*/
void ath10_stop(void)
{
	ATH10_SDA_OUT;	//	SDA为输出模式
	
	ATH10_SCL_L;	//	拉低SCL
	ATH10_SDA_L;	//	拉低SDA
	delay_us(5);
	
	ATH10_SCL_H;	//	先拉高SCL,持续5us
	delay_us(5);
	ATH10_SDA_H;	//	再拉高SDA
}

/*
	等待从机应答

	返回:	0:收到应答	
			1:未收到应答
*/
uint8_t	ath10_wait_ack(void)
{
	uint8_t	ErrTime = 0;
	
	ATH10_SDA_IN;
	
	ATH10_SDA_H;
	delay_us(1);
	ATH10_SCL_H;
	delay_us(1);
	
	//	循环读取SDA引脚状态
	while (read_sda_in_mode_data())
	{
		ErrTime++;
		
		if (ErrTime > 250)
		{
			ath10_stop();
			
			return 1;
		}
	}
	
	ATH10_SCL_L;
	delay_us(1);
	
	return 0;
}

/*
	主机是否发送应答	

	ack:	1:发送	
			0:不发送
*/
void ath10_send_ack(uint8_t ack)
{
	ATH10_SCL_L;
	
	ATH10_SDA_OUT;
	
	if (ack)	ATH10_SDA_L;
	else		ATH10_SDA_H;
	
	delay_us(2);
	
	ATH10_SCL_H;
	delay_us(2);
	ATH10_SCL_L;
}

/*
	主机发送一个字节
*/
void ath10_send_Byte(uint8_t data)
{
	uint8_t i;
	ATH10_SDA_OUT;
	
	ATH10_SCL_L;
	delay_us(2);
	
	for (i=0; i<8; i++)
	{
		if ((data<<i) & 0x80)	ATH10_SDA_H;
		else	ATH10_SDA_L;
		
		ATH10_SCL_H;
		delay_us(2);
		
		ATH10_SCL_L;
		delay_us(2);
	}
}

/*
	主机读取一个字节
*/
uint8_t ath10_read_Byte(void)
{
	uint8_t i, receive = 0;
	
	ATH10_SCL_L;
	ATH10_SDA_IN;
	delay_us(2);
	
	for (i=0; i<8; i++)
	{
		ATH10_SCL_H;
		delay_us(1);
		
		receive<<=1;
		
		if (read_sda_in_mode_data())	receive ++;
		
		ATH10_SCL_L;
		delay_us(1);
	}
	
	return receive;
}

/*
	检测ATH10是否响应	

	返回:	1:未响应	
			0:响应
*/
uint8_t ath10_check(void)
{
	uint8_t ack = 0;
	
	ath10_start();
	
	ath10_send_Byte(ATH10_ADDRESS);
	
	ack = ath10_wait_ack();
	
	ath10_stop();
	
	return ack;
}

/*
	初始化ATH10
*/
uint8_t ath10_init(void)
{
	ath10_iic_gpio_init();
	
	ath10_start();
	
	ath10_send_Byte(ATH10_ADDRESS); 	
	ath10_wait_ack();
	
	ath10_send_Byte(0xe1);				
	ath10_wait_ack();
	
	ath10_send_Byte(0x08); 				
	ath10_wait_ack();
	
	ath10_send_Byte(0x00); 
	ath10_wait_ack();
	
	ath10_stop();
	delay_1ms(40);	//	延时40ms,使传感器稳定
	
	return 1;
}

/*
	ATH10 软件复位
*/
void ath10_reset(void)
{
	ath10_start();
	
	ath10_send_Byte(ATH10_WRITE);
	ath10_wait_ack();

	ath10_send_Byte(0xba);
	ath10_wait_ack();
	
	ath10_stop();
}

/*
	读取ATH10 温湿度数据	

	返回:	0:获取成功		
			1:获取失败
*/
uint8_t ath10_read_data(uint16_t *temp, uint16_t *humi)
{
	//	状态(第1数据)
	uint8_t state = 0;
	
	//	数据2-6
	uint8_t	databuf[5];
	
	//	for循环次数
	uint8_t	i;
	
	//	温度、湿度缓冲区
	uint32_t temp_buf = 0, humi_buf = 0;
	
	/*----------------- 触发测量 -----------------------*/
	ath10_start();
	
	ath10_send_Byte(ATH10_WRITE);	
	ath10_wait_ack();
	
	ath10_send_Byte(0xac);			
	ath10_wait_ack();
	
	ath10_send_Byte(0x33);			
	ath10_wait_ack();
	
	ath10_send_Byte(0x00);			
	ath10_wait_ack();
	
	ath10_stop();
	delay_1ms(80);	//	手册中要求主机发出测量指令(0xAC)后,需延时75ms以上
	/*---------------------------------------------------*/
	
	ath10_start();
	
	ath10_send_Byte(ATH10_READ);	
	ath10_wait_ack();
	
	state = ath10_read_Byte();
	ath10_send_ack(1);
	
	//	首次读取为状态数据,判断Bit7位,0表示可正常读取,1表示传感器正忙
	if ((state&0x80) == 0)
	{
		for (i=0; i<5; i++)
		{
			databuf[i] = ath10_read_Byte();
			
			if (i == 4)	ath10_send_ack(0);
			else	ath10_send_ack(1);
		}
		
		ath10_stop();
		
		//	第2、3数据,第4数据高4位为湿度数据
		humi_buf = (databuf[0]<<12) + (databuf[1]<<4) + (databuf[2]>>4);
		
		//	第4数据低4位,第5、6数据为湿度数据
		temp_buf = ((databuf[2]&0x0f)<<16) + (databuf[3]<<8) + (databuf[4]);
		
		*humi = humi_buf*1000/1024/1024;
		*temp = temp_buf*2000/1024/1024-500;	
		
		printf("获取温湿度成功!\r\n");
		
		return 0;
	}
	
	printf("获取温湿度失败!\r\n");
	ath10_stop();
	
	return 1;
}

        ATH10.h

#ifndef ATH10_H
#define ATH10_H

/*-------------------------------- GPIO ------------------------------------------*/

#define	ATH10_ENABLE_GPIO	RCU_GPIOB

#define	ATH10_SDA_GPIO	GPIOB
#define	ATH10_SCL_GPIO	GPIOB

#define ATH10_SDA_PIN	GPIO_PIN_1
#define ATH10_SCL_PIN	GPIO_PIN_2

#define ATH10_SDA_H	gpio_bit_write(ATH10_SDA_GPIO, ATH10_SDA_PIN, SET)
#define ATH10_SDA_L	gpio_bit_write(ATH10_SDA_GPIO, ATH10_SDA_PIN, RESET)

#define ATH10_SCL_H	gpio_bit_write(ATH10_SCL_GPIO, ATH10_SCL_PIN, SET)
#define ATH10_SCL_L	gpio_bit_write(ATH10_SCL_GPIO, ATH10_SCL_PIN, RESET)

#define OUT_MODE	1
#define IN_MODE		0

#define ATH10_SDA_OUT	ath10_iic_sda_mode(OUT_MODE)
#define ATH10_SDA_IN	ath10_iic_sda_mode(IN_MODE)

/*-------------------------------- ADDRESS ------------------------------------------*/

#define	ATH10_ADDRESS	0x70
#define ATH10_WRITE	0x70
#define ATH10_READ	0x71

/*-------------------------------- Func Dec ------------------------------------------*/

void ath10_iic_gpio_init(void);
void ath10_iic_sda_mode(uint8_t mode);
uint8_t read_sda_in_mode_data(void);

void ath10_start(void);
void ath10_stop(void);
uint8_t	ath10_wait_ack(void);
void ath10_send_ack(uint8_t ack);
void ath10_send_Byte(uint8_t data);
uint8_t ath10_read_Byte(void);
uint8_t ath10_check(void);

uint8_t ath10_init(void);
void ath10_reset(void);
uint8_t ath10_read_data(uint16_t *temp, uint16_t *humi);
/*-------------------------------- End ------------------------------------------*/

#endif

        main.c

#include "gd32f30x.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>
#include "ath10.h"

uint16_t	temp = 0;
uint16_t	humi = 0;

char temp_string[32];
char humi_string[32];

int main(void)
{
	uint8_t flag = 0;

	//	设置主频120MHZ -- 分频器选择
	rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);
	
	//	配置系统时钟	--	1us
	systick_config();
	
	//	使能AF时钟 -- 开启GPIO复用功能
	rcu_periph_clock_enable(RCU_AF); 
	
	//	延时1s
	delay_1ms(1000);
	
	//	将SWJ和NRST引脚重新映射到其他可用的引脚上,以确保它们不会与其他外设引脚功能发生冲突。
	//	即可当作普通IO引脚使用
	gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);

	flag = ath10_init();
	
	if (flag == 0)
	{
		printf("Init Error!\r\n");
		
		return 0;
	}


	while (1)
	{
		if ( ath10_read_data(&temp, &humi) == 0)
		{
			sprintf(temp_string,"Temp:%d%d.%d C", temp/100, (temp/10)%10, temp%10);
			sprintf(humi_string,"Humi:%d%d.%d RH", humi/100, (humi/10)%10, humi%10);
			
			printf("%s -- %s\r\n", temp_string, humi_string);
		}

		delay_1ms(100);
	}
}

        串口打印部分的代码根据自身的情况进行添加,这里作者就不加上了。

效果图

总结

        写的比较简洁,如有遗漏之处还请各位大佬指正,我是陈师傅,我们下章再见!

ATH10icon-default.png?t=N3I4https://pan.baidu.com/s/12tqMsbFS1bO-oHjrjvC4kQ?pwd=3p8b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32F303移植ATH10温湿度模块 的相关文章

随机推荐

  • latex 约等于且大于 小于

    约等于 a approx b gt approx 大于约等于 a gtrsim b gt gtrsim 小于约等于 a
  • 基于QT 实现的LearnGL例子

    LOpenGL 是学习OpenGL非常好的资料 网址是 LearnOpenGL CN learnopengl cn github io 最近复习OpenGL 基于QT 拷贝实现了LearnGL的一些例子 下载地址 QT OpenGL 学习基
  • UML_类图

    在UML类图中 常见的有以下几种关系 泛化 Generalization 实现 Realization 关联 Association 聚合 Aggregation 组合 Composition 依赖 Dependency 1 泛化 Gene
  • 【Python】python 3.x 数据类型 吐血汇总

    文章目录 1 整数型 2 浮点数 3 字符串 4 布尔值 5 空值 6 变量 7 定义字符串 1 raw字符串 多行字符串 2 Unicode字符串 8 集合 list 1 访问列表中的值 2 更新列表 3 删除列表元素 4 Python列
  • 数据处理中的标准化、归一化,究竟是什么?

    原文链接 数据处理中的标准化 归一化 究竟是什么 大家好 我是小一 今天说一个比较重要的内容 无论是在算法建模还是在数据分析都比较常见 数据归一化和标准化 开始之前 请你先把网上看到的所有相关的博客 帖子都忘掉 不说全部 能讲清楚这个概念的
  • T5模型简单介绍

    目录 一 概要 二 深入扩展 2 1 两个要素 2 2 预训练方法 一 概要 谷歌公司的研究人员提出的 T5 Text to Text Transfer Transformer 有5个T开头的单词 所以叫做T5 模型采用了一种与前述模型截然
  • 成功解决Python中ValueError: not enough values to unpack (expected 10, got 2)故障

    对split函数不熟悉 将1修改为10即成功 同时将文件中所有空格键替换为Tab键 个人觉得这一步没啥用 这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入
  • linux screen rz/sz 文件卡死了快速退出的方法

    项目场景 服务器上通过sz下载txt格式的数据保存于本地遇到问题 问题描述 Linux 中使用tmux screen rz sz 命令下载文件卡死 出现如下图所示情况 快速退出方法 有如下解决办法 按住Ctrl键 再按五次x键 强行终断传输
  • 深入解析Spring Boot中最常用注解的使用方式(上篇)

    摘要 本文将详细介绍Spring Boot中最常用的注解的使用方式 并通过代码示例加以说明 通过学习这些注解 读者将能够更好地理解和运用Spring Boot框架 构建高效的企业级应用 目录 第一部分 常见的控制器注解 1 RequestM
  • Springboot项目打瘦包(将依赖包放到jar包外)

    一般springboot项目我们不做任何配置的话 打包会包含很多的依赖 生成的包过大 动辄100M以上 往生产环境上传很慢 所以把所有用的jar包打到外部 这样生成的小包中只有自已开发的程序 基本可以控制在1M以内 效果甚好 首先把spri
  • How to set IE proxy using VB.NET

    Created by SharpDevelop User Ying Shen Date 2004 11 12 Time 11 16 To change this template use Tools Options Coding Edit
  • NumPy 高级索引

    NumPy 高级索引 NumPy 比一般的 Python 序列提供更多的索引方式 除了之前看到的用整数和切片的索引外 数组可以由整数数组索引 布尔索引及花式索引 整数数组索引 以下实例获取数组中 0 0 1 1 和 2 0 位置处的元素 i
  • 2020年华为杯第十七届中国研究生数学建模竞赛---回顾记录

    这次做一个复盘贴 刚刚参加完这次的华为杯数学建模 由于是2020级研究生所以允许跨校组队 所以选择的队友是两个外校的 沟通方面第一天至第三天每天在微信使用语音通话汇报一次进度 第四天至第五天腾讯会议共享桌面进行论文修改 比赛时间 2020年
  • 网络安全-反序列化漏洞简介、攻击与防御

    目录 简介 PHP序列化 Python序列化 攻击 PHP举例 Python举例 防御 参考 简介 各种语言都有反序列化漏洞 Java PHP Python等 序列化即将对象转化为字节流 便于保存在文件 内存 数据库中 反序列化即将字节流转
  • 帮你理解网关、ARP、IP、MAC、路由

    我发个简单形象的小故事 你一看就明白了 假设你叫小不点 本地主机 住在一个大院子 本地局域网 里 有很多邻居 网络邻居 门 口传达室有个看大门的李大爷 李大爷就是你的网关 当你想跟院子里的某个伙伴玩 只要你在院 子里大喊一声他的名字 pin
  • Linux发送接收邮件

    目录 一 实验 1 linux用户发送给linux中的其它用户 2 linux用户发送给外网用户 一 实验 1 linux用户发送给linux中的其它用户 1 使用命令 yum install y sendmail 安装sendmail软件
  • C++类的三大特性之继承

    目录 一 继承的概念与使用 lt 1 gt 什么是继承 lt 2 gt 如何使用 二 基类与派生类间的转换 三 继承的作用域 四 派生类的默认成员函数 lt 1 gt 构造函数 lt 2 gt 拷贝构造 lt 3 gt 赋值运算符重载 lt
  • Gradle DSL method not found: 'runProguard()'

    Gradle DSL method not found runProguard Android studio 本来刚升级studio到1 0的时候就想写这篇文章的 但是没空就没写了 好吧 今天把这个问题写下 因为很多同事也遇到这个问题 解决
  • 关于servlet的 url-pattern 配置

  • GD32F303移植ATH10温湿度模块

    目录 前期准备 移植准备 开始移植 ATH10 c ATH10 h main c 效果图 总结 前期准备 开发硬件 GD32F303RCT6开发板 开发平台 Keil5 网盘资料 见文章底部 移植准备 ATH10模块I2C驱动使用到us延时