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.

[参考译文] MSPM0G3107-Q1:即使代码启用 I2Q IRQ、也不会启用它

Guru**** 2399165 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1413408/mspm0g3107-q1-i2q-irq-not-enabled-even-though-code-enables-it

器件型号:MSPM0G3107-Q1

工具与软件:

您好!

该代码有其他 I2C 子例程可以运行、但出于某种原因、未发生 I2C 中断、并且 IRQ 处理程序未从此子例程进入。

有什么建议吗?

谢谢!

Dave

PS。 生成中断。

void readADC_VZ ()

int adc_add = 0x14、adc_config = 0x80、adc_ch = 0xB0;//对于 ADC 通道0、Vz。
unsigned char 值[2]="";


NVIC_EnableIRQ (I2C_BRIDGE_INST_INT_IRQN);        //启用 I2C 控制器中断处理程序


delay_cycles (1000);

值[0]= ADC_ch;
Values[1]= ADC_CONFIG;

gI2C_Length = 2;

gI2C_Count = DL_I2C_fillControllerTXFIFO (I2C_BRIDGE_INST、&VALUE[0]、gI2C_Length);         // FIFO 为8字节深。

gI2cControllerStatus = I2C_STATUS_TX_START;

while (! (DL_I2C_getControllerStatus (I2C_BRIDGE_INST)和 DL_I2C_CONTROLLER_STATUS_IDLE);

DL_I2C_startControllerTransfer (I2C_BRIDGE_INST、ADC_ADD、DL_I2C_CONTROLLER_DIRECTION_TX、gI2C_Length);


/*等待直到控制器发送所有字节而没有 NACK */
while ((gI2cControllerStatus!= I2C_STATUS_TX_COMPLETE)&&(gI2cControllerStatus!= I2C_STATUS_ERROR)){_WFE ();}

while (DL_I2C_getControllerStatus (I2C_BRIDGE_INST)和 DL_I2C_CONTROLLER_STATUS_BUS_BUS);

while (!(DL_I2C_getControllerStatus (I2C_BRIDGE_INST)和 DL_I2C_CONTROLLER_STATUS_IDLE));

如果(gI2cControllerStatus!= I2C_STATUS_ERROR)、gOPUStatus = gOPUStatus & 0xFB;
否则 gOPUStatus = gOPUStatus | 0x04;

NVIC_DisableIRQ (I2C_BRIDGE_INST_INT_IRQN);        //禁用 I2C 控制器中断处理程序
}

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

    您好!

    该子例程可从 Timer0 IRQ 内调用。

    当我从 main()调用它时、I2C IRQ 将起作用。

    显然、当在 IRQ 内部时、其它中断被屏蔽。 有没有办法解决这个问题?

    谢谢!

    Dave

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

    在 ISR 中、具有相同或较低优先级(较高数字)的所有中断都会被屏蔽。 在复位时、所有中断具有相同的优先级(我认为是0或1;我这里没有说明)、所以结果是所有其他中断都被屏蔽。

    您可以尝试使用 NVIC_setpriority ( 、2)、保留 I2C 中断。 这意味着任何其他中断也会抢占计时器 ISR、但这可能没问题。

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

    谢谢 Bruce。

    为了安全起见、我想我要在 ISR 中设置一个标志并在主循环之外运行 I2C 活动。

    谢谢!

    Dave