Skip to content

fix[STM32][I2C]: stabilize hard i2c async transfer routing#11470

Merged
Rbb666 merged 1 commit into
RT-Thread:masterfrom
wdfk-prog:fix_drv_i2c
Jun 15, 2026
Merged

fix[STM32][I2C]: stabilize hard i2c async transfer routing#11470
Rbb666 merged 1 commit into
RT-Thread:masterfrom
wdfk-prog:fix_drv_i2c

Conversation

@wdfk-prog

Copy link
Copy Markdown
Contributor

拉取/合并请求描述:(PR description)

[

为什么提交这份PR (why to submit this PR)

STM32 hard I2C 驱动同时支持 polling、interrupt 和 DMA 传输路径。当前异步传输路径中,单帧短传输、多帧 repeated-start/no-stop 传输、以及异常后的 abort recovery 需要保持一致的路由策略,否则可能出现同一事务内路径选择不稳定、顺序传输误落到非顺序接口、或恢复等待策略与事务入口上下文不一致的问题。

本 PR 用于稳定 hard I2C master transfer 的异步路由和恢复流程,明确区分普通单帧传输与必须使用 STM32 HAL sequential API 的多帧/no-stop 传输。

你的解决方案是什么 (what is your solution)

  • 新增 stm32_i2c_xfer_route,集中保存每个 message 的 HAL mode、timeout、sequential requirement、async allowed 和 wait requirement。
  • 将 RX/TX start helper 改为基于 route 上下文选择 DMA、interrupt 或 polling 路径。
  • 将 DMA 最小长度阈值改为可配置的 BSP_I2C_DMA_TRANS_MIN_LEN,默认保持为 16U
  • 对多 message/no-stop 传输限制为 sequential DMA/IT 路径,避免 repeated-start/no-stop 语义落入普通 polling API。
  • 在事务开始时一次性采样 scheduler 和 interrupt 状态,使整个 I2C 事务的异步策略保持一致。
  • 在 completion wait 日志和 abort recovery 中复用 route timeout,减少异常恢复路径的上下文重新采样。

请提供验证的bsp和config (provide the config and bsp)

  • BSP: 未提供具体板卡;本次基于 HAL_Drivers/drivers/drv_hard_i2c.c 差异生成 PR 描述,提交前请替换为实际验证 BSP 路径。
  • .config: 建议至少覆盖 BSP_USING_HARD_I2C*,以及对应 I2C 的 *_TX_USING_INT / *_RX_USING_INT*_TX_USING_DMA / *_RX_USING_DMA 配置;提交前请替换为实际 .config 变更项。
  • action: 当前环境未提供仓库 action 链接;提交前请替换为 PR branch 触发的成功编译链接。

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • 代码是高质量的 Code in this PR is of high quality
  • 已经使用formatting 等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
  • 如果是新增bsp, 已经添加ci检查到.github/ALL_BSP_COMPILE.json 详细请参考链接BSP自查

@github-actions

Copy link
Copy Markdown

👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread!

为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。
To ensure your code complies with RT-Thread's coding style, please run the code formatting workflow by following the steps below (If the formatting of CI fails to run).


🛠 操作步骤 | Steps

  1. 前往 Actions 页面 | Go to the Actions page
    点击进入工作流 → | Click to open workflow →

  2. 点击 Run workflow | Click Run workflow

  • 设置需排除的文件/目录(目录请以"/"结尾)
    Set files/directories to exclude (directories should end with "/")
  • 将目标分支设置为 \ Set the target branch to:fix_drv_i2c
  • 设置PR number为 \ Set the PR number to:11470
  1. 等待工作流完成 | Wait for the workflow to complete
    格式化后的代码将自动推送至你的分支。
    The formatted code will be automatically pushed to your branch.

完成后,提交将自动更新至 fix_drv_i2c 分支,关联的 Pull Request 也会同步更新。
Once completed, commits will be pushed to the fix_drv_i2c branch automatically, and the related Pull Request will be updated.

如有问题欢迎联系我们,再次感谢您的贡献!💐
If you have any questions, feel free to reach out. Thanks again for your contribution!

@github-actions

github-actions Bot commented Jun 12, 2026

Copy link
Copy Markdown

📌 Code Review Assignment

🏷️ Tag: bsp_stm32

Reviewers: Liang1795 hamburger-os wdfk-prog

Changed Files (Click to expand)
  • bsp/stm32/libraries/HAL_Drivers/drivers/drv_hard_i2c.c

📊 Current Review Status (Last Updated: 2026-06-12 10:09 CST)

  • Liang1795 Pending Review
  • hamburger-os Pending Review
  • wdfk-prog Pending Review

📝 Review Instructions

  1. 维护者可以通过单击此处来刷新审查状态: 🔄 刷新状态
    Maintainers can refresh the review status by clicking here: 🔄 Refresh Status

  2. 确认审核通过后评论 LGTM/lgtm
    Comment LGTM/lgtm after confirming approval

  3. PR合并前需至少一位维护者确认
    PR must be confirmed by at least one maintainer before merging

ℹ️ 刷新CI状态操作需要具备仓库写入权限。
ℹ️ Refresh CI status operation requires repository Write permission.

@github-actions github-actions Bot added BSP: STM32 BSP related with ST/STM32 BSP labels Jun 12, 2026
@wdfk-prog

Copy link
Copy Markdown
Contributor Author
  • STM32的I2C多消息发送一定得使用SEQ方式;另外SEQ发送后,没有完成时不会发送STOP停止信号;所以没有办法先发送SEQ在发送POLL;所以需要驱动层判断当前是多消息走SEQ还是单条消息允许执行DMA或者POLL;
  • 对于多消息没有启用SEQ的直接反馈错误与日志退出
  • 把最小允许DMA的长度从2改为16,观察git 日志发现2时一开始就写入的,没有找到为什么这样执行的原因;改为16更加合理;

centralize hard I2C per-message route state for DMA, interrupt, and polling paths
make multi-message and no-stop transfers use sequential HAL APIs only
snapshot scheduler and interrupt context once for stable async transfer decisions
reuse the transaction timeout for async wait logging and abort recovery
@Rbb666 Rbb666 merged commit 8fefb3a into RT-Thread:master Jun 15, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BSP: STM32 BSP related with ST/STM32 BSP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants