使用的芯片是:MSP430FR2311
I2C 作为从设备,在主机发送写命令时,会偶尔出现 “STOP中断 ”在“写最后一个数据的中断”前
灰小子:
你用的官网例程还是自己写的iic从设备代码?
LUCA WANG:
回复 灰小子:
初始化是按照官网来的,增加了起始信号、读写信号的中断
LUCA WANG:
都没人回答下么???
灰小子:
回复 LUCA WANG:
有没有用示波器或者逻辑分析仪观察一下?
建议上传下实际的时序图
灰小子:
回复 灰小子:
你没上传代码,但猜测你可能是遇到了这个问题:
USCI/eUSCI状态图表示,在接收到最后一个字节前,需要设定UCTXSTP位。在只接收到一个字节的应用中,UCTXSTP位与UCTXSTT位一同设置。如果接收到多个字节,那么应该在接收到第N-1字节后设定UCTXSTP。这样就确保了在接收到最后一个字节后,立即发送停止序列。
LUCA WANG:
回复 灰小子:
初始化://Disable the USCI moduleUCB0CTLW0 = UCSWRST;
//Clear USCI master modeUCB0CTLW0 &= ~UCMST;
//Configure I2C as Slave and Synchronous modeUCB0CTLW0 |= UCMODE_3 | UCSYNC;
//Set up the slave address.UCB0I2COA0 = SMspI2c_SlaveAddr | UCOAEN;// own address is 0x48 + enable//UCB0CTLW1 &= ~UCETXINT;UCB0CTLW0 &= ~UCSWRST;// clear reset register//Clear the I2C interrupt source.UCB0IFG &= ~(UCRXIFG0 | UCTXIFG0| UCSTTIFG | UCSTPIFG);//UCSTPIFG UCSTTIFG//Enable the interrupt masked bitUCB0IE |= (UCRXIE0 | UCTXIE0| UCSTTIE | UCSTPIE);//UCSTPIE UCSTTIE__bis_SR_register(GIE);中断响应处理:
#pragma vector = USCI_B0_VECTOR
__interrupt void USCIB0_ISR(void)
{switch(__even_in_range(UCB0IV,UCIV__UCBIT9IFG)){case 0x06:// Vector 6: STTIFG break;UCB0IFG &= ~UCSTTIFG;// Clear start condition int flagTEpu_OnI2cEvent(SBase_I2CEVENT_START,0);break;case 0x08:// Vector 8: STPIFG break;UCB0IFG &= ~UCSTPIFG;// Clear stop condition int flagTEpu_OnI2cEvent(SBase_I2CEVENT_STOP,0);break;case 0x16:// Vector 24: RXIFG0 break;{u8 tmp;tmp = UCB0RXBUF;TEpu_OnI2cEvent(SBase_I2CEVENT_WRITE,tmp);}break;case 0x18:// Vector 26: TXIFG0 break;UCB0TXBUF = TEpu_OnI2cEvent(SBase_I2CEVENT_READ,0);break;case 0x00: break;// Vector 0: No interrupts break;case 0x02:// Vector 2: ALIFG break;case 0x04:// Vector 4: NACKIFG break;case 0x0a:// Vector 10: RXIFG3 break;case 0x0c:// Vector 14: TXIFG3 break;case 0x0e:// Vector 16: RXIFG2 break;case 0x10:// Vector 18: TXIFG2 break;case 0x12:// Vector 20: RXIFG1 break;case 0x14:// Vector 22: TXIFG1 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,__even_in_range(UCB0IV,UCIV__UCBIT9IFG));break;}
}
LUCA WANG:
回复 灰小子:
我用的MSP430FR2311 是当做I2C 从设备!!!
问题是:
主机发送写数据后,会偶尔出现,在收到STOP中断后,再收到接收到数据的中断