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.

[参考译文] MSP432E401Y:I2C 卡在等待 TX 中断标志或 START 条件标志时

Guru**** 2527550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1208022/msp432e401y-i2c-stuck-waiting-for-tx-interrupt-flag-or-start-condition-flag

器件型号:MSP432E401Y

我再次打开本期。  上一个在这里:

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/967908/msp432p401r-i2c-stuck-waiting-for-tx-interrupt-flag-or-start-condition-flag

它已经关闭了,但我真的没有看到修复它。

我使用与上面链接相同的风格、但门户不再识别、因为它已"停产"

我最近遇到重复启动条件问题、但问题已经解决、

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1201698/msp432-debuggers-msp432p401r-cannot-get-i2c-repeated-start-condition-to-work-properly/4546672#4546672

不过、我现在要在 I2C 外设空闲一段时间后(例如15分钟)运行过上述的阻塞状态、然后我尝试访问我们的 KT_micro FM 调制器芯片来更改 FM 通道、它在执行重复启动条件时锁定在那里。  您可以看到示波器捕获、显示先前写入的开始条件、然后外设挂起。   没有时钟或数据。   

void FMTuneFreq(uint16_t frequency) {
    //CHSEL[11:0] = Reg0x1[2:0] : Reg0x0[7:0] : Reg0x2[7]
    uint8_t reg1 = 0, reg2 = 0, reg3 = 0;
    uint8_t u8Buff[2];

    frequency = frequency / 5;

    //Reg0x0[7:0]
    FM_TXDATA[0] = 0x00;
    FM_TXDATA[1] = (frequency & 0x01FE) >> 1;
    FMAPI_I2C_ISR_MultiWrite();

    //Reg0x1[2:0]
    FM_TXDATA[0] = 0x01;

    if (FMAPI_I2C_ISR_WriteRead(FM_TXDATA[0], &reg1) == SUCCESS) {
        FM_TXDATA[1] = (reg1 & 0xF8 ) | ((frequency & 0x0E00) >> 9);
        FMAPI_I2C_ISR_MultiWrite();
    }

uint8_t FMAPI_I2C_ISR_WriteRead(uint8_t TXData, uint8_t * data)
{
    uint8_t status = SUCCESS;

    /* Send out start + address + 1 data byte */
    I2C_masterSendMultiByteStart(EUSCI_B0_BASE, TXData);   //Removed MAP_

   //wait for first byte to be moved to shift register
   while(!(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG));
   EUSCI_B0->IFG &= ~(EUSCI_B_IFG_TXIFG);

   // Before the restart is sent, app has to wait for current TX byte + ack to complete
   // This takes 9 cycles at 100kHz = 90uS
   // The MCLK default = ~3MHz
   // to complete the 1 byte TX app needs to wait ~270 MCLK cycles at a minimum
   __delay_cycles(2500);

   //clear the TR bit to setup master as receiver
   EUSCI_B0->CTLW0 &= ~(EUSCI_B_CTLW0_TR);
   // Send the start + address
   EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;

   __delay_cycles(500);    //250 before

   // wait for address to be sent
   while(!(EUSCI_B0->CTLW0 & EUSCI_B_CTLW0_TXSTT));
   // set stop immediately to ensure only one byte is read
   EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP;
   // poll RX flag
   while(!(EUSCI_B0->IFG & EUSCI_B_IFG_RXIFG0));
   // Read from Receive buffer
   *data = EUSCI_B0->RXBUF;
   // ensure I2C transaction has completed
   while (MAP_I2C_masterIsStopSent(EUSCI_B0_BASE));


    return(status);
}

我认为延迟不会解决这个问题,因为与重复启动条件问题不同,添加延迟不会解决这个问题。  它与外设几乎一样被锁定、需要重新初始化。

我以100Mhz 运行 I2C、MCLK 以24MHz 运行。

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

    您好!

     我对您遇到问题的器件有点困惑。 您的主题标题是关于 MSP432E。  是 MSP432E 还是 MSP432P。  如果这是针对 MSP432P 的器件、已停产、而且对此器件的了解有限、我们将不再在 E2E 论坛上为其提供技术支持。  您可以在 E2E 论坛中搜索以前讨论的存档帖子、这些帖子可以帮助解决您的问题。 很抱歉没有指导。  

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

    Charles

    很抱歉耽误你的时间。 MSP432P401R。   哦、我明白了。  

    但是几周前、你们可以支持我之前在同一器件上发表的问题。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1201698/msp432-debuggers-msp432p401r-cannot-get-i2c-repeated-start-condition-to-work-properly/4546672#4546672

    因此、现在我也感到困惑。

    Ozzy.

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

    您好、Ozzy、

     以前为您提供支持的人员(Ralph Jacobi)不再是我们产品团队中的一员。 很抱歉没有指导。  

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

    嗨、Ozzy、

    很抱歉,查尔斯和拉尔夫让我试着看看你的问题。  我看不到您的软件明显有任何错误、并返回了您引用的 E2E 帖子。  这个问题似乎解决了、因为这个问题似乎与 I2C 目标相关、或者他们停止了一起重复启动。  简单地说、我在该线程中没有看到基于432P 的问题。   

     我在下面添加了一个 MSP432Pxx 勘误表 USCI43、确实说明在轮询 RX 标志时 I2C 可能挂起。  在 I2C_ISR_WriteRead ()函数中,似乎是轮询 RX 标志。  如果 I2C 悬挂在此处、则可能需要将该函数重写为基于中断。   

     

    希望这可以帮助您解决此问题。   

    谢谢。

    JD.