MSP430 G2553 硬件I2C中 发送缓冲寄存器里的值发不出去??

2019-07-21 18:48发布

本帖最后由 trouvan 于 2016-7-28 01:09 编辑

芯片是G2553   参考官方的代码,初始化P1.7为SDA  1.6为SCL

这是发送的代码。单步调试发现,进入过一次USCIAB0TX_ISR的中断,但之后就再也进不去了,一直停在最后那个while循环中。
  1. void HardI2C_Write(byte slaveAddress,byte address,byte data){
  2.       UCB0I2CSA=slaveAddress;
  3.       UCB0CTL1|=UCTR; //设置为发送模式
  4.       sendData[1]=address;
  5.       sendData[0]=data;
  6.       dataSendCnt=2;
  7.       UCB0CTL1|=UCTXSTT;//产生开始信号
  8.       __bis_SR_register(CPUOFF + GIE);
  9.       while (UCB0CTL1 & UCTXSTP);  
  10. }
复制代码按参考手册所说:
一旦数据由缓冲区转移到移位寄存器,UCBxTXIFG 将再次置位。

但我看了一下寄存器,缓冲区UCB0TXBUF一直都是有值得,也就是它原来的值一直没发出去,所以无法进入下一次中断。
困扰了一晚上,还是没解决。请大家帮忙。

(要通信的器件是MPU6050,430为主机,6050为从机。)





以下是中断代码:
  1. // USCI_B0 Data ISR
  2. #pragma vector = USCIAB0TX_VECTOR
  3. __interrupt void USCIAB0TX_ISR(void)

  4. {
  5.   if(IFG2&UCB0TXIFG){ //当是发送中断时
  6.     if(dataSendCnt){//有数据待发送
  7.       UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
  8.     }else{
  9.       UCB0CTL1|=UCTXSTP;//产生停止信号
  10.     }
  11.   }else if(IFG2&UCB0RXIFG){
  12.     --dataReceCnt;
  13.     if(!dataReceCnt){
  14.       UCB0CTL1|=UCTXSTP;//产生停止信号
  15.     }
  16.     receData[dataReceCnt]=UCB0RXBUF;
  17.   }
  18. }
复制代码



以下为初始化代码:
  1. void HardI2C_Init(){
  2.   P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  3.   P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  4.   UCB0CTL1 |= UCSWRST;  
  5.   UCB0CTL0=UCMST+UCMODE_3+UCSYNC;   //主控模式 i2c模式  同步模式
  6.   UCB0CTL1=UCSSEL_2+ UCSWRST;        //设置时钟为SMCLK
  7.   UCB0BR0 = 12;                             // 分频 = SMCLK/12 = ~100kHz
  8.   UCB0BR1 = 0;
  9.   UCB0CTL1 &= ~UCSWRST;
  10.   IE2 |= UCB0TXIE;      //发送中断使能
  11.   IE2 |= UCB0RXIE;      //接收中断使能
  12.   
  13. }
复制代码



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。