跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. I2C Slave 中断回调未按预期进入 I2C_SLAVE_EVENT_STOP 问题

I2C Slave 中断回调未按预期进入 I2C_SLAVE_EVENT_STOP 问题

已定时 已固定 已锁定 已移动 YT SDK
1 帖子 1 发布者 19 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • quanfengQ 离线
    quanfengQ 离线
    quanfeng YunTu
    编写于 最后由 编辑
    #1

    1. 问题背景

    1. 软件:ME05 SDK 1.3.1 I2C
    2. 硬件:ME05 EVB(FXOSC 8M)
    3. 背景描述:
    • I2C 做从机的情况下,主机执行主机写(不带停止位)+主机读(带停止位),理论上 I2C Slave 中断回调中的 I2C_SLAVE_EVENT_STOP Case 只会在主机读完后进入,但实际上在主机写完的时候也进入了。

    3a4a6966-d46a-478d-962e-483d51af2aba-image.png

    • 对 PTD4 的 IO 反转操作只在中断回调函 I2C_SLAVE_EVENT_STOP Case 里操作

    4eecfcb4-3268-489c-b593-83364142c0e0-image.png

    2. 问题分析

    1. 根据 I2C 驱动可以确认 I2C_SLAVE_EVENT_STOP 有三种条件会进入:① 重复接收起始位; ② 收到到错误 ;③ 总线上有 stop bit。也确认客户 restart 指令属于 重复接收起使位(repeat start )

    2.1 重复接收起始位

    1. I2C_DRV_SlaveIRQHandler 函数中 repeatStartDetect 就是对 重复接收起始位 情况的判断。当 repeatStartDetect 置 1,会执行 I2C_DRV_SlaveEndTransferHandler 函数,然后通过回调函数进入 I2C_SLAVE_EVENT_STOP Case

    642f4da7-2bed-45cc-a3df-70f6b6f7a83a-image.png

    6baa01ba-aae4-476e-8140-7dd5b467bae0-image.png

    2.2 收到到错误

    1. I2C_DRV_SlaveIRQHandler 函数中会判断 BitError 和 FIFOError。当 I2C 从机出现错误的情况下会执行 I2C_DRV_SlaveEndTransferHandler 函数,然后通过回调函数进入 I2C_SLAVE_EVENT_STOP Case

    5dbae1b4-3f09-45bf-a233-8af26c301a8e-image.png

    2.3 总线上有 stop bit

    1. I2C_DRV_SlaveIRQHandler 函数中 stopDetect 就是对 总线上有 stop bit 情况的判断。当 stopDetect 置 1,会执行 I2C_DRV_SlaveEndTransferHandler 函数,然后通过回调函数进入 I2C_SLAVE_EVENT_STOP Case

    0ed833cd-cca7-45c8-94b8-2cc167162aaa-image.png

    3. 解决方案

    3.1 Plan A

    1. 如果不需要使用 重复接收起始位 进 I2C_SLAVE_EVENT_STOP,并且 I2C 不是使用 DMA,并且使能了监听的情况下,可以直接把 I2C_DRV_SlaveIRQHandler 函数里 repeatStartDetect 的 I2C_DRV_SlaveEndTransferHandler 函数直接注释即可

    66ffd82f-a1b2-460c-bc53-86a759950397-image.png

    1. 关于 I2C 产生 error 也进入 I2C_SLAVE_EVENT_STOP,可以在回调函数 I2C_SLAVE_EVENT_STOP Case 里调用 I2C_DRV_SlaveGetTransferStatus 函数获取 i2c 状态,如果产生 error 函数的返回值是 STATUS_ERROR,因此可以通过返回值去判断是否发产生 error

    6f2c71f9-2cfa-41cc-903b-9b3e83494c2c-image.png

    1. 注意事项:
    • 此方案对 SDK I2C 驱动修改程度最小
    • 此方案会导致主机发送主机写并且不发停止位情况下,无法获取主机写命令什么时候接收完成

    3.2 Plan B

    1. 在 I2C_DRV_SlaveIRQHandler 函数里调用 I2C_DRV_SlaveEndTransferHandler 函数的位置加 log

    92ea1753-181c-4b3c-bf95-8fc343c93fef-image.png

    1. 然后在回调函数 I2C_SLAVE_EVENT_STOP case 里去判断对应的 log,然后做相应的处理

    0784d907-3432-4663-952b-19180284adff-image.png

    1. 注意事项:
    • 此方案对 SDK I2C 驱动修改程度较大
    1 条回复 最后回复
    0

  • 云途开发生态介绍

    快速上手云途开发生态

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • can
    23
    demo
    20
    uds
    13
    lin stack
    12
    md14
    6
    fbl
    5
    yt-link
    5
    adc模块
    4
    Online Users
    Tiger987T
    Tiger987
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门