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。
尊敬的 Jagadish:
我有一个硬件,其中停止位中断是在 i2cInit ()之后产生的。 对于该硬件、器件的整个 i2c 正常工作、即 MCU 能够从从器件发送和接收。 对于很多硬件、正如我之前提到的、我们有3个硬件、 中断根本不起作用。 因此、假设硬件有故障。 但是、我不认为硬件有故障、但我不明白为什么会发生这种情况。
有任何建议吗?
尊敬的 LayEng:
我们可以设置一个实时调试会话吗? 在本课程中、您能否通过连接两个电路板来向我展示一下您看到的行为差异是什么?
我的时间为上午10点至晚上7点 IST (印度标准时间)。
这是必需的、因为我 过去从未看到过任何类似的问题。
--
谢谢。此致、
Jagadish。
尊敬的 Jagadish:
感谢您的报价。 我仍在调试。 我已经回到使用您在今年4月给我的示例代码的阶段。 我已经通过 halcogen 使用 i2c1和 i2c2中断添加了。 遗憾的是、我无法获得 i2c2中断。 可以帮助检查为什么我无法在 halcogen 中获得 i2c2中断?
下面是我的代码。 谢谢!
如何上传 zip 文件? 请告知。 谢谢
我无法编译该文件、因为 i2c2Interrupt 不可用。 请检查 HCG 文件并告诉我犯了什么错误。 谢谢你。
我更正了 i2c2中的 pinmux、vim 通道和所选中断
尊敬的 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 文件。 期待您的支持。 谢谢!
生成的 hl_i2c.c 没有 i2c2代码。 产生了误差。
尊敬的 LayEng:
您未附加任何编译器错误映像。 我怎么能知道您遇到了哪种类型的编译器错误?
我还编译了附加项目"5164.I2C_TEST_LC43"、也没有看到任何编译器问题、代码只能成功构建。
请重新验证。
--
谢谢。此致、
Jagadish。
感谢您的支持。 我还想知道为什么 HCG 文件看起来不改变(仍然是2022年尽管更改),以及只有 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。