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.

[参考译文] CC1352R:仅 I2C 启动中断、但无数据中断

Guru**** 2562050 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/969121/cc1352r-only-i2c-start-interrupt-but-no-data-interrupt

器件型号:CC1352R

我将编写一个基于 I2C 通信的定制引导加载程序。 我的引导加载程序代码位于最后一个闪存页中、并擦除所有其他闪存页。 由于许多 TI 驱动程序函数也使用闪存中的某些器件、因此我无法使用它们。 但我可以使用 ROM 函数和寄存器访问、我会擦除例如闪存页。

FlashSectorErasePonter_t FuncPointer =(uint32_t (*)(uint32_t))(ROM_API_FLASH_TABLE [5]);
uint32_t result = FuncPointer (PageAddress); 

我意识到、当我调用此函数时、下一个 I2C 帧只会产生一个启动中断。 此时未接收到预期的数据和停止中断。 当不调用 ROM 函数时、即使用延迟替换也不会导致问题。 由于引导加载程序在执行一条命令后无需进行 I2C 通信、因此我不使用中断例程。 我轮询状态寄存器:

uint32_t IntReg = HWREG (I2C0_BASE + I2C_O_SMIS);

if (内部注册!= 0)
{
uint32_t StatusReg = HWREG (I2C0_BASE + I2C_O_SSTAT);
HWREG (I2C0_BASE + I2C_O_SICR)= I2C_SRI_STOPRIS + I2C_SRI_STARTRIS + I2C_SRI_DATARIS;

IF (内部稳压器和 I2C_SMS_STARTMIS)
{
//接收到启动中断。 因此启用了数据和停止中断
HWREG (I2C0_BASE + I2C_O_SIMR)|= I2C_SIMR_STOPIM + I2C_SIMR_DATAIM;
}
否则、IF (IntReg 和 I2C_SMI_STOPMIS)
{
//接收到停止中断。 不再使用数据和停止中断
HWREG (I2C0_BASE + I2C_O_SIMR)= I2C_SIMR_STARTIM;
}
否则(内部稳压器和 I2C_SMI_DATAMIS)
{
//数据中断接收
IF (StatusReg & I2C_SSTAT_TREQ)
{
//主设备要读取数据。 发送一个字节
HWREG (I2C0_BASE + I2C_O_SDR)= 0xFF;
}
否则、IF (StatusReg & I2C_SSTAT_RREQ)
{
//主设备已写入数据。 阅读
uint8_t aByte = HWREG (I2C0_BASE + I2C_O_SDR);
}
}

我应该提到 CC1352是 I2C 从设备。 此外、我的所有跟踪逻辑和对数据的处理都将从上面的源代码列表中删除。 从跟踪中、我看到(如上所述)数据中断不起作用。 我很确定师父真的想制作一个正确的画面。 但是、我不能仅检测起始条件、而检测不到数据条件。 还是我错了?

此致
Erwin

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

    您好、Erwin、  

    感谢您的提问。  

    我将研究您的问题并尽快提供更新。  

    谢谢、  
    ELIN

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

    您好、Elin、

    我想我至少有一个权变措施。

    首先、我组织了一个 I2C 监听器、然后详细观察了 I2C 总线。 从那里我得到的印象是、对于确认位、有一个(一直到监听器中的超时)扩展代码。

    我在 I2C 驱动器中看到、即使 I2C0:SRIS 寄存器置位了 DATAIM 位、I2C0:SSTAT 寄存器中的 TREQ 位也会置位。 对我来说、这意味着硬件已收到读取请求、该请求由 STARTIM 中断(位)显示、但 DATAIM 中断以某种方式丢失。 因此、我不会将数据字节放入 SDR 数据寄存器。 因此、时钟被无终点扩展

    现在、我只使用 SRI 中断寄存器来检测开始和停止条件、我需要正确设置内部帧缓冲区。

    SDR 数据寄存器的写入或读取仅基于 SSTAT 中的 TREQ 和 RREQ 位。 因此、这完全独立于 DATAIM 中断。

    在这个实现中、我直到现在还没有看到任何错误。

    我想详细介绍何时触发哪个中断。 我对 I2C 从设备的期望是:

    • 当硬件检测到一个起始条件和一个匹配的地址值时、它将触发 STARTIM 中断。
      原则上、即使在从 HW 接收 R/W 位之前也可以执行此操作。
    • 如果接收到的 R/W 位指示外部主器件想从我(从器件)读取一个字节、它将触发 DATAIM 中断。
      HW 会延长 ACK 位的时钟、直到我由于 DATAIM 中断而写入 SDR。 之后、主器件可以读取我的指定字节。
    • 如果接收到的 R/W 位指示外部主器件要向我写入一个字节、则不会触发中断。
      地址/RwBit 由 HW 在我不干预的情况下进行确认。 然后主器件写入 HW 接收到的第一个字节。
      当接收到此字节的最后一位时、DATAIM 中断被触发、并且 HW 会延长时钟、直到我读取 SDR。
    • 当硬件检测到停止条件时、会触发 STOPIM 中断。

    据我所知、从 I2C 协议的角度来看、从器件不 ACK 一个数据字节。 如何使用 CC1352实现这一点?

    是否有有关我想知道的所有这些详细信息的文档?

    BR
    Erwin

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

    很抱歉、这是我的错。 即使是共享的、我也会在寄存器位检查中使用"else if"结构。 因此、我找到了 START 中断、但没有检查数据中断。 但所有中断都被复位。 因此、当我仅在开始和接收到数据中断后检查寄存器时、数据中断消失。

    现在、它还可用于检查 SRI 寄存器中的数据中断。

    但是、当哪个中断出现细节时、我仍然有兴趣解释一下。

    BR
    Erwin

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

    您好、Erwin、

    很高兴看到您自己解决了问题、后续问题是:"何时详细介绍了哪个中断"、您是指何时中断将更详细地触发、然后是技术参考手册中给出的内容?

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

    您好、M-W、

    是的、我想了解更多详细信息。 我甚至会说技术参考手册中的信息不是很详细。 但公平地说、信息足以使用 I2C 模块。但它告诉例如、对于相同的数据中断、它仅在"接收或请求数据"时才会触发。 命令序列流程图甚至根本不讨论中断。 我想我之前在帖子中提到的理解是正确的、但最好通过某种方式加以确认。 即使是没有详细了解 I2C 的人、也很乐意在某个地方获取此信息。

    根据我当前的理解、由于每个 ACK 都是由硬件模块自动生成的、因此甚至不可能 NACK 某些字节。 例如、如果我作为从器件还没有准备好发送请求的字节、我必须禁用该模块吗? 那么、在这种情况下、硬件不会对主器件的从器件地址读取请求进行应答? 或者、是否有办法仅将前两个字节 ACK 为主字节、但稍后的读取尝试(更多字节)将被 NACK?

    BR
    Erwin

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

    您好、Erwin、

    我现在不能给你更多的细节了。 流程图通常不包含中断示例、但流程与之类似、只是您配置中断、而不是轮询标志。 正如您所说的、我认为您的理解已经很好了、我无法真正详细说明中断标志的"确切时刻"、而不是现在的 TRM。

    至于 Nack/ACK 情况、我知道您实际上没有选项、从机模块将确认正确接收到的数据/命令。 如果您还没有准备好接收、它将拉伸时钟信号、直到您已将数据读/写到缓冲区、因此您不需要禁用模块、只需在准备就绪前不读出数据即可。  我承认、这会降低灵活性、因为例如、您无法将 NACK 用作"操作结束"指示、但在本例中、I2C 从机模块更注重"简单"。 在发送 STOP 信号之前、您可能需要设计主器件侧以了解要读取的字节数。  

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

    好的、谢谢