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.

[参考译文] TM4C123GH6PM:I2C 中断提示

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/592966/tm4c123gh6pm-i2c-interrupt-quesiton

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

我很困惑...

I2cStateMachine.slaveAddress = MCP23017_BUS_ADDRESS_AZ;
I2cStateMachine.registerAddress = MCP23017_GPIOA_DIR_REG;
memset (&I2cStateMachine.dataBytes、0、2);
I2cStateMachine.dataSize = 2;
IntTrigger (INT_I2C0);
while (I2cStateMachine.currentState!= I2C_State_stop);
I2cStateMachine.currentState = I2C_State_Idle;

int i = 0;
while (i < 1000000){i++;}

当我运行以下代码时、我总共得到了由 I2C 主器件生成的五个中断。  第一个是0x00、我假设它是用于启动事务的 IntTrigger (INT_I2C0)调用的结果。  我将发送两个字节。  第一个字节是远程器件的寄存器地址、第二个字节是要写入该寄存器的数据。  我的中断处理程序再被调用四次、所有调用都使用中断位0x0001

#define I2C_MASTER_INT_DATA  0x00000001 //数据中断 <= 来自 driverlib 中的 I2c.h 文件。

我只需要两个中断、每个字节完成时一个中断。  我缺少什么??

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、
    请检查 ISR、并确保在退出 ISR 之前不会太晚清除该标志。 如果中断标志的清除在 ISR 的末尾完成、那么它可以在退出后再次进入。 存在一些竞态条件、因为在写入前需要一个周期来清除标志以达到实际触发器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    清除中断是我在 ISR 中首先执行的操作。

    void I2C0IntHandler (void){

        uint32_t ui32I2CMasterInterruptStatus;

        //获取屏蔽的中断状态并清除标志

        ui32I2CMasterInterruptStatus = I2CMasterIntStatusEx (I2C0_BASE、TRUE);

        I2CMasterIntClearEx (I2C0_BASE、ui32I2CMasterInterruptStatus);

        switch (I2cStateMachine.currentState){

        情况 I2C_State_Idle

    //发送地址字节

    I2CMasterSlaveAddrSet (I2C0_BASE、I2cStateMachine.slaveAddressI2C_OP_WRITE);

    I2CMasterDataPut (I2C0_BASE、I2cStateMachine.registerAddress);

    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

    I2cStateMachine.currentState = I2C_State_data

    字节计数= 0;

    中断;

    案例 I2C_State_data

    if (ui32I2CMasterInterruptStatus & I2C_MASTER_INT_NACK){

    I2cStateMachine.currentState = I2C_State_stop

    否则

    I2CMasterDataPut (I2C0_BASE、(uint8_t)(I2cStateMachine.dataBytes[byteCount]);

    字节计数++;

    if (byteCount < I2cStateMachine.dataSize){

    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);

    I2cStateMachine.currentState = I2C_State_data

    否则

    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

    I2cStateMachine.currentState = I2C_State_stop

    中断;

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我注意到的一点是、如果我在 ISR 中读取 I2C 主机控制/状态(I2CMCS)寄存器、它会在 IDLE 和 BUSBUSY 之间切换。

    中断0 - IntTrigger()调用、空闲位被置位、第一个字节被写入。
    中断1 - BUSBUSY 被置位、第二个字节被写入
    中断2 -空闲
    中断3 - BUSBUSY
    中断4 -空闲

    当 BUSBUSY 位置位时、我尝试退出 ISR、没有执行任何操作、只是挂起。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据数据表、中断在传输完成时生效、我假设这意味着当总线状态从忙状态变为空闲状态时、它将生成中断、但似乎在启动和完成时生成中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brian、
    我建议进行一些实验。 如果只发送一个字节而不是两个字节、该怎么办? 不发送任何字节会怎么样? 您为每个中断获得多少个中断? 还请设置一个观察点、用于写入 I2CMCS 寄存器地址0x4002_0004。 检查 I2CMCS 被写入的次数、每次写入的值是多少。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯 -  

    我能够使它正常工作。  我不确定这是最好的方法、但这里是...

    这三行被添加到中断处理程序中、这样、当中断发生且总线空闲时、我只转换到状态机的下一状态。

    有什么想法?

    uint32_t MRiS_R = I2C0_MRiS_R;

    I2CMasterIntClear (I2C0_BASE);

    if ((I2C0_MCS-78_R & 0x00000020)&&(MRI_R & 0x00000001)){return;}

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

    您好 Brian、

     我相信您在另一篇文章中看到了以下内容:

    I2CMasterIntEnableEx (I2C0_BASE、(I2C_MASTER_INT_ARB_Lost | I2C_MASTER_INT_STOP | I2C_MASTER_INT_NACK |

    I2C_MASTER_INT_TIMEOUT | I2C_MASTER_INT_DATA);

    您可以尝试以下操作:

    I2CMasterIntEnableEx (I2C0_BASE、(I2C_MASTER_INT_TIMEOUT | I2C_MASTER_INT_DATA);

    原因是您将为 TM4C129创建的示例代码移植到 TM4C123。 TM4C123只有两个中断源。 请参阅下面的内容。 我只是想确保额外的中断不是由一些幻象事件引起的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Tm4C123上是否有中断驱动型 I2C 的示例或示例代码? 我以为我有了它、但它仍然不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、
    下面显示了 i2c 示例 \examples\peripherals\i2c。 但是、其中只有一个是由中断驱动的、它用于从器件、而不是主器件。 我想、如果您在论坛中搜索一点、您将找到一些适用于 TM4C123的中断驱动代码。 我也会进行一些搜索。