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-int1a_ISR 未在上触发(AAS =1 (即使我启用了 i2CIER -> AAS 位=1、i2CSTR 也是如此)。
那么、我在这里缺少什么吗? 当我具有 i2c 写入(作为从器件)时,它会触发,但在读取期间不起作用。
您好 Sagar、
您能进一步解释以下内容吗? 您说触发器是否取决于从器件地址(第8位)之后的读/写位的状态?
[引用 user="sagar shah54"]当我有 i2c 写入(作为从器件)时,它会触发,但在读取期间不起作用。
如果可能、提供工作案例和非工作案例的波形截图将有助于理解问题。
最棒的
Kevin
那么、我的问题是-
1)当我在28035中以写入方式将数据从28379 (主器件)发送到从器件28035时、会触发 i2c ISR、并在 ISR 中从 I2caRegs.I2CDRR 读取数据、操作成功完成。
2) 2)当我执行同样的操作但28379希望从从28035读取时- 23035中的 i2ca ISR 不会在 AAS 上触发。 我在 i2cier reg 中启用了 AAS 位。
那么、时钟会变低。 但是、如果我轮询 AAS 位、则传输会成功完成。 那么、为什么28035中的 i2c 中断即使已为 AAS 位启用也不会被触发?
我附加了一个寄存器的屏幕截图、当它被设置为 ned 时。 那么、让我知道我是否做了一些错误的事情。
谢谢、
Kevin、您还需要更多数据吗?
是的、我在等待您的回复时做了几处更改。 如果您能更快地回复、那将是一个大帮助。
我只有两个中断被启用。
I2caRegs.I2CIER.ALL = 0x0;
I2caRegs.I2CIER.bit.RRDY=1;
I2caRegs.I2CIER.bit.XRDY=1;
因此、它在需要时仍然不会中断。
另外、 为什么在2CISRC.bit.INTCODE = 0时触发中断?
此外、如果我在 i2c ISR 开始时施加150微秒的延迟、则我的所有操作都将顺利进行。
那么、您能否帮助解决我为什么需要延迟的问题。
谢谢。
Sadar、
[引用 user="sagar shah54"]
我只有两个中断被启用。
I2caRegs.I2CIER.ALL = 0x0;
I2caRegs.I2CIER.bit.RRDY=1;
I2caRegs.I2CIER.bit.XRDY=1;
[/报价]
这些中断不用于使用、并且在使用 I2C FIFO 模式时可能不会触发。
[引用 user="sagar shah54"]当 2CISRC.bit.INTCODE = 0时为什么会触发中断?[/quot]
您是如何对此进行测试的? 当 CPU 读取 INTCODE 时、应该有相应的中断值。 可能是根据您看到的内容清除了它。
[引用 user="sagar shah54"]
此外、如果我在 i2c ISR 开始时施加150微秒的延迟、则我的所有操作都将顺利进行。
那么、您能否帮助解决我为什么需要延迟的问题。
[/报价]
您能否共享包含此延迟的 ISR 代码片段?
最棒的
Kevin
_interrupt void i2c_int1a_isr (void) // I2C-A { // int j; intcode = I2caRegs.I2CISRC.bit.INTCODE; if (intcode!= 0){ DELAY_US (130);//这是使其工作的延迟 if (I2caRegs.I2CSTR.bit.SDIR = 1 && intcode = 5){//将28379写入双核 I2caRegs.I2CDXR = dataRx[0]; while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据移位后、数据传输到内核 TX 寄存器 I2caRegs.I2CDXR = dataRx[1]; while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据移位后、数据传输到内核 TX 寄存器 I2caRegs.I2CDXR = dataRx[2]; while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据在数据移位后通过内核 TX 寄存器传输 I2caRegs.I2CDXR = dataRx[3]; while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据在数据移位 后通过内核 TX 寄存器传输} if (I2caRegs.I2CSTR.bit.SDIR =0 && intcode =4){//从28379读取并保存寄存器 while (I2caRegs.I2CFFRX.bit.RXFFST < 4){}; //等待4字节数据到达 for (j =0;j < 4;j++){ dataRx[j]= I2caRegs.I2CDRR; } }//案件结束 INT = 4 }// INTCODE 结束!= 0 PieCtrlRegs.PIEACX.ALL = PIEACK_group8; }
我不使用 FIFO 模式我使用的 Cnt = 4字节。 此外、当我在 ISR 中放入断点时、有时中断代码为0。
ISR 代码中显示了所需的延迟。 如果您需要任何东西、请告诉我、如果可能、希望我能快速理解。
谢谢、
Sagar
萨加尔
[引用 user="sagar shah54"]我不使用 FIFO 模式,我使用的 Cnt = 4字节。
不确定这是什么意思、看起来您使用的是 FIFO 模式。 在您在中提供寄存器值的第二个帖子中、I2CFFEN 和 RXFFRST 设置为1、从而启用 I2C FIFO。 您还在检查代码中的接收 FIFO 状态" while
(I2caRegs.I2CFFRX.bit.RXFFST < 4) {};'.
[引用 user="sagar shah54"]此外,当我在 ISR 中放入断点时,中断代码有时为0。
您是否在I2caRegs.I2CISRC.bit.INTCODE
intcode
断点处检查或检查变量? 如果您正在检查寄存器位、我希望在将值移动到intcode
变量后将其清除。 当 CPU 读取时、寄存器字段将被清除、intcode
您的变量应包含正确的值。
对我来说、对这种延迟的需求毫无意义。 INTCODE 已被读取、此时不会受到影响。 没有延迟会发生什么情况? 当您写入 TX 缓冲区时、总线可能会很忙? 您可以尝试添加一些其他状态寄存器检查(可能是 BB 位?) 然后再写入 I2CDXR.
最棒的
Kevin