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.

msp430 g2553 硬件I2C配置完之后,SDA与SCL电平不变化

参考了官方的例程,用官方的例程结合逻辑分析仪,可以看到明显的I2C开始波形、传递字节波形

但是我按照需要将其分为几个函数之后,SDA线和SCL线就一动不动了,SDA一直是低电平,SCL一直是高电平

请问这是什么问题? 我看了下官方例程的寄存器配置,和我的差不多啊,翻来覆去配了一下午,还是不行,请教各位

芯片是g2553 ,launchpad ,P1.7接SDA,P1.6接SCL(P1.6和LED的跳线帽已经拔掉)

以下是I2C初始化函数

void HardI2C_Init(){
  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  UCB0CTL1 |= UCSWRST;  
  UCB0CTL0=UCMST+UCMODE_3+UCSYNC;   //主控模式 i2c模式  同步模式
  UCB0CTL1=UCSSEL_2+ UCSWRST+UCTR;        //设置时钟为SMCLK
  UCB0BR0 = 12;                             // 分频 = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0CTL1 &= ~UCSWRST;
}
void HardI2C_WriteInit(byte slaveAddress){
  UCB0CTL1 |= UCTR;  
  UCB0I2CSA = slaveAddress;
  IFG2 &= ~UCB0TXIFG;
  IE2 &= ~UCB0RXIE;               // disable Receive ready interrupt
  IE2 |= UCB0TXIE;                // enable Transmit ready interrupt
}
void HardI2C_Write(byte slaveAddress,byte address,byte data){
  while (UCB0STAT & UCBUSY) { // wait until I2C module has
  }
  sendData[1]=address;
  sendData[0]=data;
  dataSendCnt=2;
  
  HardI2C_WriteInit(slaveAddress);
  UCB0CTL1 |= UCTXSTT;   //

  __bis_SR_register(CPUOFF + GIE);
  while (UCB0CTL1 & UCTXSTP){
  }
}

以下是中断函数

// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)

{
  if(IFG2&UCB0TXIFG){ //当是发送中断时
    if(dataSendCnt){//有数据待发送
      UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
    }else{
      IE2 &= ~UCB0TXIE;  
      IFG2 &= ~UCB0TXIFG;
      UCB0CTL1 |= UCTXSTP;  
      __bis_SR_register(CPUOFF); 
    }
  }else if(IFG2&UCB0RXIFG){
    --dataReceCnt;
    if(!dataReceCnt){
      UCB0CTL1|=UCTXSTP;//产生停止信号
    }
    receData[dataReceCnt]=UCB0RXBUF;
  }
  
}
  • 找到错误了!原来是之前看头文件里的寄存器的时候改到了其中一个寄存器!!!

  • 解决了!因为头文件里寄存器的值被不小心改过了!两条信号线有变化了!

    另外,中断函数那儿也有个问题,离开中断时要退出休眠,那里写成进入休眠了

x 出现错误。请重试或与管理员联系。