N32L40XCL

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 TeamSPDX-License-Identifier: Apache-2.0Change Logs:Date Author Notes2023-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.效果和实物展示