各位大神帮忙,MSP430G2553的IIC程序,在线等

2019-03-24 10:48发布

单步仿真都能过,但是F5直接运行会停在  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空 ,查看标志位IFG2 = 0x82,发送数据后,UCB0TXIFG标志被清零。
请各位大神帮忙,在线等!!!感谢!!!!!


void I2C_Init(void)
{
  WDTCTL = WDTPW + WDTHOLD;              //关闭看门狗定时器
  P1SEL |= (BIT6 + BIT7);                // P1.6 = SCL, P1.7=SDA
  P1SEL2 |= (BIT6 + BIT7);               // P1.6 = SCL, P1.7=SDA

  // Assign I2C pins to USCI_B0
  UCB0CTL1 |= UCSWRST;                   //复位
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;  //主模式+IIC模式+同步模式
  UCB0CTL1 |= UCSSEL_2 + UCSWRST;        //SMCLK+复位
  UCB0BR0 = 10;                          //时钟分频设置(UCBxBR0 + UCBxBR1 × 256)
  UCB0BR1 = 0;
  UCB0I2CSA = (0x50>>1);                 //7位地址
  UCB0CTL1 &= ~UCSWRST;                  //清复位标志
  __delay_cycles(20000);
  __delay_cycles(20000);
}

void I2C_write(unsigned char WriteValH,unsigned char WriteValL)
{
  I2C_Init();
  UCB0I2CSA = (0x50>>1);
  while(UCB0CTL1 & UCTXSTP);            //If ICC Stop
  UCB0CTL1 |= UCTR;
  UCB0CTL1 |= UCTXSTT;           //IIC Start + Write


  //while((IFG2 & UCB0TXIFG) != UCB0TXIFG); //判断UCB0TXBUF是否为空
  //UCB0TXBUF = 0x50;                     //Send X9119 Address
  //UCB0I2CSA = (0x50>>1);

  //while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  //__delay_cycles(1000);
  //__delay_cycles(1000);
  //__delay_cycles(1000);
  //__delay_cycles(1000);
  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
  UCB0TXBUF = 0xA0;                     //Send X9119 Write

  while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);

  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
  UCB0TXBUF = WriteValH;                //Send H
  while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);

  while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
  UCB0TXBUF = WriteValL;                //Send L
  while((UCB0CTL1 & UCTXSTT) == UCTXSTT); //检测ACK信号,如果有ACK信号,则UCTXSTT自动清零
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);
  __delay_cycles(20000);

  UCB0CTL1 |= UCTXSTP + UCTXNACK;        //IIC Stop + NACK
  //UCB0CTL1 |= UCTXSTP ;                  //IIC Stop
  while((UCB0CTL1 & UCTXSTP) == 1);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
xtsoaa03122
1楼-- · 2019-03-24 14:31
不应该是延时时间不够吧,DCO=1MHZ,__delay_cycles(20000);应该够了啊
单步调试都能调通,检查从机状态也是正确的
就是F5直接运行就卡在
while(!(IFG2 & UCB0TXIFG)); //判断UCB0TXBUF是否为空
小弟判断有可能是从机没有返回ACK,但是为什么单步都能通过呢?
求帮忙啊
wstt
2楼-- · 2019-03-24 20:05
 精彩回答 2  元偷偷看……
wstt
3楼-- · 2019-03-24 23:35
初始化的时候,手动清除一遍。
xtsoaa03122
4楼-- · 2019-03-25 01:54
呵呵,感谢,是这样的,但是数据发送完成后,从机返回ACK后,UCB0TXIFG会重新置1
xtsoaa03122
5楼-- · 2019-03-25 07:11
 精彩回答 2  元偷偷看……
xtsoaa03122
6楼-- · 2019-03-25 08:04
The UCBxTXIFG bit is set when the START condition is generated and the first data to be
transmitted can be written into UCBxTXBUF.
是这句话吧,我是新手,请多帮忙

一周热门 更多>

相关问题

    相关文章