Keep the slave scheduler going even if a slave driver failed to trigger an I2C callback.
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
|
|
||||||
i2c_master_handle_t I2cMasterHandle;
|
i2c_master_handle_t I2cMasterHandle;
|
||||||
|
bool IsI2cTransferScheduled;
|
||||||
i2c_master_transfer_t masterTransfer;
|
i2c_master_transfer_t masterTransfer;
|
||||||
|
|
||||||
void I2cAsyncWrite(uint8_t i2cAddress, uint8_t *data, size_t dataSize)
|
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.data = data;
|
||||||
masterTransfer.dataSize = dataSize;
|
masterTransfer.dataSize = dataSize;
|
||||||
I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer);
|
I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer);
|
||||||
|
IsI2cTransferScheduled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I2cAsyncRead(uint8_t i2cAddress, uint8_t *data, size_t dataSize)
|
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.data = data;
|
||||||
masterTransfer.dataSize = dataSize;
|
masterTransfer.dataSize = dataSize;
|
||||||
I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer);
|
I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer);
|
||||||
|
IsI2cTransferScheduled = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern i2c_master_handle_t I2cMasterHandle;
|
extern i2c_master_handle_t I2cMasterHandle;
|
||||||
|
extern bool IsI2cTransferScheduled;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
@@ -18,22 +18,26 @@ uhk_slave_t slaves[] = {
|
|||||||
|
|
||||||
static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData)
|
static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData)
|
||||||
{
|
{
|
||||||
if (TestStates.disableI2c) {
|
IsI2cTransferScheduled = false;
|
||||||
return;
|
|
||||||
}
|
|
||||||
uhk_slave_t *slave = slaves + currentSlaveId;
|
|
||||||
|
|
||||||
slave->isConnected = status == kStatus_Success;
|
do {
|
||||||
if (!slave->isConnected) {
|
if (TestStates.disableI2c) {
|
||||||
slave->initializer(slave->perDriverId);
|
return;
|
||||||
}
|
}
|
||||||
|
uhk_slave_t *slave = slaves + currentSlaveId;
|
||||||
|
|
||||||
slave->updater(slave->perDriverId);
|
slave->isConnected = status == kStatus_Success;
|
||||||
currentSlaveId++;
|
if (!slave->isConnected) {
|
||||||
|
slave->initializer(slave->perDriverId);
|
||||||
|
}
|
||||||
|
|
||||||
if (currentSlaveId >= (sizeof(slaves) / sizeof(uhk_slave_t))) {
|
slave->updater(slave->perDriverId);
|
||||||
currentSlaveId = 0;
|
currentSlaveId++;
|
||||||
}
|
|
||||||
|
if (currentSlaveId >= (sizeof(slaves) / sizeof(uhk_slave_t))) {
|
||||||
|
currentSlaveId = 0;
|
||||||
|
}
|
||||||
|
} while (!IsI2cTransferScheduled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initSlaveDrivers()
|
static void initSlaveDrivers()
|
||||||
|
|||||||
Reference in New Issue
Block a user