Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread Studio
奇怪RT-THREAD库函数里没I2C只有SOFT I2C?
发布于 2020-05-06 17:59:34 浏览:1566
订阅该版
奇怪RT-THREAD库函数里没I2C只有SOFT I2C? ![无标题.png](https://club.rt-thread.org/uploads/202005/06/180505sxf7mjmppumuo0vm.png)
查看更多
3
个回答
默认排序
按发布时间排序
LiY123123
2020-05-06
这家伙很懒,什么也没写!
软件模拟I2C,没毛病呀
wenbodong
2020-05-18
这家伙很懒,什么也没写!
我猜测有以下几点原因: 1. rtt针对stm32全系列编写了统一的驱动,而stm32有些系列的i2c硬件有bug,比如stm32f1。这样一来,编写统一的硬件i2c驱动有困难。 2. 相比于spi协议,i2c协议更为复杂,有更多的通讯步骤,比如起始位、停止位和应答信号位。使用i2c与芯片通信的场景往往是读写芯片内部的寄存器,比如读寄存器,流程为:起始位 从机地址+写 寄存器地址 起始位 从机地址+读 数据 停止位 (为了简化流程,没有标注应答信号)。这里面的关键是,写寄存器地址后不能有结束信号。rtt的i2c驱动框架使用rt_i2c_msg来构建通信步骤,先写再读完全没问题。只要硬件驱动在执行每一个rt_i2c_msg时可以灵活控制是否传输起始位和停止位就行。 而stm32的HAL_I2C_Master_Transmit没办法控制不给结束信号,虽然HAL_I2C_Mem_Read可以满足先写再读的需求,但是要集成到rtt的i2c驱动框架中并不方便。如果有连续个rt_i2c_msg,比如写读写,那就没办法了(虽然没遇到过这需求)。估计想完美使用硬件i2c的话,不能使用HAL库,而得使用LL库。 使用软件i2c,在不管性能的条件下,可以满足多数场景的需求。这个性能有两个方面的含义: 1. 不在乎软件i2c通信时浪费的cpu时间。 2. 不在乎i2c通信的速率。 我以前经手的项目,确实不在乎以上两点。不过最近买了个热成像的小模块(分辨率32x24,一次通信832字节),使用i2c来读取图像数据。其驱动程序有个奇怪的步骤,要求必须在两个图像帧之间完成数据通信。我起初用软件i2c时,168MHz的stm32f407,读取一次数据要130Ms,只能将热成像的图像刷新率设置在2Hz,才能每次都稳定读取到数据,实在是不能忍受啊。 被迫自己搞了个rtt的硬件i2c驱动,当然啦,这个驱动并不严谨。其执行rt_i2c_msg的方法,如上文所述,针对读取芯片寄存器的场景做了定制,可以满足需求: ```c static rt_size_t i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num) { struct stm32_i2c *i2c_dev = rt_container_of(bus, struct stm32_i2c, bus); struct rt_i2c_msg *msg = RT_NULL; rt_size_t size_sum = 0; rt_err_t err; if(num == 2 && !(msgs[0].flags & RT_I2C_RD) && (msgs[1].flags & RT_I2C_RD)) { return i2c_read_mem(i2c_dev, msgs, num) == RT_EOK ? 2 : 0; } for(int i = 0; i < num; i++) { msg = msgs + i; if (msg->flags & RT_I2C_RD) { err = i2c_recv_bytes(i2c_dev, msg, i == num - 1); I2C_CHECK_ERR(err); } else { err = i2c_send_bytes(i2c_dev, msg, i == num - 1); I2C_CHECK_ERR(err); } size_sum++; } END: return size_sum; } ```
aozima
2020-05-18
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
楼上分析得不错,有要求的场合,还是要用硬件I2C。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
tiger2000
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部