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