我读取HMC5883L的结果寄存器地址,
下面这个程序是我连续读取寄存器的程序,结果是只有X轴有数据,数据也不对是0xff00,0xfe00和0x00ff,Y,Z轴为0:
调用:XYZ_HMC5883L(buffer);
void XYZ_HMC5883L(u8 *arr)
{
u8 i;
I2C_Start();
I2C_Send_Byte(HMC58X3_ADDR);
I2C_Wait_ACK();
I2C_Send_Byte(0x03); // 0x03~0x08是XYZ结果寄存器连续的地址
I2C_Wait_ACK();
I2C_Start();
I2C_Send_Byte(HMC58X3_ADDR+1);
I2C_Wait_ACK();
for (i=0;i<6;i++) //连续读取6个地址数据
{
if(i==5)
{
arr = I2C_Read_Byte(0); //最后一个数据NOACK
}
else
{
arr = I2C_Read_Byte(1); //有ACK
}
}
I2C_Stop();
}
下面这个程序我读出的磁场结果是对的,这次是分开读的,一共读了6次,
X=(((u16)Read_HMC5883L(HMC58X3_R_XM)) << 8) | Read_HMC5883L(HMC58X3_R_XL);
Y=(((u16)Read_HMC5883L(HMC58X3_R_YM)) << 8) | Read_HMC5883L(HMC58X3_R_YL);
Z=(((u16)Read_HMC5883L(HMC58X3_R_ZM)) << 8) | Read_HMC5883L(HMC58X3_R_ZL);
u8 Read_HMC5883L(u8 address)
{
u8 data;
I2C_Start();
I2C_Send_Byte(HMC58X3_ADDR);
I2C_Wait_ACK();
I2C_Send_Byte(address);
I2C_Wait_ACK();
I2C_Start();
I2C_Send_Byte(HMC58X3_ADDR+1);
I2C_Wait_ACK();
data=I2C_Read_Byte(0); //无应答。
I2C_Stop();
return data;
}
请教下为何我连续读取时是错的数据,是程序哪里有问题吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
注意每次读取以后的延时。
注意释放SDA线,或者你可以SR寄存器,看有没有BUS ERROR
一周热门 更多>