430单片机自带的IIC模块

2019-03-24 12:25发布

我想学学430单片机自带的IIC模块使用,现在编了段小程序,可是运行不正确,程序如下,问题在最后面。
  //初始化IIC模块
  UCB0CTL1 |= UCSWRST;
  UCB0CTL0 |=UCMST+UCMODE1+UCMODE0+UCSYNC; // I2C Master, synchronous mode
  UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST;       // Use SMCLK, keep software reset
  P3SEL |=0x06;     //p3.1为UCB0SDA,P3.2为UCB0SCL
  UCB0CTL1 = UCSSEL_3+UCSWRST;              // Use SMCLK, keep SW reset
  UCB0BR0 =10;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0CTL1 &= ~UCSWRST;   // Clear software reset, resume operation
  //写函数  
  UCB0CTL0 |=UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode
  //UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST;       // Use SMCLK, keep software reset
  UCB0I2CSA = 0x3a; //这个地址是真实地址后面加读/写位组成
  UCB0CTL0 &=~UCSLA10;  //从机地址为7位
  UCB0CTL1 |= UCTR;//transmitter mode 发送模式  
  UCB0CTL1 |= UCTXSTT; //start condition,
  while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.
  for(i=0;i<1;i++)
  {
    UCB0TXBUF = 0x0d;//IIC设备中寄存器的地址
    while((UCB0CTL1 & UCTXSTT) == UCTXSTT);//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零//以上顺序不能改变
    while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,
  }
  UCB0CTL1 |= UCTXSTP;//发送STOP信号

我的问题是 :
1. UCB0CTL1 |= UCTXSTT; 也就是发送START后示波器上显示的IIC从设备的地址信息不对;
2. UCB0TXBUF = 0x0d,运行后,示波器没反应更谈不上有ACK信号,可是却通过了while((UCB0CTL1 & UCTXSTT) == UCTXSTT判断是否有确认信号的这句话;
3. 程序停在了倒数第二句话while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,既然已经把数据0x0d送到发送缓冲中去,就应该有输出,而且UCB0TXBUF为空才对啊?

向大家请教了!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
wstt
2019-03-25 17:50
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章