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 外设空闲一段时间后(例如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], ®1) == 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。 哦、我明白了。
但是几周前、你们可以支持我之前在同一器件上发表的问题。
因此、现在我也感到困惑。
Ozzy.
您好、Ozzy、
以前为您提供支持的人员(Ralph Jacobi)不再是我们产品团队中的一员。 很抱歉没有指导。
嗨、Ozzy、
很抱歉,查尔斯和拉尔夫让我试着看看你的问题。 我看不到您的软件明显有任何错误、并返回了您引用的 E2E 帖子。 这个问题似乎解决了、因为这个问题似乎与 I2C 目标相关、或者他们停止了一起重复启动。 简单地说、我在该线程中没有看到基于432P 的问题。
我在下面添加了一个 MSP432Pxx 勘误表 USCI43、确实说明在轮询 RX 标志时 I2C 可能挂起。 在 I2C_ISR_WriteRead ()函数中,似乎是轮询 RX 标志。 如果 I2C 悬挂在此处、则可能需要将该函数重写为基于中断。
希望这可以帮助您解决此问题。
谢谢。
JD.