[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] |