int I2C_read(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data) { I2C_START(); I2C_SendByte(slave_addr << 1 | I2C_Direction_Transmitter); I2C_SendByte(reg_addr); I2C_START(); I2C_SendByte(slave_addr << 1 | I2C_Direction_Receiver); while (length) { if (length==1) *data =I2C_ReceiveByte(); else *data =I2C_ReceiveByte_WithACK(); data++; length--; } I2C_STOP(); return 0x00; }
// I2C模拟读出三个字节 uint32_t I2C_Read_3Bytes(uint8_t DeviceAddr, uint8_t address) { uint8_t data_temp1, data_temp2, data_temp3; uint32_t data_32; I2C_START(); I2C_SendByte(DeviceAddr); I2C_SendByte(address); I2C_START(); I2C_SendByte(DeviceAddr + 1); data_temp1 = I2C_ReceiveByte_WithACK(); data_temp2 = I2C_ReceiveByte_WithACK(); data_temp3 = I2C_ReceiveByte(); I2C_STOP(); data_32 = (data_temp1<<16) | (data_temp2<<8) | data_temp3; return data_32; }
// I2C模拟读出两个字节 uint16_t I2C_Read_2Bytes(uint8_t DeviceAddr, uint8_t address) { uint8_t data_temp1,data_temp2; uint16_t data_16; I2C_START(); I2C_SendByte(DeviceAddr); I2C_SendByte(address); I2C_START(); I2C_SendByte(DeviceAddr + 1); data_temp1 = I2C_ReceiveByte_WithACK(); data_temp2 = I2C_ReceiveByte(); I2C_STOP(); data_16 = (data_temp1<<8) | data_temp2; return data_16; }
// I2C模拟读出多个字节 u8 i2cread(u8 dev_addr, u8 reg_addr, u8 i2c_len, u8 *i2c_data_buf) { I2C_START(); I2C_SendByte(dev_addr << 1 | I2C_Direction_Transmitter); I2C_SendByte(reg_addr); I2C_START(); I2C_SendByte(dev_addr << 1 | I2C_Direction_Receiver); while (i2c_len) { if (i2c_len == 1) *i2c_data_buf = I2C_ReceiveByte(); else *i2c_data_buf = I2C_ReceiveByte_WithACK(); i2c_data_buf++; i2c_len--; } I2C_STOP(); return 0x00; }