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:
@@ -3,6 +3,6 @@
|
|||||||
|
|
||||||
// Macros:
|
// Macros:
|
||||||
|
|
||||||
#define DEBUG_OVER_SPI
|
// #define DEBUG_OVER_SPI
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Submodule lib/KSDK_2.0_MKL03Z8xxx4 updated: ac55fc28ee...49e20a5798
Reference in New Issue
Block a user