下面是我的 i2c ISR 代码的两个副本。 第一个副本仅传输、看起来运行良好(我可能已经看到锁定(即数据线被拉低、从未释放一次或两次)。 第二个副本是尝试向其添加接收。 接收只允许一个寄存器读取、写入允许多次写入。 第二个代码块不断崩溃。 我经常只得到时钟输出的地址和 LCD 从机的 NACK……从机有电源,我在 SDA、SCL 线路上有4.75k Ω 的上拉电阻。 主器件是 MSP430FR2355开发板。 问题:
1. 是否有人可以告诉我、我是否通过发出 I2C 停止来适当地处理时钟低电平和 NACK?
2. 有人能告诉我我我是否有任何问题?
仅具有 TX 的 ISR:(请注意、虽然我处理时钟低电平、但我在这里不处理 NACK)
switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
{
case USCI_NONE: break;
case USCI_I2C_UCALIFG: break;
case USCI_I2C_UCNACKIFG: break;
case USCI_I2C_UCSTTIFG: break;
case USCI_I2C_UCSTPIFG:
ISR.I2CComplete = T;
LPM3_EXIT;
break;
case USCI_I2C_UCRXIFG3: break;
case USCI_I2C_UCTXIFG3: break;
case USCI_I2C_UCRXIFG2: break;
case USCI_I2C_UCTXIFG2: break;
case USCI_I2C_UCRXIFG1: break;
case USCI_I2C_UCTXIFG1: break;
case USCI_I2C_UCRXIFG0:
break;
case USCI_I2C_UCTXIFG0:
applicationI2C.pSysCommsB->UCBxTXBUF = *pI2CStream;
pI2CStream++;
break;
case USCI_I2C_UCBCNTIFG: break;
case USCI_I2C_UCCLTOIFG:
applicationI2C.pSysCommsB->UCBxIFG |= UCSTPIFG;
break;
case USCI_I2C_UCBIT9IFG: break;
default: break;
}
具有 rcv 功能的 ISR:
switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
{
case USCI_NONE: break;
case USCI_I2C_UCALIFG: break;
case USCI_I2C_UCNACKIFG:
applicationI2C.pSysCommsB->UCBxIFG |= UCSTPIFG;
break;
case USCI_I2C_UCSTTIFG: break;
case USCI_I2C_UCSTPIFG:
applicationUART.pSysCommsA->UCAxIE |= UCTXIE;
ISR.I2CComplete = T;
LPM3_EXIT;
break;
case USCI_I2C_UCRXIFG3: break;
case USCI_I2C_UCTXIFG3: break;
case USCI_I2C_UCRXIFG2: break;
case USCI_I2C_UCTXIFG2: break;
case USCI_I2C_UCRXIFG1: break;
case USCI_I2C_UCTXIFG1: break;
case USCI_I2C_UCRXIFG0:
applicationUART.pSysCommsA->UCAxTXBUF = applicationI2C.pSysCommsB->UCBxRXBUF;
applicationI2C.pSysCommsB->UCBxIE &= ~UCRXIE0;
applicationI2C.pSysCommsB->UCBxIFG |= UCSTPIFG;
break;
case USCI_I2C_UCTXIFG0:
if (applicationI2C.pSysCommsB->UCBxCTLW[0] & UCTR)
{
applicationI2C.pSysCommsB->UCBxTXBUF = *pI2CStream;
pI2CStream++;
/*
* UART ASCII --> 2 chars
* a read will be two UART
* chars representing address
*/
if (mssgLength < 3)
{
applicationI2C.pSysCommsB->UCBxCTLW[0] &= ~UCTR;
applicationI2C.pSysCommsB->UCBxCTLW[0] |= UCTXSTT;
applicationI2C.pSysCommsB->UCBxIE &= ~UCTXIE;
}
//}
break;
case USCI_I2C_UCBCNTIFG: break;
case USCI_I2C_UCCLTOIFG:
applicationI2C.pSysCommsB->UCBxIFG |= UCSTPIFG;
break;
case USCI_I2C_UCBIT9IFG: break;
default: break;
}

