This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC2650:I2C 多主设备

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/603206/rtos-cc2650-i2c-multi-master

器件型号:CC2650

工具/软件:TI-RTOS

当前 I2C 驱动程序中是否仍然不支持多主器件?  

如果不是、是否有人可能会向我指出解决方案的正确方向?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    就我在 I2C 驱动程序的 API 文档中看到的那样、它不受支持、但启用它并不困难:

    • 将 SDK 中 tidrivers 文件夹中的 I2CCC26XX.c 文件放入您的项目目录、以便您进行修改
    • I2C 事务在 I2CCC26XX_primeTransfer()中启动。 当总线被占用时、这个函数立即放弃。
    • 每当一个传输完成时、 I2CCC26XX_hwiFxn()被执行。 此函数检查中断状态、如果设置了任何中断标志位、则会 特别检查 I2C_MASTER_ERR_ARB_Lost 标志、并在仲裁失败时立即放弃。
    /*发生了某种错误! *
    object->mode = I2CCC26XX_error;
    
    if (errStatus & I2C_MASTER_ERR_ARB_Lost){
    swip_post (&(object->swi));
    }
    否则{
    /*尝试发送停止位以立即结束所有 I2C 通信*/
    /*
    * I2C_MASTER_CMD_BURST_SEND_ERROR_STOP -和-
    * I2C_MASTER_CMD_BURST_Receive_ERROR_STOP
    *具有相同的值
    *
    I2CMasterControlhwAttrs->baseAddr、
    I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
    
    /*请勿在此布置 SWI,以免后续传输停止。
    等待 STOP 条件中断以 POST SWI */
    } 

    现在、我假设您需要在驱动程序中添加一些逻辑、以便在放弃之前在特定时间重新启动仲裁。 这有道理吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、

    非常感谢您的回复、我意识到我的回复有点晚了、我的项目被暂停了一会儿。

    因此、根据您的陈述以及我在当前驱动程序中看到的情况、驱动程序会检查总线是否被占用、标记仲裁错误位(如果是)、上面的部分会检查错误并终止通信。

    缺少的就是重新安排以检查总线是否被占用以及重新启动仲裁的逻辑。

    如果是这种情况、这将解决我的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Nicholas Nicou]...根据您的陈述以及我在当前驱动程序中看到的情况、驱动程序确实会检查总线是否被占用、标记仲裁错误位(如果是)、上面的部分会检查错误并终止通信。

    所缺少的就是重新安排以检查总线是否被占用并重新启动仲裁的逻辑。

    从我可以看到的内容以及我对现有驱动程序的理解来看、是的。