Keep the slave scheduler going even if a slave driver failed to trigger an I2C callback.

This commit is contained in:
László Monda
2017-06-01 03:03:20 +02:00
parent 420097dddc
commit 0f51700ea9
3 changed files with 21 additions and 13 deletions

View File

@@ -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;
} }

View File

@@ -40,6 +40,7 @@
// Variables: // Variables:
extern i2c_master_handle_t I2cMasterHandle; extern i2c_master_handle_t I2cMasterHandle;
extern bool IsI2cTransferScheduled;
// Functions: // Functions:

View File

@@ -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()