int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { I2C_Type *base = i2c_addrs[obj->instance]; i2c_master_transfer_t master_xfer; i2c_address = address >> 1; memset(&master_xfer, 0, sizeof(master_xfer)); master_xfer.slaveAddress = address >> 1; master_xfer.direction = kI2C_Read; master_xfer.data = (uint8_t *)data; master_xfer.dataSize = length; if (obj->next_repeated_start) { master_xfer.flags |= kI2C_TransferRepeatedStartFlag; } if (!stop) { master_xfer.flags |= kI2C_TransferNoStopFlag; } obj->next_repeated_start = master_xfer.flags & kI2C_TransferNoStopFlag ? 1 : 0; /* The below function will issue a STOP signal at the end of the transfer. * This is required by the hardware in order to receive the last byte */ if (I2C_MasterTransferBlocking(base, &master_xfer) != kStatus_Success) { return I2C_ERROR_NO_SLAVE; } return length; }
static status_t I2C_READ(uint8_t *pBuff, uint16_t buffLen) { masterXfer.direction = kI2C_Read; masterXfer.data = pBuff; masterXfer.dataSize = buffLen; return I2C_MasterTransferBlocking(NXPNCI_I2C_INSTANCE, &masterXfer); }
void LedDriver_WriteBuffer(uint8_t i2cAddress, uint8_t buffer[], uint8_t size) { i2c_master_transfer_t masterXfer; masterXfer.slaveAddress = i2cAddress; masterXfer.direction = kI2C_Write; masterXfer.subaddress = 0; masterXfer.subaddressSize = 0; masterXfer.data = buffer; masterXfer.dataSize = size; masterXfer.flags = kI2C_TransferDefaultFlag; I2C_MasterTransferBlocking(I2C_MAIN_BUS_BASEADDR, &masterXfer); }
int i2c_byte_read(i2c_t *obj, int last) { uint8_t data; I2C_Type *base = i2c_addrs[obj->instance]; i2c_master_transfer_t master_xfer; memset(&master_xfer, 0, sizeof(master_xfer)); master_xfer.slaveAddress = i2c_address; master_xfer.direction = kI2C_Read; master_xfer.data = &data; master_xfer.dataSize = 1; /* The below function will issue a STOP signal at the end of the transfer. * This is required by the hardware in order to receive the last byte */ if (I2C_MasterTransferBlocking(base, &master_xfer) != kStatus_Success) { return I2C_ERROR_NO_SLAVE; } return data; }
void send_cmd(uint8_t *cmd, size_t size) { i2c_master_transfer_t transfer; memset(&transfer, 0, sizeof(transfer)); transfer.slaveAddress = max; transfer.direction = kI2C_Write; transfer.subaddress = 0; transfer.subaddressSize = 0; transfer.data = cmd; transfer.dataSize = size; transfer.flags = kI2C_TransferDefaultFlag; status_t status = I2C_MasterTransferBlocking(i2c_config_default.i2c, &transfer); #ifndef NDEBUG if (status != kStatus_Success) { PRINTF("I2C write(%02d) <= %02x\r\n", 0, &cmd); i2c_error("write reg", status); } #endif }
status_t BOARD_I2C_Receive(I2C_Type *base, uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize) { i2c_master_transfer_t masterXfer; /* Prepare transfer structure. */ masterXfer.slaveAddress = deviceAddress; masterXfer.subaddress = subAddress; masterXfer.subaddressSize = subaddressSize; masterXfer.data = rxBuff; masterXfer.dataSize = rxBuffSize; masterXfer.direction = kI2C_Read; masterXfer.flags = kI2C_TransferDefaultFlag; return I2C_MasterTransferBlocking(base, &masterXfer); }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { I2C_Type *base = i2c_addrs[obj->instance]; i2c_master_transfer_t master_xfer; memset(&master_xfer, 0, sizeof(master_xfer)); master_xfer.slaveAddress = address >> 1; master_xfer.direction = kI2C_Write; master_xfer.data = (uint8_t *)data; master_xfer.dataSize = length; if (obj->next_repeated_start) { master_xfer.flags |= kI2C_TransferRepeatedStartFlag; } if (!stop) { master_xfer.flags |= kI2C_TransferNoStopFlag; } obj->next_repeated_start = master_xfer.flags & kI2C_TransferNoStopFlag ? 1 : 0; if (I2C_MasterTransferBlocking(base, &master_xfer) != kStatus_Success) { return I2C_ERROR_NO_SLAVE; } return length; }