diff --git a/right/src/i2c.c b/right/src/i2c.c index fb43db3..bbbc904 100644 --- a/right/src/i2c.c +++ b/right/src/i2c.c @@ -1,6 +1,7 @@ #include "i2c.h" i2c_master_handle_t I2cMasterHandle; +bool IsI2cTransferScheduled; i2c_master_transfer_t masterTransfer; void I2cAsyncWrite(uint8_t i2cAddress, uint8_t *data, size_t dataSize) @@ -10,6 +11,7 @@ void I2cAsyncWrite(uint8_t i2cAddress, uint8_t *data, size_t dataSize) masterTransfer.data = data; masterTransfer.dataSize = dataSize; I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer); + IsI2cTransferScheduled = true; } void I2cAsyncRead(uint8_t i2cAddress, uint8_t *data, size_t dataSize) @@ -19,4 +21,5 @@ void I2cAsyncRead(uint8_t i2cAddress, uint8_t *data, size_t dataSize) masterTransfer.data = data; masterTransfer.dataSize = dataSize; I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer); + IsI2cTransferScheduled = true; } diff --git a/right/src/i2c.h b/right/src/i2c.h index f178bf0..f0ffe9f 100644 --- a/right/src/i2c.h +++ b/right/src/i2c.h @@ -40,6 +40,7 @@ // Variables: extern i2c_master_handle_t I2cMasterHandle; + extern bool IsI2cTransferScheduled; // Functions: diff --git a/right/src/slave_scheduler.c b/right/src/slave_scheduler.c index 5b1611a..ca2cfd5 100644 --- a/right/src/slave_scheduler.c +++ b/right/src/slave_scheduler.c @@ -18,22 +18,26 @@ uhk_slave_t slaves[] = { static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData) { - if (TestStates.disableI2c) { - return; - } - uhk_slave_t *slave = slaves + currentSlaveId; + IsI2cTransferScheduled = false; - slave->isConnected = status == kStatus_Success; - if (!slave->isConnected) { - slave->initializer(slave->perDriverId); - } + do { + if (TestStates.disableI2c) { + return; + } + uhk_slave_t *slave = slaves + currentSlaveId; - slave->updater(slave->perDriverId); - currentSlaveId++; + slave->isConnected = status == kStatus_Success; + if (!slave->isConnected) { + slave->initializer(slave->perDriverId); + } - if (currentSlaveId >= (sizeof(slaves) / sizeof(uhk_slave_t))) { - currentSlaveId = 0; - } + slave->updater(slave->perDriverId); + currentSlaveId++; + + if (currentSlaveId >= (sizeof(slaves) / sizeof(uhk_slave_t))) { + currentSlaveId = 0; + } + } while (!IsI2cTransferScheduled); } static void initSlaveDrivers()