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

[复制链接]
 楼主| trouvan 发表于 2016-7-28 01:08 | 显示全部楼层 |阅读模式
本帖最后由 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. }




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
 楼主| 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里的东西放在不同的文件里,
可是居然信号居然连变化也没变化
难道是寄存器配置问题?就那几个寄存器翻来覆去配置了一下午也没见什么改变
dirtwillfly 发表于 2016-7-28 19:51 | 显示全部楼层
刚开始的时候,官方代码不要一次改动那么大。
dirtwillfly 发表于 2016-7-28 19:53 | 显示全部楼层
肯定有哪里配置错了,或者配置的顺序不对。我用手机不方便看你对照官方例程,找找区别
vibra2016 发表于 2016-7-28 22:07 | 显示全部楼层
这个通讯还是非常重要的。
 楼主| trouvan 发表于 2016-7-28 22:33 | 显示全部楼层
dirtwillfly 发表于 2016-7-28 19:53
肯定有哪里配置错了,或者配置的顺序不对。我用手机不方便看你对照官方例程,找找区别 ...

谢谢!找到错误了!估计是昨晚看头文件的时候按到键盘了!!里面一个寄存器的值被我改动了!!
lzbf 发表于 2016-7-29 23:17 | 显示全部楼层
这个硬件的配置正确了吗?
lzbf 发表于 2016-7-29 23:19 | 显示全部楼层
怎么不用模拟的iic
 楼主| trouvan 发表于 2016-7-29 23:22 | 显示全部楼层
本帖最后由 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. }



评分

参与人数 1威望 +5 收起 理由
dirtwillfly + 5 很给力!

查看全部评分

dirtwillfly 发表于 2016-7-30 15:51 | 显示全部楼层
trouvan 发表于 2016-7-29 23:22
你好!这个配置还有一点错误。主要是一些时序上的问题。以下是我修改后的代码,能正常使用了,还未发现问题 ...

感谢分享
Garen2 发表于 2016-7-30 19:55 | 显示全部楼层
这到底是哪里出了问题
cehuafan 发表于 2016-7-30 22:17 | 显示全部楼层
缓存数据发不出?
cehuafan 发表于 2016-7-30 22:19 | 显示全部楼层
是不是你没有配置发送中断?
Soraka 发表于 2016-7-31 21:09 | 显示全部楼层
查看一下相应的寄存器,看看值到底有没变化
i1mcu 发表于 2016-8-1 23:12 | 显示全部楼层
换成模拟iis试试。
i1mcu 发表于 2016-8-1 23:14 | 显示全部楼层
G2553没有用过这个缓存发送。
houjiakai 发表于 2016-8-2 22:06 | 显示全部楼层
这个使用模拟iic不行吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

61

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部