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

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

$
0
0

参考了官方的例程,用官方的例程结合逻辑分析仪,可以看到明显的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;
  }
  
}

Viewing all articles
Browse latest Browse all 3634

Trending Articles