本帖最后由 trouvan 于 2016-7-28 01:09 编辑
芯片是G2553 参考官方的代码,初始化P1.7为SDA 1.6为SCL
这是发送的代码。单步调试发现,进入过一次USCIAB0TX_ISR的中断,但之后就再也进不去了,一直停在最后那个while循环中。
void HardI2C_Write(byte slaveAddress,byte address,byte data){
UCB0I2CSA=slaveAddress;
UCB0CTL1|=UCTR; //设置为发送模式
sendData[1]=address;
sendData[0]=data;
dataSendCnt=2;
UCB0CTL1|=UCTXSTT;//产生开始信号
__bis_SR_register(CPUOFF + GIE);
while (UCB0CTL1 & UCTXSTP);
}
按参考手册所说:
一旦数据由缓冲区转移到移位寄存器,UCBxTXIFG 将再次置位。
但我看了一下寄存器,缓冲区UCB0TXBUF一直都是有值得,也就是它原来的值一直没发出去,所以无法进入下一次中断。
困扰了一晚上,还是没解决。请大家帮忙。
(要通信的器件是MPU6050,430为主机,6050为从机。)
以下是中断代码:
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if(IFG2&UCB0TXIFG){ //当是发送中断时
if(dataSendCnt){//有数据待发送
UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
}else{
UCB0CTL1|=UCTXSTP;//产生停止信号
}
}else if(IFG2&UCB0RXIFG){
--dataReceCnt;
if(!dataReceCnt){
UCB0CTL1|=UCTXSTP;//产生停止信号
}
receData[dataReceCnt]=UCB0RXBUF;
}
}
以下为初始化代码: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; //设置时钟为SMCLK
UCB0BR0 = 12; // 分频 = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST;
IE2 |= UCB0TXIE; //发送中断使能
IE2 |= UCB0RXIE; //接收中断使能
}
|