TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

该讨论已被锁定。
您不能再向该讨论中发布新回复。如果您有问题可以开始新讨论

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中断后,再收到接收到数据的中断