Make I2C communication rock stable by hacking I2C_SlaveTransferHandleIRQ() of the KSDK and making the firmware use incoming bytes via userData.

This commit is contained in:
László Monda
2017-10-09 04:19:26 +02:00
parent 859a770ca3
commit 3dd9744e4d
4 changed files with 15 additions and 29 deletions

View File

@@ -3,6 +3,6 @@
// Macros: // Macros:
#define DEBUG_OVER_SPI // #define DEBUG_OVER_SPI
#endif #endif

View File

@@ -14,7 +14,7 @@ static spi_transfer_t xfer = {0};
static spi_master_config_t userConfig; static spi_master_config_t userConfig;
spi_master_handle_t handle; spi_master_handle_t handle;
static volatile bool masterFinished = false; static volatile bool masterFinished = true;
#endif #endif
@@ -51,12 +51,12 @@ void DebugOverSpi_Init(void)
void DebugOverSpi_Send(uint8_t *tx, uint8_t len) void DebugOverSpi_Send(uint8_t *tx, uint8_t len)
{ {
#ifdef DEBUG_OVER_SPI #ifdef DEBUG_OVER_SPI
// if (masterFinished) { if (masterFinished) {
masterFinished = false; masterFinished = false;
memcpy(srcBuff, tx, MIN(BUFFER_SIZE, len)); memcpy(srcBuff, tx, MIN(BUFFER_SIZE, len));
xfer.txData = srcBuff; xfer.txData = srcBuff;
xfer.dataSize = len; xfer.dataSize = len;
SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer); SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer);
// } }
#endif #endif
} }

View File

@@ -14,16 +14,14 @@
i2c_slave_config_t slaveConfig; i2c_slave_config_t slaveConfig;
i2c_slave_handle_t slaveHandle; i2c_slave_handle_t slaveHandle;
uint8_t byteIn; uint8_t userData;
uint8_t rxMessagePos; uint8_t rxMessagePos;
i2c_slave_transfer_event_t prevEvent;
uint8_t dosBuffer[2]; uint8_t dosBuffer[2];
static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userData) static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userDataArg)
{ {
dosBuffer[0] = xfer->event; dosBuffer[0] = xfer->event;
dosBuffer[1] = byteIn; dosBuffer[1] = userData;
DebugOverSpi_Send(dosBuffer, 2); DebugOverSpi_Send(dosBuffer, 2);
switch (xfer->event) { switch (xfer->event) {
@@ -32,29 +30,18 @@ static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *u
xfer->data = (uint8_t*)&TxMessage; xfer->data = (uint8_t*)&TxMessage;
xfer->dataSize = TxMessage.length + I2C_MESSAGE_HEADER_LENGTH; xfer->dataSize = TxMessage.length + I2C_MESSAGE_HEADER_LENGTH;
break; break;
case kI2C_SlaveReceiveEvent: case kI2C_SlaveAddressMatchEvent:
if (prevEvent == kI2C_SlaveReceiveEvent) { rxMessagePos = 0;
((uint8_t*)&RxMessage)[rxMessagePos++] = byteIn;
} else {
rxMessagePos = 0;
memset(&RxMessage, 0, I2C_MESSAGE_MAX_TOTAL_LENGTH);
}
xfer->data = (uint8_t*)&byteIn;
xfer->dataSize = 1;
break; break;
case kI2C_SlaveCompletionEvent: case kI2C_SlaveReceiveEvent:
if (prevEvent == kI2C_SlaveReceiveEvent) { ((uint8_t*)&RxMessage)[rxMessagePos++] = userData;
((uint8_t*)&RxMessage)[rxMessagePos] = byteIn; if (RxMessage.length == rxMessagePos-I2C_MESSAGE_HEADER_LENGTH) {
RxMessage.length = rxMessagePos - I2C_MESSAGE_HEADER_LENGTH;
SlaveRxHandler(); SlaveRxHandler();
} }
break; break;
default: default:
break; break;
} }
prevEvent = xfer->event;
} }
void InitInterruptPriorities(void) void InitInterruptPriorities(void)
@@ -80,9 +67,8 @@ void InitI2c(void)
I2C_SlaveGetDefaultConfig(&slaveConfig); I2C_SlaveGetDefaultConfig(&slaveConfig);
slaveConfig.slaveAddress = I2C_ADDRESS_LEFT_KEYBOARD_HALF_FIRMWARE; slaveConfig.slaveAddress = I2C_ADDRESS_LEFT_KEYBOARD_HALF_FIRMWARE;
I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig); I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig);
I2C_SlaveTransferCreateHandle(I2C_BUS_BASEADDR, &slaveHandle, i2cSlaveCallback, NULL); I2C_SlaveTransferCreateHandle(I2C_BUS_BASEADDR, &slaveHandle, i2cSlaveCallback, &userData);
slaveHandle.eventMask |= kI2C_SlaveCompletionEvent; I2C_SlaveTransferNonBlocking(I2C_BUS_BASEADDR, &slaveHandle, kI2C_SlaveAddressMatchEvent);
I2C_SlaveTransferNonBlocking(I2C_BUS_BASEADDR, &slaveHandle, kI2C_SlaveCompletionEvent);
} }
void InitLedDriver(void) void InitLedDriver(void)