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