Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

I2C 作为从设备时 ,中断信号的顺序没有按照I2C协议标准

$
0
0

使用的芯片是: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中断会在读最后一个数据的中断前产生


Viewing all articles
Browse latest Browse all 3634

Trending Articles