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. }
复制代码



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
vibra2016
1楼-- · 2019-07-22 17:11
 精彩回答 2  元偷偷看……
trouvan
2楼-- · 2019-07-22 18:42
dirtwillfly 发表于 2016-7-28 19:53
肯定有哪里配置错了,或者配置的顺序不对。我用手机不方便看你对照官方例程,找找区别 ...

谢谢!找到错误了!估计是昨晚看头文件的时候按到键盘了!!里面一个寄存器的值被我改动了!!
lzbf
3楼-- · 2019-07-22 19:25
这个硬件的配置正确了吗?
lzbf
4楼-- · 2019-07-22 22:41
怎么不用模拟的iic
trouvan
5楼-- · 2019-07-23 04:37
本帖最后由 trouvan 于 2016-7-29 23:36 编辑
lzbf 发表于 2016-7-29 23:17
这个硬件的配置正确了吗?

你好!这个配置还有一点错误。主要是一些时序上的问题。以下是我修改后的代码,能正常使用了,还未发现问题:

  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+UCTR;        //设置时钟为SMCLK
  7.   UCB0BR0 = 12;                             // 分频 = SMCLK/12 = ~100kHz
  8.   UCB0BR1 = 0;
  9.   UCB0CTL1 &= ~UCSWRST;
  10. }

  11. void HardI2C_WriteInit(byte slaveAddress){
  12.   UCB0CTL1 |= UCTR;  
  13.   UCB0I2CSA = slaveAddress;
  14.   IFG2 &= ~UCB0TXIFG;
  15.   IE2 &= ~UCB0RXIE;               // disable Receive ready interrupt
  16.   IE2 |= UCB0TXIE;                // enable Transmit ready interrupt
  17. }

  18. void HardI2C_ReadInit(byte slaveAddress){
  19.     UCB0CTL1 &= ~UCTR;              // UCTR=0 => Receive Mode (R/W bit = 1)
  20.     UCB0I2CSA = slaveAddress;    // define Slave Address

  21.     IFG2 &= ~UCB0RXIFG;
  22.     IE2 &= ~UCB0TXIE;               // disable Transmit ready interrupt
  23.     IE2 |= UCB0RXIE;                // enable Receive ready interrupt
  24. }

  25. void HardI2C_Write(byte slaveAddress,byte address,byte data){
  26.   
  27.   while (UCB0STAT & UCBUSY) { // wait until I2C module has
  28.   }
  29.   sendData[1]=address;
  30.   sendData[0]=data;
  31.   dataSendCnt=2;
  32.   
  33.   HardI2C_WriteInit(slaveAddress);
  34.   UCB0CTL1 |= UCTXSTT;   //

  35.   __bis_SR_register(CPUOFF + GIE);
  36.   while (UCB0CTL1 & UCTXSTP){
  37.   }
  38. }

  39. byte HardI2C_Read(byte slaveAddress,byte address){
  40.   while (UCB0STAT & UCBUSY) { // wait until I2C module has
  41.   }
  42.   sendData[0]=address;//发送寄存器地址
  43.   dataSendCnt=1;
  44.   HardI2C_WriteInit(slaveAddress);
  45.   UCB0CTL1 |= UCTXSTT;   //
  46.   __bis_SR_register(CPUOFF + GIE);
  47.   while(UCB0CTL1&UCTXSTP){
  48.     ;//等待寄存器地址发完
  49.   }
  50.   //以下开始配置为接收模式
  51.   HardI2C_ReadInit(slaveAddress);
  52.   UCB0CTL1|=UCTXSTT;//产生开始信号
  53.   //dataReceCnt=1;
  54.   __bis_SR_register(CPUOFF + GIE);
  55.   UCB0CTL1 |= UCTXSTP;
  56.   while(UCB0CTL1&UCTXSTP);
  57.   return receData;
  58. }



  59. // USCI_B0 Data ISR
  60. #pragma vector = USCIAB0TX_VECTOR
  61. __interrupt void USCIAB0TX_ISR(void)

  62. {
  63.   if(IFG2&UCB0TXIFG){ //当是发送中断时
  64.     if(dataSendCnt){//有数据待发送
  65.       UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
  66.     }else{
  67.       UCB0CTL1 |= UCTXSTP;  
  68.       IFG2 &= ~UCB0TXIFG;
  69.       __bic_SR_register_on_exit(CPUOFF);
  70.     }
  71.   }else if(IFG2&UCB0RXIFG){
  72.     //--dataReceCnt;
  73.     //if(!dataReceCnt){
  74.       //UCB0CTL1|=UCTXSTP;//产生停止信号
  75.       //IFG2 &= ~UCB0RXIFG;
  76.       //__bic_SR_register_on_exit(CPUOFF);
  77.     //}
  78.     receData=UCB0RXBUF;
  79.     IFG2 &= ~UCB0RXIFG;
  80.     __bic_SR_register_on_exit(CPUOFF);
  81.   }
  82.   
  83. }
复制代码


dirtwillfly
6楼-- · 2019-07-23 08:54
 精彩回答 2  元偷偷看……

一周热门 更多>