主题中讨论的其他器件:HALCOGEN
尊敬的 Jagadish:
我想知道 在 MCU 启动后何时触发 i2cNotification 和 i2cInterrupt。 我的软件已执行 i2cInit()。 在调用 i2c 发送或接收 API (例如 i2cReceive (i2cbase_t *i2c、uint32 length、uint8 * data)之前或调用 i2c 发送/接收 API 之后。 我已经通过启用 i2c 中断在中断模式下配置了 i2c。
谢谢你。
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.
尊敬的 Jagadish:
我想知道 在 MCU 启动后何时触发 i2cNotification 和 i2cInterrupt。 我的软件已执行 i2cInit()。 在调用 i2c 发送或接收 API (例如 i2cReceive (i2cbase_t *i2c、uint32 length、uint8 * data)之前或调用 i2c 发送/接收 API 之后。 我已经通过启用 i2c 中断在中断模式下配置了 i2c。
谢谢你。
尊敬的 LayEng:
是在调用 i2c 发送或接收 API (例如 i2cReceive (i2cbase_t *i2c、uint32 length、uint8 * data)之前还是在调用 i2c 发送/接收 API 之后。
仅在调用发送和接收 API 后才会生成中断。

发送中断过程:
您可以看到、 将数据从数据发送寄存器(I2CDXR)复制到发送移位寄存器(I2CXSR)后、TXRDY 中断将生成。
因此、调用 i2cSend 函数后、代码执行将转至以下突出显示的指令:

因此、在这个函数中您可以看到、首先我们将要发送的第一个字节写入 数据发送 寄存器(I2CDXR)中、之后我们只需缩短长度并启用 TXRDY 中断、然后将从此函数退出。 因此、现在将发生的情况是、一旦我们 写入 数据发送 寄存器(I2CDXR)中的第一个字节移动到 发送移位寄存器(I2CXSR)、处理器将立即获得 TXRDY 中断、然后执行将移动到"i2cInterrupt"函数的案例5。

因此、当我们的第一个字节被移动到右移位寄存器 中时、数据发送寄存器(I2CDXR)现在为空、所以现在我们可以发送另一个字节、 这就是为什么我们将再次在此处验证长度、如果 length 不为零、则我们将访问 源缓冲区中的下一个数据、并将该数据移动到 I2CDXR。 此过程将继续、直到传输完所需的所有字节。
接收中断进程:

一旦 接收移位寄存器(I2CSR)中的数据复制到数据接收寄存器(I2CDRR)中、接收中断就会生成。
与这里的传输类似、首先、我们也会调用"i2cReceive"、其中包含要接收的数据字节数和目标缓冲区地址。

在 这里的 i2cInit 函数中已启用了 RXINT、因此我们将只初始化接收长度和目标缓冲区地址、然后我们将退出该函数。 因此、 无论何时我们从从从器件接收到一个字节到主器件、退出此函数 后、数据将首先移入接收移位寄存器(I2CSR)中、之后、数据将移至数据 接收寄存器(I2CDRR)中。 因此、一旦 i2c 主器件接收到 I2CDRR 寄存器中的一个字节、处理器就会立即获取 RXRDY 中断、执行过程现在将 转到"i2cInterrupt"函数的案例4。

现在、我们将首先将 I2CDRR 寄存器中接收到的字节复制到目标缓冲区的第一个位置、之后我们将减少1的长度、并将目标缓冲区地址递增1以存储下一个字节。 现在我们将验证长度是否为零、如果长度不为零则意味着仍然 需要接收更多数据、因此我们 将再次启用 RXRDY 中断、并将从该循环退出。 如果主机再接收到 I2CDRR 寄存器的另一个 字节、我们将获得此中断、该过程将重复进行、直到所需的所有字节都接收到目标缓冲区。
这就是发送和接收过程在中断模式下的工作方式。
--
谢谢。此致、
Jagadish。
尊敬的 LayEng:
我无法编译该文件、因为 i2c2Interrupt 不可用。 请检查 HCG 文件并告诉我犯了什么错误。 谢谢你。
我更正了 i2c2中的 pinmux、vim 通道和所选中断
[/报价]很抱歉耽误了时间、
我不理解您在这里的担忧。
如果您在 HALCoGen 中找不到 i2c2中断、那么它在这里是114通道。
启用它并选择 i2c2驱动程序后、它的定义将在 i2c.c 文件中生成
--
谢谢。此致、
Jagadish。
您好
我认为 halcogen 中有一个错误。 附件是.hcg 文件。 我还附上了我已更改的不同文件的图像。 同样没有 i2c2中断。 仅供参考、我已经通过 halcogen 进行过几次检查和代码生成。 我可以看到 vim 通道114已启用(这就是我编译错误的原因)。 我可以看到 HCG 文件未更改、但.DIL 文件已更改。 如果我更改了 i2c 配置、不应该更改 HCG 文件? 我还附加了 HCG 和 DIL 文件。 期待您的支持。 谢谢! 

尊敬的 LayEng:
很抱歉耽误了时间,我上周在度假。
很抱歉,您错误地附带了 zip 文件。 我附上了正确的密码。 [/报价]感谢代码、我现在将对其进行测试。
[/quote]我还想知道为什么 HCG 文件看起来没有更改(尽管有更改,但仍是2022年),并且只有 DIL 文件被更改。 [/报价]如果我们只是通过进行一些更改来生成代码、那么只会更新.DIL 和驱动程序文件。
要更新 HCG 文件、我们应该点击"Save Project"选项。
--
谢谢。此致、
Jagadish。
尊敬的 LayEng:
很抱歉,您错误地附带了 zip 文件。 我附上了正确的密码。 请检查。I2C_TEST_LC43添加到 TI.zip
我刚刚验证并找到了 编译器错误 路由原因。
问题是由于、您在 VIM 中启用了 i2c2中断、但未启用 i2c2驱动程序。
在这里、您启用了来自 VIM 的 i2c2中断:

但在这里、您未启用 i2c2驱动程序:

如果您不启用 i2c2驱动程序、那么 HALCoGen 就不会生成"i2c2Interrupt"函数的定义了吗? 这就是出现编译器错误的原因。
如果您要使用"i2c2Interrupt"、请同时生成相应的驱动程序、否则、这不是有效的方案、因为我们不能在没有驱动程序文件的情况下使用 i2c 中断。
这是我启用 i2c2驱动程序后生成的输出:

--
谢谢。此致、
Jagadish。