Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
I2C_IIC
RA8-M85-vision-board
传感器
[Vision Board创客营]SCI_I2C读写传感器寄存器实践
发布于 2024-05-22 23:22:28 浏览:319
订阅该版
[tocm] # 一、前言 首先感谢rtt提供了一个创客营的这个机会;本文记录使用vision board实现SCI_I2C读写传感器寄存器实践的过程; 最终测评的code工程,可以在以下地址中clone到 https://github.com/8-rtt-study/3_vision_board_gg.git ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/2bd39d50f7ba89b4c8c5ba58d43eca21.png.webp) # 二、软件环境搭建 ## 1、资料下载 > 参考官网的文档说明,先把资料都下载下来; https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/hw-board/ra8d1-vision-board/ra8d1-vision-board ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240417/1b15d3e3440bb33eb54b64ecb5319e68.png) ##2、软件安装 > ** 本文主要使用IDE来进行开发 ### (1)renesas fsp5.1.0(芯片配置工具) 这个软件用于自动生成驱动配置,类似stm32的cubemx; ### (2)RT-Thread Studio(开发工具) 个人而言,这个软件的中间件配置过程比evn方便一些;不过这个云盘里面没有,自己去官网下载吧;https://www.rt-thread.org/studio.html ## 3、环境配置 > 这里主要参考官网就可以: 从这个位置往下看; https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/hw-board/ra8d1-vision-board/ra8d1-vision-board ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/3e5cbb1a6f4922bae7685b8980f7385e.png.webp) # 三、ra 配置工具的使用 ## 1、在ide中打开RA 配置工具 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240417/322eac08fdd59d88b157e559d5bf24f8.png.webp) ## 2、找到ra安装的安装目录 只有第一次打开需要选择安装的目录 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240417/3081b65eecbf00f54c0910ce3ee1feb5.png.webp) ##3、生成sci的iic驱动 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/bb0dc76a9917a8ff775660cadc8a08ba.png.webp) ##4、确认IO口和通道 > - sci是一个新的东西,按照spec所说,1个sci可以配置成3种不同的串行通信接口;而这个mcu一共有7个sci;所以我们只需要选择其中一个sci,将其配置成iic接口即可;本次实践中,选择通道sci3,因为实际发现只有sci3的iic被引到排针上,且io口未被其他模块占用 ------------ ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/f764d59593bf4462d94a3a2bb98b3845.png.webp) # 四、RT Thread Settings ## 1、添加sci iic组件 **不得不说ide的组件丝滑开启效果,使得rtt在众多rtos中让人备受喜爱🥰** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240417/1a7d568e1a0bae2ba3046378804fb44d.png.webp) **直接搜索关键字,就可以跳转直接开启** ###(1)使能sci3_iic设备驱动 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/8101438ae2b59924f11fa13c48843b23.png.webp) ### (2)添加测试代码 这个测试代码实际是从官网的iic示例中,修改而来; ```c /* * 程序清单:这是一个 I2C 设备使用例程 * 例程导出了 i2c_aht10_sample 命令到控制终端 * 命令调用格式:i2c_aht10_sample i2c1 * 命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 * 程序功能:通过 I2C 设备读取温湿度传感器 aht10 的温湿度数据并打印 */ #include
#include
#define AHT10_I2C_BUS_NAME "sci3i" /* 传感器连接的I2C总线设备名称 */ #define AHT10_ADDR 0x0D /* 从机地址 */ #define AHT10_CALIBRATION_CMD 0xE1 /* 校准命令 */ #define AHT10_NORMAL_CMD 0xA8 /* 一般命令 */ #define AHT10_GET_DATA 0xAC /* 获取数据命令 */ #define QCM5883L_ID_ADDR 0x0D #define IST8310_ID_ADDR 0x0E static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ static rt_bool_t initialized = RT_FALSE; /* 传感器初始化状态 */ /* 写传感器寄存器 */ static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data) { rt_uint8_t buf[3]; struct rt_i2c_msg msgs; rt_uint32_t buf_size = 1; buf[0] = reg; //cmd if (data != RT_NULL) { buf[1] = data[0]; buf[2] = data[1]; buf_size = 3; } msgs.addr = AHT10_ADDR; msgs.flags = RT_I2C_WR; msgs.buf = buf; msgs.len = buf_size; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } } /* 读传感器寄存器数据 */ static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf) { struct rt_i2c_msg msgs; msgs.addr = AHT10_ADDR; msgs.flags = RT_I2C_RD; msgs.buf = buf; msgs.len = len; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } } static void read_temp_humi(float *cur_temp, float *cur_humi) { rt_uint8_t temp[6]; write_reg(i2c_bus, AHT10_GET_DATA, RT_NULL); /* 发送命令 */ rt_thread_mdelay(400); read_regs(i2c_bus, 6, temp); /* 获取传感器数据 */ /* 湿度数据转换 */ *cur_humi = (temp[1] << 12 | temp[2] << 4 | (temp[3] & 0xf0) >> 4) * 100.0 / (1 << 20); /* 温度数据转换 */ *cur_temp = ((temp[3] & 0xf) << 16 | temp[4] << 8 | temp[5]) * 200.0 / (1 << 20) - 50; } static void aht10_init(const char *name) { rt_uint8_t temp[10] = {0}; /* 查找I2C总线设备,获取I2C总线设备句柄 */ i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); if (i2c_bus == RT_NULL) { rt_kprintf("can't find %s device!\n", name); } else { // write_reg(i2c_bus, AHT10_NORMAL_CMD, temp); // rt_thread_mdelay(400); // temp[0] = 0x08; // temp[1] = 0x00; // write_reg(i2c_bus, AHT10_CALIBRATION_CMD, temp); // rt_thread_mdelay(400); write_reg(i2c_bus, 0x0D, RT_NULL); read_regs(i2c_bus,1,temp); if(temp[0] == 0xFF) { rt_kprintf("[QCM5883L][who am i][ok]\r\n"); } else { rt_kprintf("[QCM5883L][who am i][fail]\r\n"); } } } static void i2c_aht10_sample(int argc, char *argv[]) { float humidity, temperature; char name[RT_NAME_MAX]; humidity = 0.0; temperature = 0.0; if (argc == 2) { rt_strncpy(name, argv[1], RT_NAME_MAX); } else { rt_strncpy(name, AHT10_I2C_BUS_NAME, RT_NAME_MAX); } if (!initialized) { /* 传感器初始化 */ aht10_init(name); } // if (initialized) // { // /* 读取温湿度数据 */ // read_temp_humi(&temperature, &humidity); // rt_kprintf("read aht10 sensor humidity : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10); // if( temperature >= 0 ) // { // rt_kprintf("read aht10 sensor temperature: %d.%d°C\n", (int)temperature, (int)(temperature * 10) % 10); // } // else // { // rt_kprintf("read aht10 sensor temperature: %d.%d°C\n", (int)temperature, (int)(-temperature * 10) % 10); // } // } // else // { // rt_kprintf("initialize sensor failed!\n"); // } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(i2c_aht10_sample, i2c aht10 sample); ``` # 五、硬件环境搭建 ##1、主板端io口 注意:iic端口的两条线是下面红色圈的哦 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/cf6bc384a27402d9497ea6007a471952.png.webp) ##2、硬件环境连接 如下图所示,主板给mag传感器供电和iic通信连接,在连接处,使用逻辑分析仪来监听数据; ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/620d4d8da7dcbfd8c331c0d6541be7b2.png.webp) ##3、硬件spec说明 ![screenshot_568e14312c23eda71782772fca8f2d6.png](https://oss-club.rt-thread.org/uploads/20240522/dc0e19396e2973344fcc5db85c61f072.png.webp) ![screenshot_82702619337f6be1e1ff90dbd3f6816.png](https://oss-club.rt-thread.org/uploads/20240522/9f15eccafbdd1bc00098892b53b9eaed.png.webp) #六、实验和验证 ##1、使用msh命令 > i2c_aht10_sample ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240522/c2b10fda9df0c021b1294aa886a59526.png.webp) ##2、逻辑分析仪数据和spec说明 可以看到,在示例中,主机先发送了寄存器地址,然后读取到0xFF,符合spec要求,说明验证成功; ![screenshot_328bfd9acf7c404658634a05e8c1e57.png](https://oss-club.rt-thread.org/uploads/20240522/1b7b13188b0ecd36fccd18bb69e8b09f.png.webp)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Vangaoven
大道之行,天下为公
文章
3
回答
3
被采纳
1
关注TA
发私信
相关文章
1
NXP的I2C应该比ST的好用吧
2
Use of I2C device driver
3
关于I2C 驱动问题请教
4
我如何知道这个iic的io配置和我电路设计的是一致的?
5
I2C模拟读操作失败,不知道问什么进不去读函数
6
RTT的I2C有官方文档资料没有
7
求 STM32F103 IIC 自定义IO初始化 代码
8
报一个LPC4008代码中I2C的bug
9
RTOS IIC总线使用
10
关于在RTT中使用STM32 I2C的疑问
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部