在线情况
楼主
  • 头像
  • 级别
    • 积分2
    • 经验1361
    • 文章6
    • 注册2006-08-21
    关于430F5438中I2C读取HMC5883L的问题!
    [P]关于430F5中I2C读取HMC5883L的问题!
    430F5中I2C读取HMC5883L的问题!
    代码如下,上电后第一次运行可以读取数据,重新下载程序后就无法运行,停在
    void UCB1_IIC_Byte_WRT(unsigned char wordADR,unsigned char Data)
    函数的如下代码处。    
    while(!(UCB1IFG & UCTXIFG))
      _NOP();         //等待发送缓存内的数据发送完毕[/P][P]不知什么原因 请赐教![/P][P]void UCB1_IIC_init(void)
    {   //P3.7 P5.4
     P3SEL |= BIT7;
     P5SEL |= BIT4;
     UCB1CTL1 |= UCSWRST;                      // 置位UCSWRST
     UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C 主机, 同步 模式
     UCB1CTL1 |= UCSSEL_2;                     // SMCLK 16M
     UCB1BR0 = 160;                            // fSCL = SMCLK/160 = ~100kHz
     UCB1BR1 = 0;
     UCB1I2CSA = 0x1E;
     UCB1CTL1 &= ~UCSWRST;                     // 清除UCSWRST
    }
    void UCB1_IIC_Byte_WRT(unsigned char wordADR,unsigned char Data)
    {
        while( UCB1CTL1 &  UCTXSTP);          //等待总线空闲[/P][P]    UCB1CTL1 |= UCTXSTT + UCTR;           // 发送起始位,确定为写[/P][P]    UCB1TXBUF  = wordADR;                //发送字地址
        while(!(UCB1IFG & UCTXIFG))
      _NOP();         //等待发送缓存内的数据发送完毕[/P][P]    UCB1TXBUF  = Data;                   //发送数据
        while(!(UCB1IFG & UCTXIFG));         //等待发送缓存内的数据发送完毕[/P][P]    UCB1CTL1 |= UCTXSTP;                 //发送STOP
    }[/P][P]unsigned char UCB1_IIC_Random_READ(unsigned char wordADR)
    {
        unsigned char REC_DATA;[/P][P]    while( UCB1CTL1 &  UCTXSTP);            //等待总线空闲[/P][P]    UCB1CTL1 |= UCTXSTT+UCTR;            //发送模式[/P][P]    UCB1TXBUF  = wordADR;                  //发送字地址
        while(!((UCB1IFG & UCTXIFG)));    //等待字地址发送完毕
     
     UCB1CTL1 &= ~UCTR;                //读模式

     UCB1CTL1|= UCTXSTT;                //发送START

        while( !(UCB1IFG & UCTXIFG));  //等待从机返回数据
        REC_DATA = UCB1RXBUF;[/P][P]    UCB1CTL1 |=UCTXNACK;              // 发送停止位和NACK位
        UCB1CTL1 |=UCTXSTP;
        return REC_DATA;
    }
    //初始化HMC5883,根据需要请参考pdf进行修改****
    void Init_HMC5883()
    {
         UCB1_IIC_Byte_WRT(0x02,0x00);  //
    }[/P][P]void main(void)
    {
     WDTCTL = WDTPW + WDTHOLD;                  // Stop WDT
     setupClock( );
     
     UCB1_IIC_init(); [/P][P] Init_HMC5883();
     delay_ms(100);
     uchar i;
     
     uchar buf[13] ;  
     int x,y,z;
     
     while(1)
     {
      for(i=0;i<13;i++)
      {
       buf[I]=UCB1_IIC_Random_READ(i);
       delay_ms(100);
      }
       
      delay_ms(1000);
      x=buf[3]; x<<=8;x+=buf[4];
      z=buf[5]; z<<=8;z+=buf[6];
      y=buf[7]; y<<=8;y+=buf[8];[/P][P]  _NOP();
     }[/P][P]}[/P][/I]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    [P]你好,你的例子我大概看过。
    不过我有些疑问,居然你有现成的实验板的话应该有相关的同步例程。这样,你运行同步例程到板上试试。
    用“运行到光标的操作”观察以下这个位置
    [CODE]
      x=buf[3]; x<<=8;x+=buf[4];
      z=buf[5]; z<<=8;z+=buf[6];
      y=buf[7]; y<<=8;y+=buf[8];
    _NOP(); //  用“运行到光标的操作”观察同步例子是否跑得正常?
    [/CODE][/P][P]从观察这数组的结果来判断同步例子运行是否正常,先确定这些别人提供的这些软硬件给你的是否正常再说。否则光看你些例程没啥意义,要调试的都要实操作才行。[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    Powered by LeadBBS 9.2 .
    Page created in 0.1729 seconds with 5 queries.