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]; }
uint8_t I2C_ReadByte(uint8_t ack) { uint8_t i,receive=0; I2C_WriteBitSDA(1); for(i=0; i<8; i++) { I2C_WriteBitSCL(0); I2C_delay_us(2); I2C_WriteBitSCL(1); receive<<=1; if(I2C_ReadBitSDA()) receive++; I2C_delay_us(1); } if(ack) I2C_SendACK(); else I2C_SendNACK(); return receive; }
static uint8_t I2C_ReceiveByte_WithACK(void) { uint8_t i, i2c_data = 0; gpio_set(I2C_port, I2C_SDA); gpio_clear(I2C_port, I2C_SCL); for(i=0; i<8; i++) { gpio_set(I2C_port, I2C_SCL); delay_us(10); i2c_data<<=1; if(gpio_get(I2C_port, I2C_SDA)) i2c_data|=0x01; gpio_clear(I2C_port, I2C_SCL); delay_us(10); } I2C_SendACK(); return i2c_data; }
int I2C_ReadRepeated(I2C_ConfigStruct* conf, uint8_t addr, uint8_t* data, uint32_t len) { int i; I2C_Start(conf); //Write addr | read command if(I2C_WriteByte(conf, (addr | 1)) != 0) { printf("Received NACK at address phase!!\r\n"); return -1; } //Read data for(i=0; i<len; i++) { data[i] = I2C_ReadByte(conf); if( i == (len - 1) ) I2C_SendNACK(conf); else I2C_SendACK(conf); } return 0;//success }
//========================================== //连续读取6个数据 //========================================== void HMC5883_Read_6Data(void) { u8 i = 0; I2C_Start(); //起始信号 I2C_Write(SlaveAddress); //发送设备地址+写信号(+0) I2C_Write(0x03); //发送存储单元地址 I2C_Start(); //起始信号 I2C_Write(SlaveAddress+1); //发送设备地址+读信号(+1) for(i = 0;i < 6;i++) { HMC5883_BUF[i] = I2C_Read(); if(i == 5) I2C_SendACK(1); else I2C_SendACK(0); } I2C_Stop(); }
//******************************************************************************************************* //从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模拟接收一个字节并发送ACK u8 I2C_ReceiveByte_WithACK(void) { u8 i,i2c_data; I2C_SDA_H; I2C_SCL_L; i2c_data=0; for(i=0;i<8;i++) { I2C_SCL_H; I2C_NOP; i2c_data<<=1; if(I2C_SDA_STATE) i2c_data|=0x01; I2C_SCL_L; I2C_NOP; } I2C_SendACK(); return i2c_data; }