请教一个I2C连续读取从机寄存器的程序问题,分别读是对的,连续读就错了。

2019-07-25 11:23发布

我读取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;
}

请教下为何我连续读取时是错的数据,是程序哪里有问题吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。