主题中讨论的其他器件:CC3220S
我想知道最合适的地方是在哪里处理 I2C 阻塞总线的情况。 我知道发生时该怎么办、但由于 I2C 中的多个抽象层、我不确定处理它的最佳位置。 为了便于讨论、我假设我们可以在 out_for_box_demo 中进行讨论
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.
我想知道最合适的地方是在哪里处理 I2C 阻塞总线的情况。 我知道发生时该怎么办、但由于 I2C 中的多个抽象层、我不确定处理它的最佳位置。 为了便于讨论、我假设我们可以在 out_for_box_demo 中进行讨论
我在我自己的函数调用中使用 I2C_transfer。 似乎没有一种"干净"的方法来实现它。 有一个 I2C_CANCEL (I2C_Handle handle)、但它只应在使用回调函数时的上下文中使用。 这不适用、因为我在阻塞模式下使用它。 总的来说、我需要进入这样一个状态:我可以关闭 i2c 外设、将 SDA 更改为一个输入并读取它、如果它一直处于低电平、将 SCL 更改为一个输出并在它上计时16个时钟、直到从器件将 SDA 释放为高电平。
编辑: 我确实找到 了 I2CMBMON 寄存器、该寄存器允许您读取 SCL 和 SDA 的逻辑状态、这很好、但是我在 driverlib 中看不到此功能的任何用法
Andrew、
如果可能,我建议您转到 SimpleLinkWi-Fi
CC3220 v2.40 SDK。 正如 Sarah 提到的、I2C 驱动程序有许多缺陷改进。 虽然这些可能与您当前的需求无关、但在某些时候、它们可能会影响您的其他方面。 此外,在2.40发行版之前,CC32XX 平台不支持 I2C_CANCEL()函数。
遗憾的是、电流驱动器不会实现 CC3220 I2C 外设的时钟低电平超时(CLTO)功能。 (请参阅 CC3220 SimpleLinkWi-Fi
和物联网技术参考手册的第7.2.1.6节)。
您可以选择稍微修改现有的驱动程序代码。 为此、您必须将以下文件复制并粘贴到项目工作区中
在进行任何更改之前、我建议编译工程、以确保不会出现任何编译错误或警告。
接下来、您将要检查 I2CCC32XX.c 中的函数 :void initHw (I2C_Handle handle)。
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)
/*读取和清除中断*/ status = map_I2CMasterIntStatusEx (hwAttrs->baseAddr、true); map_I2CMasterIntClearEx (hwAttrs->baseAddr、status); if (status & I2C_MASTER_INT_TIMEOUT){ /* *发生超时,请在此处实施自定义逻辑。 *请注意这是在中断上下文中。 */ }
此致、
Derrick
Andrew、
如果您希望移动较新的 SDK、让我们通过2个步骤来完成此操作。 我假设您在以下步骤中使用的是 Code Composer Studio (CCS)。
[引用 user="Andrew5821"]因此,我假设将这两个文件复制到我的项目工作空间将使它们具有优先级,编译器不会从另一个目录中搜索它们?
正确。 编译 I2CCC32XX.c 源代码后、编译器将输出目标文件。 链接器将使用本地目标文件解析符号、而不是使用预编译库中的符号解析符号。
此致、
Derrick