使用的芯片是:MSP430FR2311, 作为I2C从设备
初始化代码(端口配置除外):
//Disable the USCI module
UCB0CTLW0 = UCSWRST;
//Clear USCI master mode
UCB0CTLW0 &= ~UCMST;
//Configure I2C as Slave and Synchronous mode
UCB0CTLW0 |= UCMODE_3 | UCSYNC;
//UCB0CTLW1 |= UCCLTO_3| UCGLIT_3;
//Set up the slave address.
UCB0I2COA3 = SMspI2c_SlaveAddr | UCOAEN; // own address is 0x48 + enable
//UCB0CTLW1 &= ~UCETXINT;
UCB0CTLW0 &= ~UCSWRST; // clear reset register
//Clear the I2C interrupt source.
UCB0IFG &= ~(UCRXIFG3 | UCTXIFG3| UCSTTIFG | UCSTPIFG);//UCSTPIFG UCSTTIFG UCCLTOIFG
//Enable the interrupt masked bit
UCB0IE |= (UCRXIE3 | UCTXIE3| UCSTTIE | UCSTPIE);//UCSTPIE UCSTTIE UCCLTOIE
__bis_SR_register(GIE);
中断处理代码:
BOOL uscib_flag;
#pragma vector = USCI_B0_VECTOR
__interrupt void USCIB0_ISR(void)
{
u16 temp;
temp = __even_in_range(UCB0IV,UCIV__UCBIT9IFG);
switch(temp)
{
case 0x06: // Vector 6: STTIFG break;
UCB0IFG &= ~UCSTTIFG; // Clear start condition int flag
//TEpu_OnI2cEvent(SBase_I2CEVENT_START,0);
uscib_flag = FALSE;
break;
case 0x08: // Vector 8: STPIFG break;
UCB0IFG &= ~UCSTPIFG; // Clear stop condition int flag
//TEpu_OnI2cEvent(SBase_I2CEVENT_STOP,0);
uscib_flag = TRUE;
break;
case 0x16: // Vector 24: RXIFG0 break;
case 0x12: // Vector 20: RXIFG1 break;
case 0x0e: // Vector 16: RXIFG2 break;
case 0x0a: // Vector 10: RXIFG3 break;
{
u8 tmp;
tmp = UCB0RXBUF;
if(uscib_flag)
{
tmp++;
}
//TEpu_OnI2cEvent(SBase_I2CEVENT_WRITE,tmp);
}
break;
case 0x18: // Vector 26: TXIFG0 break;
case 0x14: // Vector 22: TXIFG1 break;
case 0x10: // Vector 18: TXIFG2 break;
case 0x0c: // Vector 14: TXIFG3 break;
UCB0TXBUF = 0xA5;//TEpu_OnI2cEvent(SBase_I2CEVENT_READ,0);
if(uscib_flag)
{
__no_operation();
}
break;
case 0x00: break; // Vector 0: No interrupts break;
case 0x02: // Vector 2: ALIFG break;
case 0x04: // Vector 4: NACKIFG break;
case 0x1a: // Vector 28: BCNTIFG break;
case 0x1c: // Vector 30: clock low timeout break;
case 0x1e: // Vector 32: 9th bit break;
default:
//TEpu_OnI2cEvent(SBase_I2CEVENT_OTHER,temp);
break;
}
}
问题现象:
I2C主机定时来读数据且读数据正常,从机这边设置断点,会执行到“ __no_operation(); ”
问题是,在发送中断前,没有检测到START中断,而是STOP中断;通过另一种方式跟踪发现,在主机读取数据时,STOP中断会在读最后一个数据的中断前产生