关于430F5438中I2C读取HMC5883L的问题!

楼主
关于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]
1楼
[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]

电脑版 Page created in 0.1582 seconds width 3 queries.