GD32L233通过I2C总线驱动AHT20温湿度传感器

GD32L23X官方例程没有I2C驱动实例,网上也不太好找,最后整合多方资料,完成了GD32L233KBT6+AHT20的I2C驱动调试。

一、环境准备

  1. VSCode+EIDE基础工程(参考GD32L233KBT6开源编译环境搭建
  2. AHT20官方驱动github下载(aht20 drivers

二、I2C移植

2.1 拷贝文件

拷贝三个文件到工程中:

  1. driver_aht20_read_test.c//里面有测试代码可以直接调用,包括初始化和读温湿度
  2. driver_aht20.c//aht20驱动
  3. driver_aht20_interface_template.c//aht20的i2c底层实现接口
  4. 上面三个文件对应的头文件

2.2 移植接口

在i2c读的接口中,需要注意一个地方就是收完字节流后,要加一个延时,不然gd32的stop信号无法正常发出,因此特意增加了一个aht20_interface_delay_us()函数。
硬件信息是:PB6-SCL, PB7-SDA,通过AF8映射到I2C1。
driver_aht20_interface_template.c是一个空的框架模板,在gd32上实现后的代码如下:

/**
 * Copyright (c) 2015 - present LibDriver All rights reserved
 * 
 * The MIT License (MIT)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE. 
 *
 * @file      driver_aht20_interface_template.c
 * @brief     driver aht20 interface template source file
 * @version   1.0.0
 * @author    Shifeng Li
 * @date      2022-10-31
 *
 * <h3>history</h3>
 * <table>
 * <tr><th>Date        <th>Version  <th>Author      <th>Description
 * <tr><td>2022/10/31  <td>1.0      <td>Shifeng Li  <td>first upload
 * </table>
 */

#include "driver_aht20_interface.h"
#include "gd32l23x_i2c.h"
#include "systick.h"
static void aht20_interface_delay_us(uint32_t us);
/**
 * @brief  interface iic bus init
 * @return status code
 *         - 0 success
 *         - 1 iic init failed
 * @note   none
 */
uint8_t aht20_interface_iic_init(void)
{
   
    // 初始化 I2C1
    rcu_periph_clock_enable(RCU_I2C1);
    rcu_periph_clock_enable(RCU_GPIOB);

    //PB6,PB7通过AF4映射为I2C1
    gpio_af_set(GPIOB, GPIO_AF_8, GPIO_PIN_6);//I2C1_SCL
    gpio_af_set(GPIOB, GPIO_AF_8, GPIO_PIN_7);//I2C1_SDA

    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    gpio_mode_set(GPIOB,
### GD32F103VET6 IIC协议使用说明及配置示例 #### 一、GD32F103VET6 IIC模块概述 GD32F103系列微控制器支持I2C通信协议,该协议是一种两线制同步串行总线,适用于短距离通信。它由数据线SDA和时钟线SCL组成,能够实现多主机和多从机之间的通信[^1]。 #### 二、硬件资源初始化 为了启用I2C功能,需对GPIO端口进行相应的配置,并使能对应的外设时钟。以下是针对GD32F103VET6芯片的典型I2C接口初始化流程: ```c #include "gd32f10x.h" void iic_gpio_init(void) { // 使能 GPIOB 和 I2C 的时钟 rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_I2C); // 配置 SDA 和 SCL 引脚为开漏输出模式 gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); } ``` 上述代码片段展示了如何将PB6 (SCL) 和 PB7 (SDA) 配置为I2C功能引脚,并设置为开漏输出模式以满足I2C电平需求[^2]。 #### 三、I2C软件初始化 除了硬件资源配置之外,还需通过寄存器操作完成I2C的功能参数设定,例如波特率、地址匹配方式等。下面是一个简单的初始化函数实例: ```c void iic_init(void) { i2c_struct i2c_initpara; /* 初始化结构体 */ i2c_default_para_init(&i2c_initpara); /* 设置目标设备地址以及传输速率 */ i2c_initpara.i2c_analog_filter = I2C_ANALOG_FILTER_ENABLE; i2c_initpara.i2c_digital_filter_cnt = 0; i2c_initpara.i2c_ack_cfg = I2C_ACK_ENABLE; i2c_initpara.i2c_own_addr = 0xA0; // 主机无需关心自己的地址 i2c_initpara.i2c_tmode = I2C_MASTER_MODE; i2c_initpara.i2c_smbus_alert = I2C_SMBUS_ALERT_DISABLE; i2c_initpara.i2c_timing = 0xF0911E4D; // 波特率为100kHz @8MHz APB1 clock i2c_init(I2Cx, &i2c_initpara); // 替换 I2Cx 为目标外设编号如 I2C1 i2c_enable(I2Cx); } ``` 此部分实现了基本的I2C主控模式启动逻辑,其中`i2c_timing`值取决于系统时钟频率与期望的工作速度[^3]。 #### 四、读取AHT20温湿度传感器数据 假设已经完成了物理连接并调用了前述初始化程序,则可以按照如下方法获取来自AHT20传感器的数据包: ```c uint8_t aht_read_data(uint8_t regaddr, uint8_t *data, uint16_t length){ uint8_t status=0; /* 发送起始信号 */ i2c_start_on_bus(I2C1); /* 发送写命令给指定器件 */ if(i2c_send_7bit_address(I2C1,AHT20_ADDR_WRITE,I2C_Direction_Transmitter)==I2C_ERROR_NONE){ /* 写入寄存器地址 */ if(i2c_master_mode_write_byte(I2C1,&regaddr,1)!=I2C_ERROR_NONE){ goto exit_label; } /* 转向接收状态 */ i2c_stop_on_bus(I2C1); delay_ms(10); // 等待测量完成 i2c_start_on_bus(I2C1); if(i2c_send_7bit_address(I2C1,AHT20_ADDR_READ,I2C_Direction_Receiver)==I2C_ERROR_NONE){ /* 接收实际数据 */ if((status=i2c_master_receive_multi_bytes(I2C1,data,length))!=I2C_ERROR_NONE){ ; } } } exit_label: return status; } // 示例调用 uint8_t buffer[6]; aht_read_data(AHT_CMD_MEASURE,buffer,sizeof(buffer)); float humidity = ((buffer[1]<<8)|buffer[2])*100.0/0xFFFF; float temperature = (((buffer[3]&0x7F)<<8)|buffer[4])*(200.0/0xFFFF)-50; ``` 以上代码定义了一个通用的读取函数,用于访问特定寄存器并将返回的结果解析成浮点数形式表示相对湿度百分比和摄氏度数值。 #### 结论 综上所述,利用GD32F103VET6内置的I2C外设可轻松达成同诸如AHT20这样的智能型环境监控元件间的交互作业目的。只需合理安排好各阶段的任务顺序即可顺利完成整个项目开发周期内的技术挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值