I2C读数据时对时错

出现的问题:读取数据一般正确,一般出错255。

   分析可知:数据读完没有直接发送NACK,而是读完ACK后再发的NACK,可能这个NACK没接收到了。

 

uint8_t HMC5883L_ReadByte(uint8_t _ucRegAddr)
{
    uint8_t ucData;

    i2c_Start();                              /* 总线开始信号 */
    i2c_SendByte(HMC5883L_SLAVE_ADDRESS);    /* 发送设备地址+写信号 */
    i2c_WaitAck();
    i2c_SendByte(_ucRegAddr);                 /* 发送存储单元地址 */
    i2c_WaitAck();

    i2c_Start();                              /* 总线开始信号 */

    i2c_SendByte(HMC5883L_SLAVE_ADDRESS+1);     /* 发送设备地址+读信号 */
    i2c_WaitAck();

    ucData = i2c_ReadByte();                   /* 读出寄存器数据 */
    i2c_NAck();
    i2c_Stop();                              /* 总线停止信号 */
    return ucData;
}


/*
*********************************************************************************************************
*    函 数 名: HMC5883L_ReadData
*    功能说明: 读取 MPU-6050 数据寄存器, 结果保存在全局变量 g_tMag.  主程序可以定时调用该程序刷新数据
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
void HMC5883L_ReadData(void)
{
    uint8_t ucReadBuf[7];
    uint8_t i;

#if 1 /* 连续读 */
    i2c_Start();                              /* 总线开始信号 */
    i2c_SendByte(HMC5883L_SLAVE_ADDRESS);    /* 发送设备地址+写信号 */
    i2c_WaitAck();
    i2c_SendByte(DATA_OUT_X);             /* 发送存储单元地址  */
    i2c_WaitAck();

    i2c_Start();                              /* 总线开始信号 */

    i2c_SendByte(HMC5883L_SLAVE_ADDRESS + 1); /* 发送设备地址+读信号 */
    i2c_WaitAck();

    for (i = 0; i < 6; i++)
    {
        ucReadBuf[i] = i2c_ReadByte();                   /* 读出寄存器数据 */
        i2c_Ack();
    }

    /* 读最后一个字节,时给 NAck */
    ucReadBuf[6] = i2c_ReadByte();
    i2c_NAck();

    i2c_Stop();                              /* 总线停止信号 */

#else    /* 单字节读 */
    for (i = 0 ; i < 7; i++)
    {
        ucReadBuf[i] = HMC5883L_ReadByte(DATA_OUT_X + i);
    }
#endif

 

代码来自安富莱电子

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值