电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
RT-Thread学习笔记+3.RTT外设之I2C设备使用
分 享
扫描二维码分享
RT-Thread学习笔记+3.RTT外设之I2C设备使用
RTT
组件
i2c
川楠
关注
发布时间: 2020-04-24
丨
阅读: 3853
#### # **项目背景** 前段时间,公司有个小项目,需要我画一个小板子,批量测试温度模块。这个温度模块是用ADS1110芯片采集PT100的信号,然后计算当前的温度。 ADS1110是16位的ADC转换器,I2C接口。当然跑裸机程序对我可能更方便,I2C接口写了太多次了,但是本次项目由于不是很着急,所以我打算上RT-Thread系统试试。顺便提升下自己的业务能力。 我自己也有UCOS,FreeRTOS的使用经验,对于任务创建、信号量、消息队列也就那么一回事,吸引我的还是RTT丰富的组件。 所以,开始干就完了! #### 硬件设计 关于硬件设计我就不详细的分析了,先大致的说下我的设计计划: - 电源采用DC12V和USB5V供电; - MCU采用的是STM32F103RCT6芯片; - 外接8组I2C设备模块,采用模拟I2C时序; - 加了一个12C接口的LCD 96X16像素 - 加了一个SDIO接口的TF卡。 **硬件设计思路** 1. RTT一般需要一个调试串口,所以我用了一个CH340G的USB转TTL的芯片。 2. 8路I2C测试模块,由于这个温度模块还有其他的电路,单个模块功耗在5V/100MA左右,8个模块就800MA,一般电脑的USB提供不了这么多的电流,所以需要外加电源。 3. 外加电12V,但是当我使用USB转TTL接口调试的时候,两个供电回路,需要切换,当检测到外部12V电源存在,整版的电源就需要将USB供电切断,此时USB仅通讯。 4. 单片机批量采集了8个温度模块需要将数据通过串口穿出来,外部保存,或者写入TF卡,方便后期使用数据表格比对。所以,这里需要一个文件系统。 ![](https://cf05.ickimg.com/bbsimages/202004/ad12783d918bcb4b7d495042fe6652f7.png) 硬件设计完成,然后发给厂家打样,贴片,自己回来焊接调试。 #### RTT系统移植 首先当然是先去RTT官网下载他们的源码,搭建开发环境,不熟悉的可以翻阅我的前2篇文章。 RT-Thread官方对市面上很多的开发板都做了适配,原子的、野火、ST的很多的开发都有,但是由于我的板子是自己画的,我硬件设计的时候也没有和其他的开发板做兼容。所以我不能直接使用现有的BSP,需要自己做一个,当然RTT官网也有这样的文档,这里我不做过多的介绍。 ![](https://cf05.ickimg.com/bbsimages/202004/7dfcc7efafd14625b615de62733a1afe.png) 总的来说RTT的移植主要分5步。 1、根据RTT固件包中的通用模板进行复制 2、使用 CubeMX 工具配置生成HAL工程,RTT源码会调用相关文件 3、修改RTT源码包 BSP 中的 Kconfig 文件 4、修改RTT源码包中构建工程相关文件 5、重新生成工程 ![](https://cf05.ickimg.com/bbsimages/202004/e5c04e1648368c7bfc395cd4b970e037.png) 详细的步骤我这里就不再重复,看官方的文档中心吧,里面讲的真的很详细,我这里主要讲述下我的Kconfig文件。 我开发使用的是KEIL+ENV的方式,当然RTT现在也开发了自己的IDE开发软件RT-Thread Studio,但是我由于使用了多年的KEIL和IAR,就不想再去学习其他的IDE,并不是RT-Thread Studio不好,而是个人的习惯问题。 Kconfig文件主要就是我们在使用ENV的图形窗口参数配置需要设置,其主要用的是kconfig 语法,这个也比较简单,之前我也没学过,但是依葫芦画瓢还是会。找一个其他的工程,参考下他的kconfig写法,简单的修改下,还是蛮简单的。 由于我的硬件使用的是8组I2C,所以在kconfig需要设置16个引脚。 下图为Kconfig关于I2C接口部分的内容 ![](https://cf05.ickimg.com/bbsimages/202004/fdcbb04ca155fdb8da52a315a03d73cc.png) 根据我的硬件设计,我I2C1的SCL为PB6,SDA为PB7,为什么会是22,23号呢? 这里RTT对引脚做了封装,参考源码rt-thread\bsp\stm32\libraries\HAL_Drivers\drv_gpio.c ![](https://cf05.ickimg.com/bbsimages/202004/a7c2368d1435dca5d18e9e51e2f076ed.png) 所以这里的引脚就是22,23号。 最后进入ENV,开打8个I2C设备组件。 ![](https://cf05.ickimg.com/bbsimages/202004/e82436fd12135fdfdf28579af817be6b.png) 然后scons --target=mdk5,生成MDK5的工程 ![](https://cf05.ickimg.com/bbsimages/202004/5b32af4954da368ae05b2c59cf09816c.png) 打开MDK5,主函数内容就这么一点儿。 ![](https://cf05.ickimg.com/bbsimages/202004/3e15215bd99a5aa6de356302a7b85f1a.png) 没关系,编译下载到我们的硬件里面。串口输出内容为我当前使用的RTT系统版本为V4.0.1,输入list_device命令,可以看到我的8个I2C设备已经加载成功了: ![](https://cf05.ickimg.com/bbsimages/202004/8be00838552c4a673e0126b8f97dc2b1.png) 当然你可以可以查看其他的命令,通过输入help。 ![](https://cf05.ickimg.com/bbsimages/202004/2fad1241d1bdcf2c8a93cceba0efe0f0.png) 到这里,我的RTT移植已经算是成功了。后面就是使用这个组件,然后调试ADS1110的程序了。 #### I2C组件的使用 经过上面的步骤,RTT的BSP已经是移植成功,接下的工作就是开发ADS1110相关的程序了,如何去使用RTT这个I2C设备组件。 首先先简单的介绍下ADS1110的使用方法吧。 ADS1110 每次上电完成之后,需要通过IIC接口修改配置寄存器为0x8F,使用内置8倍放大,15SPS采样速率,I2C写时序如下: ![](https://cf05.ickimg.com/bbsimages/202004/adc40e398481d6e0758ba3a3a990b55a.jpg) 初始化完成之后,就开始读取ADC转化的值,时序如下: ![](https://cf05.ickimg.com/bbsimages/202004/c668a4d346b6986667bf28270ceaa0a2.png) ADS1110的使用还是十分的简单。接下来就是编写相关的代码。 为了和其他的应用区分,我这边单独新建了一个.C文件用于编写ADS1110的相关代码,注意需要包含相关的RTT头文件。 ![](https://cf05.ickimg.com/bbsimages/202004/a8bb5de69dffc42a20674071e62a1671.png) 接下来就是写寄存器接口调用函数了。 ![](https://cf05.ickimg.com/bbsimages/202004/aeab14f37ef903076e0e81742cc96f95.png) 读寄存器和写寄存器类是,也是调用的RTT系统的API就可以了。 ![](https://cf05.ickimg.com/bbsimages/202004/4c2159764b2a2b8641359a91c72ea422.png) 有了以上两个读写寄存器的接口,接下来就可以直接初始化和读ADC值了。 ![](https://cf05.ickimg.com/bbsimages/202004/28ee15b28737ec447922f17968184c4d.png) 然后就是写个示例函数,可以开始测试下代码。 ![](https://cf05.ickimg.com/bbsimages/202004/77f1270f9ea3f2d36ddf11124bcdc83f.png) 这里我要说明下,为什么我需要先sprintf一下,然后才rt_kprintf打印出来。因为RTT的rt_kprintf()函数不能打印浮点数,这点有些失败。 接下来就开始编译下载了。 程序运行效果如下: ![](https://cf05.ickimg.com/bbsimages/202004/ee19b1e8d44cf0819e766abbe18cd487.png) 可以看到程序运行很成功。 如果有的小伙伴需要程序上电就运行,可以将这个ads1110_sample()函数直接放到main()函数里面,或者是创建一个任务都可以。 #### 结语 从RTT的I2C组件的使用来看,关于I2C协议的起始和停止等时序,RTT系统以及完成了,我们只需要调用接口即可。 ![](https://cf05.ickimg.com/bbsimages/202004/944ca2d3b25c72234b62e9ddb6d39152.png) 接下来我用逻辑分析仪抓了下I2C的波形,I2C组件在这个单片机上的通讯速度只能达到60KHZ左右,我试着查看了下源码,修改了代码,提高程序优化等级等,始终没有一个明显的增幅。I2C组件在STM32F103RCT6上最大也只达到117KHZ。完全不能达到400KHZ的速度。 所以这个RTT系统对单片机的资源也还是有相应的占用的。当然如果使用硬件I2C外设,那又是另外一个话题了。 最后,建议对于学习RTT的朋友来说,目前最好的学习资源就是RTT网站的文档中心,里面的资料还是比较完善。但是也有一些知识点介绍的比较模糊,希望RTT官方后期改进吧。 好了,本期的测试就先到这里了,关于后面的文件系统使用,见下期吧。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
川楠
擅长:单片机综合应用 硬件设计
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交