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.

[参考译文] LAUNCHXL2-RM46:I2C ICRRDY 内部问题

Guru**** 2610155 points
Other Parts Discussed in Thread: LAUNCHXL2-RM46, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/761897/launchxl2-rm46-i2c-icrrdy-int-problem

器件型号:LAUNCHXL2-RM46
主题中讨论的其他器件: HALCOGEN

我的代码有问题。

它不会进入 i2c 中断。


我放置了 Arduino 来不断向 TI 控制器发送信息、我希望在中断例程中接收这些信息。

这是我的 CCS 代码:

SYS_MAIN.c

i2cInit ();

i2cSetOwnAdd (i2cREG1、0x0A);
i2cSetCount (i2cREG1、10);
i2cSetDirection (i2cREG1、I2C_RECEIVER);
i2cSetMode (i2cREG1、I2C_MASTER);
i2cEnableNotification (i2cREG1、I2C_RX_INT);
_enable_IRQ ();

while (1);

这是我的 notification.c 代码:

i2c 接收器(i2cREG1、10、缓冲器);
while (i2cIsBusy (i2cREG1)=true);

while (i2cIsStopDetected (i2cREG1)=0);

clearSCD (i2cREG1);

这不奏效。 它永远不会发生中断。


如果我将其放置在 main (我添加的红色)中:

i2cInit ();

i2cSetOwnAdd (i2cREG1、0x0A);
i2cSetCount (i2cREG1、10);
i2cSetDirection (i2cREG1、I2C_RECEIVER);
i2cSetMode (i2cREG1、I2C_MASTER);
i2cEnableNotification (i2cREG1、I2C_RX_INT);
_enable_IRQ ();

i2c 接收器(i2cREG1、10、buff 主);

while (i2cIsBusy (i2cREG1)=true);
while (i2cIsStopDetected (i2cREG1)=0);

i2cClearSCD (i2cREG1);

while (1);

它在 main 中接收到很少的信息(而不是建议的10)、然后进入中断。


我的错误是什么?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:
    您能否在"I2C Global"选项卡中检查是否已启用 VIM 中的 I2C 中断通道和 ICRRDY 中断? 我假设您已在 PINMUX 选项卡中设置 I2C 引脚、选中 i2c 复选框并设置适当的引脚。
    我假设 LAUNCHXL2-RM46是从器件、Arduino 是主器件。 请检查 Arduino 和 LAUNCHXL2-RM46的设置方式是否相同(波特率、地址模式、位数、数据计数)。
    我假设您在 HALCoGen 中将 I2C 设置为从设备和接收器。
    在 i2cInit()之后,您只需要设置从地址(i2cSetOwnAdd(i2cBASE-t *i2c,uint32 oadd))并调用 i2cReceive(i2cBASE-t *i2c,uint32 length,uint8 * data)。 i2cReceive 将设置在产生中断时要存储数据的缓冲区的长度和地址(请参阅函数声明位置的说明)。
    您可以参阅 HALCoGen 中的示例。 RM46x 文件夹下没有 example_i2cInterrupt_Communication.c"、但例如、您可以在 RM48x 文件夹下找到它。

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

    感谢您回答 Miro。

    我已将该示例用于 I2C 中断、但它不是我想要的。
    你告诉我的所有事情都已经检查好了、除了一件事、一切都很好。 TI 和 Arduino 都是主设备。

    我希望我的 TI 成为主器件、而不是从器件。 我也不希望 Arduino 成为从属设备。

    在这个项目中、我需要在两个主器件之间交换信息

    如果我写入:i2cReceive (i2cREG1、data_count、buff _REG);在 sys_main.c 中、我应该在 notification.c 中写入什么? 相同的命令? 如果我不知道中断前的数据长度该怎么办。 i2cReceiveByte 对我没有帮助。 它只获得一段数据、而不是全部数据。

    我尝试放置 for 循环、我发送的第一个数据是我要读取的信息数量、因此我设置了 DATA_COUNT 和读取数据、但它仅在我将这些内容写入 sys_main.c 中而不是在 notification.c 中有效

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

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

    我无法找出这个。 你有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是、不是。 你有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:
    通常在 notification.c 中,您必须调用 i2cReceive()。 此函数设置下一次接收的数据长度和地址。 您也可以在 i2cNotification 之外调用此函数。 您应该在已知将要接收的下一个数据的数据长度后调用此函数。 此外、在传输完成之前、i2cReceive 不得再次调用。

    此致、
    米罗