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.

MSP430F169进行I2C模拟时,设置单次发送模式,在进行一次发送完成后,不能跳回主程序



中断设置的相关程序

P3SEL = 0x0a; //将P3.1和P3.3选择为第二功能:P3.3->SCL,P3.1->SDA;
U0CTL |= I2C + SYNC; //设置USART0为I2C模式;
U0CTL &= ~I2CEN; //禁止I2C模块以配置如下寄存器;
//I2CTCTL |= I2CSSEL_2; //I2C模块时钟选择SMCLK;
I2CTCTL |= I2CSSEL1;
I2COA = 0x0048; //本地地址初始化为0x48;
I2CIE |= TXRDYIE; //打开发送准备好中断控制;
U0CTL |= I2CEN; //使能I2C模块;

#pragma vector = USART0TX_VECTOR
__interrupt void SI2C_ISR(void)
{

switch(I2CIV)
{
case 0: break;
case 2: break;
case 4: break;
case 6: break;
case 8: break;
case 10: break;
case 12:

if(k<3)
{
I2CDRB = TXData[k];
TXData[k]=0;
k++;
}
else

k=0;
//因为我是将24位的数进行拆分,分成了3个8位
break;

case 14: break;
case 16: break;
default: break;
}
}

这是进行了一次传输,但没跳回主程序,进行下一次数据传输,在中断中应该是漏了什么返回的操作,不知道是什么,求大神解释下

  •  您好,请问您是把MSP430169做主还是做从使用?代码中未看到相关设置。

    建议您参考MSP430Ware中的对应参考代码。若是作为Master,可参考以下(摘自MSP430Ware 示例"fet140_i2c_08")

      P3SEL |= 0x0A;                            // Select I2C pins
      U0CTL |= I2C + SYNC;                      // Recommended init procedure
      U0CTL &= ~I2CEN;                          // Recommended init procedure
      I2CTCTL |= I2CSSEL1 + I2CTRX;             // SMCLK, transmit
      I2CNDAT = 0x03;                           // Write Three bytes
      I2CSA = 0x0048;                           // Slave Address is 048h
      U0CTL |= I2CEN;                           // Enable I2C

      U0CTL |= MST;                             // Master mode
      I2CTCTL |= I2CSTT + I2CSTP;               // Initiate transfer

     

    谢谢!