我再次打开本期。 上一个在这里:
它已经关闭了,但我真的没有看到修复它。
我使用与上面链接相同的风格、但门户不再识别、因为它已"停产"
我最近遇到重复启动条件问题、但问题已经解决、
不过、我现在要在 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 运行。
