请教一个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;
}

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
龙之谷
1楼-- · 2019-07-25 15:08
for循环放读命令外面
945595199
2楼-- · 2019-07-25 21:05
回复【2楼】龙之谷:
---------------------------------
你好,我程序是放在了外面,不太明白你什么意思,可以解释下吗?
龙之谷
3楼-- · 2019-07-26 01:46
 精彩回答 2  元偷偷看……
jeffvivi
4楼-- · 2019-07-26 03:48
楼主,我也遇到类似的问题,你解决了吗?
e99996
5楼-- · 2019-07-26 06:10
楼主还有回帖吗,问题解决了吗,我碰到和你一样的情况了,连续读就只有第一个字节是正确的,后面的几个都是0xff,请指教下!!!
一等废物
6楼-- · 2019-07-26 06:35
e99996 发表于 2016-4-21 21:48
楼主还有回帖吗,问题解决了吗,我碰到和你一样的情况了,连续读就只有第一个字节是正确的,后面的几个都是 ...

解决了吗?我分别读可以;连续读第一个有数据, 之后的寄存器读数全是0

一周热门 更多>