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 作为从设备时 STOP中断信号提前的问题

Other Parts Discussed in Thread: MSP430FR2311

使用的芯片是:MSP430FR2311

I2C 作为从设备,在主机发送写命令时,会偶尔出现 “STOP中断 ”在“写最后一个数据的中断”前

  • 你用的官网例程还是自己写的iic从设备代码?

  • 初始化是按照官网来的,增加了起始信号、读写信号的中断
  • 都没人回答下么???

  • 有没有用示波器或者逻辑分析仪观察一下?

    建议上传下实际的时序图

  • 你没上传代码,但猜测你可能是遇到了这个问题:
    USCI/eUSCI状态图表示,在接收到最后一个字节前,需要设定UCTXSTP位。在只接收到一个字节的应用中,UCTXSTP位与UCTXSTT位一同设置。如果接收到多个字节,那么应该在接收到第N-1字节后设定UCTXSTP。这样就确保了在接收到最后一个字节后,立即发送停止序列。
  • 初始化:
    //Disable the USCI module
    UCB0CTLW0 = UCSWRST;

    //Clear USCI master mode
    UCB0CTLW0 &= ~UCMST;

    //Configure I2C as Slave and Synchronous mode
    UCB0CTLW0 |= 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 bit
    UCB0IE |= (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 flag
    TEpu_OnI2cEvent(SBase_I2CEVENT_START,0);
    break;
    case 0x08: // Vector 8: STPIFG break;
    UCB0IFG &= ~UCSTPIFG; // Clear stop condition int flag
    TEpu_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;
    }
    }
  • 我用的MSP430FR2311 是当做I2C 从设备!!!
    问题是:
    主机发送写数据后,会偶尔出现,在收到STOP中断后,再收到接收到数据的中断