1.测试环境
开发板:N32L40XCL-STB V1.0
开发环境:RT-Thread studio V2.2.6
RT-Thread版本:4.0.3
I2C外设资源:PB6—SCL PB7—SDA
传感器:AHT10
2.IIC
2.1 简介
I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA,另一根是双向时钟线 SCL,过这两根线,所有与 I2C 总线兼容的设备都可以通过 I2C 总线彼此直接通信。功能框图如下:
2.2 主要特征
同一接口既可实现主机功能又可实现从机功能
是并行总线到 I2C 总线协议的转换器
支持 7 位和 10 位的地址模式和广播寻址
作为 I2C 主设备可以产生时钟、起始信号和停止信号
作为 I2C 从设备具有可编程的 I2C 地址检测、停止位检测的功能
3.新建工程
首先打开RT-Thread studio安装N32L40XCL开发板的支持包。点击安装,变成绿色的installed即可
下面开始新建工程,点击由上角的文件-新建-RT-thread项目
4.编写测试程序
打开打开rt-thread settings,在硬件里面打开软件模拟IIC
添加AHT10的软件包,并打开Sensor框架,保存工程
/*
- Copyright (c) 2006-2021, RT-Thread Development Team
- SPDX-License-Identifier: Apache-2.0
- Change Logs:
- Date Author Notes
- 2023-04-21 28345 the first version
*/
// PB6--SCL PB7--SDA
#include "aht10_sample.h"
static rt_thread_t aht_10_thread = RT_NULL;
float humidity, temperature;
int rt_hw_aht10_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.dev_name = AHT10_I2C_BUS;
cfg.intf.user_data = (void *)AHT10_I2C_ADDR;
rt_hw_aht10_init("aht10", &cfg);
return RT_EOK;
}
//INIT_ENV_EXPORT(rt_hw_aht10_port);
//MSH_CMD_EXPORT(rt_hw_aht10_port,rt_hw_aht10_port);
static void aht10_thread_entry(void *parameter)
{
aht10_device_t dev;
rt_hw_aht10_port();
dev = aht10_init(AHT10_I2C_BUS);
if (dev == RT_NULL)
{
rt_kprintf(" The sensor initializes failure");
return ;
}
else
{
rt_kprintf(" The sensor initializes ok!");
}
while (1)
{
// read temperature 采集温度
temperature = aht10_read_temperature(dev);
rt_kprintf("temperature: %d.%d ", (int) temperature, (int) (temperature * 10) % 10); //former is integer and behind is decimal
// read humidity 采集湿度
humidity = aht10_read_humidity(dev);
rt_kprintf("humidity: %d.%d %% n", (int) humidity, (int) (humidity * 10) % 10); //former is integer and behind is decimal
rt_thread_mdelay(5000);
}
}
int aht10_sample_init(void)
{
aht_10_thread = rt_thread_create("aht10_thread", aht10_thread_entry, RT_NULL, 1024, 21, 10);
//如果获得线程控制块,启动这个线程
if (aht_10_thread != RT_NULL)
{
rt_thread_startup(aht_10_thread);
return RT_EOK;
}
else
{
rt_kprintf("aht10 thread create failure !!! n");
return RT_ENOMEM;
}
}
MSH_CMD_EXPORT(aht10_sample_init,aht10_sample_init);
5.效果和实物展示