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条回答
dirtwillfly
1楼-- · 2019-07-21 22:27
调试的时候,一步一步运行,会很久才能跳出while循环,可以直接跳出去
trouvan
2楼-- · 2019-07-22 03:00
 精彩回答 2  元偷偷看……
dirtwillfly
3楼-- · 2019-07-22 05:37
trouvan 发表于 2016-7-28 08:39
你好!不是跳不出while循环,是程序就停在那儿了。
我把断点下载while之后的语句,然后全速运行,也是跑 ...

参考这个帖子http://www.deyisupport.com/quest ... 0/f/55/t/52062.aspx
trouvan
4楼-- · 2019-07-22 05:50
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
5楼-- · 2019-07-22 09:50
刚开始的时候,官方代码不要一次改动那么大。
dirtwillfly
6楼-- · 2019-07-22 12:52
肯定有哪里配置错了,或者配置的顺序不对。我用手机不方便看你对照官方例程,找找区别

一周热门 更多>