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.

[参考译文] CC3220S-LAUNCHXL:I2C 阻塞总线

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3220S

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/765857/cc3220s-launchxl-i2c-stuck-bus

器件型号:CC3220S-LAUNCHXL
主题中讨论的其他器件:CC3220S

我想知道最合适的地方是在哪里处理 I2C 阻塞总线的情况。  我知道发生时该怎么办、但由于 I2C 中的多个抽象层、我不确定处理它的最佳位置。  为了便于讨论、我假设我们可以在 out_for_box_demo 中进行讨论

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

    您使用哪种传输模式? 您是否卡在 I2C_open 或 I2C_transfer 上? 您是否曾看到返回错误值?

    除了完全关闭外设之外、似乎没有一种明确记录的方法来取消对该外设的请求。 我已联系驾驶员团队进行澄清。

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

    我在我自己的函数调用中使用 I2C_transfer。 似乎没有一种"干净"的方法来实现它。 有一个 I2C_CANCEL (I2C_Handle handle)、但它只应在使用回调函数时的上下文中使用。 这不适用、因为我在阻塞模式下使用它。 总的来说、我需要进入这样一个状态:我可以关闭 i2c 外设、将 SDA 更改为一个输入并读取它、如果它一直处于低电平、将 SCL 更改为一个输出并在它上计时16个时钟、直到从器件将 SDA 释放为高电平。

    编辑: 我确实找到 了 I2CMBMON 寄存器、该寄存器允许您读取 SCL 和 SDA 的逻辑状态、这很好、但是我在 driverlib 中看不到此功能的任何用法

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

    您使用的是哪个 SDK 版本? 在最新版本2.40中修复了一些阻塞 I2C 错误、这些错误可能在此处适用。

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

    很抱歉、我没有清楚说明这一点。 我没有任何问题、但由于 i2c 通过短电缆、我需要实施阻塞总线清除例行程序作为保险。 存在信号(EMI、接地反弹等)问题。 我现在使用的是1.5 SDK。

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

    Andrew、

    如果可能,我建议您转到 SimpleLinkTmWi-FiRegisteredCC3220 v2.40 SDK。 正如 Sarah 提到的、I2C 驱动程序有许多缺陷改进。 虽然这些可能与您当前的需求无关、但在某些时候、它们可能会影响您的其他方面。 此外,在2.40发行版之前,CC32XX 平台不支持 I2C_CANCEL()函数。

    遗憾的是、电流驱动器不会实现 CC3220 I2C 外设的时钟低电平超时(CLTO)功能。 (请参阅 CC3220 SimpleLinkTmWi-FiRegistered 和物联网技术参考手册的第7.2.1.6节)。

    您可以选择稍微修改现有的驱动程序代码。 为此、您必须将以下文件复制并粘贴到项目工作区中

    1. \source\ti\drivers\i2c\I2CCC32XX.c
    2. \source\ti\drivers\i2c\I2CCC32XX.h

    在进行任何更改之前、我建议编译工程、以确保不会出现任何编译错误或警告。

    接下来、您将要检查 I2CCC32XX.c 中的函数 :void initHw (I2C_Handle handle)

    1. 在  void initHw (I2C_Handle handle)内、您应该能够添加逻辑以启用自定义超时。 有关计算适当的超时值、请参阅时钟低电平超时部分。
      1. uint32_t value;
        
        if (bitrate_[object->bitrate_= I2C_100kHz){
        /*基于100kHz 比特率计算值*/
        值= 1234;
        }
        否则{
        /*基于400kHz 比特率计算值*/
        值= 5678;
        }
        
        //设置 I2C 主时钟低电平超时*/
        MAP_I2CMasterTimeoutSet (hwAttrs->baseAddr,值);
        //启用 I2C 主时钟超时中断*/
        MAP_I2CMasterIntEnableEx (hwAttrs->baseAddr,I2C_MASTER_INT_TIMEOUT) 
    2. 接下来、您需要更新中断服务例程 中的逻辑、void I2CCC32XX_hwifxn (uintptr_t arg)
      1. 您将需要检查是否发生了 I2C_MASTER_INT_TIMEOUT 中断、并采取相应的行动。
      2. /*读取和清除中断*/
        status = map_I2CMasterIntStatusEx (hwAttrs->baseAddr、true);
        map_I2CMasterIntClearEx (hwAttrs->baseAddr、status);
        
        if (status & I2C_MASTER_INT_TIMEOUT){
        /*
        *发生超时,请在此处实施自定义逻辑。
        *请注意这是在中断上下文中。
        */
        } 

    此致、
    Derrick

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

    感谢您提供信息。 那么、我假设只将这两个文件复制到我的项目工作空间将使它们具有优先级、编译器不会从另一个目录中搜索它们?

    我安装了其他 SDK。 我认为我不会使用它们。 将我的项目迁移到最新 SDK 的最佳方法是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andrew、

    如果您希望移动较新的 SDK、让我们通过2个步骤来完成此操作。 我假设您在以下步骤中使用的是 Code Composer Studio (CCS)。

    1. 导入 out_for_box_CC3220S_LAUNCHXL 示例时、您可能会注意到导入了第二个项目。 根据 RTOS 和编译器的不同、该工程可能已命名为"tirtos_builds_CC3220S_LAUNCHXL_release_ccs"或类似的工程。 out_of 框项目取决于第二个项目。
      1. 要更新您的产品版本、您首先需要右键单击"..._builds_CC3220S_LAUNCHXL_..."。 并选择 Properties
      2. 在项目属性中、您应该从左侧选择常规。
      3. 选择"常规"后、您将单击"产品"表
        1. 在这里、您将看到您正在使用的当前产品旁边的复选框。 只需单击"向下箭头"并选择要使用的 SDK 版本(在您的案例中为2.40)。
      4. 应用并关闭以保存这些设置。
      5. 如果导航到 out_for_box 示例的 Properties>Generation>Product 选项卡,您将注意到产品版本已更新。 在进行任何其他更改之前、您应该构建此示例以确保没有错误。
    2. 将  I2CCC32XX.c I2CCC32XX.h 文件复制到您的 Out of _Box 项目工作区中。 确保从2.40版本的 SDK 中复制这些文件。
      1. 更正了我的上一篇文章、我建议您在项目工作空间中创建一个文件夹结构、如下所示:
    3. 同样、您应在进行其他更改之前进行构建、以确保没有错误或警告。

    [引用 user="Andrew5821"]因此,我假设将这两个文件复制到我的项目工作空间将使它们具有优先级,编译器不会从另一个目录中搜索它们?

    正确。 编译 I2CCC32XX.c 源代码后、编译器将输出目标文件。 链接器将使用本地目标文件解析符号、而不是使用预编译库中的符号解析符号。

    此致、
    Derrick

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

    另请注意。 SDK 版本1.50和2.40之间有两个主要更新、您还必须处理:

    1.如果您使用的是 TI-RTOS 或 FreeRTOS、请参阅 v1.60 SDK 的升级和兼容性部分以更新已更改的文件路径: software-dl.ti.com/.../release_notes_coresdk_cc32xx_3_40_01_02.html
    2. NetSock 库已添加到所有 NetApp 库中。 您需要将 NetSock 库添加到项目中、并在应用中初始化 NetSock 层。 请参阅最新 SDK 中的示例以供参考。 在 SDK 示例中、这通常在应用程序还创建 SL_Task 线程时在 mainThread 中完成。

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

    感谢你的帮助。 在尝试将这些更改迁移到较新的 SDK 之前、我需要在这里达到稳定的一点。 一旦我准备好这些文件、我就会报告。

    谢谢