出现的问题:读取数据一般正确,一般出错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
代码来自安富莱电子