打印

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

[复制链接]
1677|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
trouvan|  楼主 | 2016-7-28 01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;      //接收中断使能
  
}




相关帖子

沙发
dirtwillfly| | 2016-7-28 07:59 | 只看该作者
调试的时候,一步一步运行,会很久才能跳出while循环,可以直接跳出去

使用特权

评论回复
板凳
trouvan|  楼主 | 2016-7-28 08:39 | 只看该作者
dirtwillfly 发表于 2016-7-28 07:59
调试的时候,一步一步运行,会很久才能跳出while循环,可以直接跳出去

你好!不是跳不出while循环,是程序就停在那儿了。
我把断点下载while之后的语句,然后全速运行,也是跑不过去

使用特权

评论回复
地板
dirtwillfly| | 2016-7-28 09:13 | 只看该作者
trouvan 发表于 2016-7-28 08:39
你好!不是跳不出while循环,是程序就停在那儿了。
我把断点下载while之后的语句,然后全速运行,也是跑 ...

参考这个帖子http://www.deyisupport.com/quest ... 0/f/55/t/52062.aspx

使用特权

评论回复
5
trouvan|  楼主 | 2016-7-28 17:41 | 只看该作者
dirtwillfly 发表于 2016-7-28 09:13
参考这个帖子http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55/t/52062.aspx ...

拿逻辑分析仪试了一下,只要用我的代码,SDA和SCL两条线是死活不动……
SDA一直是低电平,SCL一直是高电平。
拿官方的代码试了一下,好歹能看出有I2C开始信号、传送地址等变化

我的代码就是把官方的按照自己的需求模块化一下,把他写在main里的东西放在不同的文件里,
可是居然信号居然连变化也没变化
难道是寄存器配置问题?就那几个寄存器翻来覆去配置了一下午也没见什么改变

使用特权

评论回复
6
dirtwillfly| | 2016-7-28 19:51 | 只看该作者
刚开始的时候,官方代码不要一次改动那么大。

使用特权

评论回复
7
dirtwillfly| | 2016-7-28 19:53 | 只看该作者
肯定有哪里配置错了,或者配置的顺序不对。我用手机不方便看你对照官方例程,找找区别

使用特权

评论回复
8
vibra2016| | 2016-7-28 22:07 | 只看该作者
这个通讯还是非常重要的。

使用特权

评论回复
9
trouvan|  楼主 | 2016-7-28 22:33 | 只看该作者
dirtwillfly 发表于 2016-7-28 19:53
肯定有哪里配置错了,或者配置的顺序不对。我用手机不方便看你对照官方例程,找找区别 ...

谢谢!找到错误了!估计是昨晚看头文件的时候按到键盘了!!里面一个寄存器的值被我改动了!!

使用特权

评论回复
10
lzbf| | 2016-7-29 23:17 | 只看该作者
这个硬件的配置正确了吗?

使用特权

评论回复
11
lzbf| | 2016-7-29 23:19 | 只看该作者
怎么不用模拟的iic

使用特权

评论回复
12
trouvan|  楼主 | 2016-7-29 23:22 | 只看该作者
本帖最后由 trouvan 于 2016-7-29 23:36 编辑
lzbf 发表于 2016-7-29 23:17
这个硬件的配置正确了吗?

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

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_ReadInit(byte slaveAddress){
    UCB0CTL1 &= ~UCTR;              // UCTR=0 => Receive Mode (R/W bit = 1)
    UCB0I2CSA = slaveAddress;    // define Slave Address

    IFG2 &= ~UCB0RXIFG;
    IE2 &= ~UCB0TXIE;               // disable Transmit ready interrupt
    IE2 |= UCB0RXIE;                // enable Receive 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){
  }
}

byte HardI2C_Read(byte slaveAddress,byte address){
  while (UCB0STAT & UCBUSY) { // wait until I2C module has
  }
  sendData[0]=address;//发送寄存器地址
  dataSendCnt=1;
  HardI2C_WriteInit(slaveAddress);
  UCB0CTL1 |= UCTXSTT;   //
  __bis_SR_register(CPUOFF + GIE);
  while(UCB0CTL1&UCTXSTP){
    ;//等待寄存器地址发完
  }
  //以下开始配置为接收模式
  HardI2C_ReadInit(slaveAddress);
  UCB0CTL1|=UCTXSTT;//产生开始信号
  //dataReceCnt=1;
  __bis_SR_register(CPUOFF + GIE);
  UCB0CTL1 |= UCTXSTP;
  while(UCB0CTL1&UCTXSTP);
  return receData;
}



// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)

{
  if(IFG2&UCB0TXIFG){ //当是发送中断时
    if(dataSendCnt){//有数据待发送
      UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
    }else{
      UCB0CTL1 |= UCTXSTP;  
      IFG2 &= ~UCB0TXIFG;
      __bic_SR_register_on_exit(CPUOFF);
    }
  }else if(IFG2&UCB0RXIFG){
    //--dataReceCnt;
    //if(!dataReceCnt){
      //UCB0CTL1|=UCTXSTP;//产生停止信号
      //IFG2 &= ~UCB0RXIFG;
      //__bic_SR_register_on_exit(CPUOFF);
    //}
    receData=UCB0RXBUF;
    IFG2 &= ~UCB0RXIFG;
    __bic_SR_register_on_exit(CPUOFF);
  }
  
}



使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
dirtwillfly + 5 很给力!
13
dirtwillfly| | 2016-7-30 15:51 | 只看该作者
trouvan 发表于 2016-7-29 23:22
你好!这个配置还有一点错误。主要是一些时序上的问题。以下是我修改后的代码,能正常使用了,还未发现问题 ...

感谢分享

使用特权

评论回复
14
Garen2| | 2016-7-30 19:55 | 只看该作者
这到底是哪里出了问题

使用特权

评论回复
15
cehuafan| | 2016-7-30 22:17 | 只看该作者
缓存数据发不出?

使用特权

评论回复
16
cehuafan| | 2016-7-30 22:19 | 只看该作者
是不是你没有配置发送中断?

使用特权

评论回复
17
Soraka| | 2016-7-31 21:09 | 只看该作者
查看一下相应的寄存器,看看值到底有没变化

使用特权

评论回复
18
i1mcu| | 2016-8-1 23:12 | 只看该作者
换成模拟iis试试。

使用特权

评论回复
19
i1mcu| | 2016-8-1 23:14 | 只看该作者
G2553没有用过这个缓存发送。

使用特权

评论回复
20
houjiakai| | 2016-8-2 22:06 | 只看该作者
这个使用模拟iic不行吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

61

帖子

1

粉丝