void Multiple_Read_HMC5883L(void) { u8 i; I2C_Start(); //起始信号 I2C_SendByte(0x3C); //发送设备地址+写信号 I2C_SendByte(0x03); //发送存储单元地址,从0x3开始 I2C_Start(); //起始信号 I2C_SendByte(0x3D); //发送设备地址+读信号 for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = I2C_RecvByte(); //BUF[0]存储数据 if (i == 5) { I2C_SendACK(1); //最后一个数据需要回NOACK } else { I2C_SendACK(0); //回应ACK } } I2C_Stop(); //停止信号 M_X = BUFFER[0]<<8|BUFFER[1]; M_Y = BUFFER[2]<<8|BUFFER[3]; M_Z = BUFFER[4]<<8|BUFFER[5]; }
//******************************************************************************************************* //从I2C设备读取一个字节数据 //******************************************************************************************************* uchar Single_ReadI2C(uchar REG_Address) { uchar REG_data; I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //发送存储单元地址,从0开始 I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=I2C_RecvByte(); //读出寄存器数据 I2C_SendACK(1); //接收应答信号 I2C_Stop(); //停止信号 return REG_data; }
//************************************** //I2C read a byte //************************************** u8 Single_ReadI2C(u8 REG_Address) { u8 REG_data; I2C_Start(); I2C_SendByte(SlaveAddress); I2C_SendByte(REG_Address); I2C_Start(); I2C_SendByte(SlaveAddress+1); REG_data=I2C_RecvByte(); I2C_SendACK(1); I2C_Stop(); return REG_data; }
//************************************** //从I2C设备读取一个字节数据 //************************************** uint8_t Single_ReadI2C(uint8_t REG_Address) { uint8_t REG_data; I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //发送存储单元地址,从0开始 I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress + 1); //发送设备地址+读信号 REG_data = I2C_RecvByte(); //读出寄存器数据 SDA = 1; //写应答信号 SCL = 1; //拉高时钟线 Delay2us(); //延时 SCL = 0; //拉低时钟线 Delay2us(); //延时 I2C_Stop(); //停止信号 return REG_data; }