// TODO: not yet thread safe void spiTransaction(spiClient_t *client, volatile void *rxBuf, void *txBuf, uint16_t size) { spiStruct_t *interface = &spiData[client->interface]; uint8_t head = interface->head; spiSlot_t *slot = &interface->slots[head]; slot->size = size; slot->rxBuf = (uint32_t)rxBuf; slot->txBuf = (uint32_t)txBuf; slot->client = client; interface->head = (head + 1) % SPI_SLOTS; spiTriggerSchedule(client->interface); }
static void spiEndTxn(spiStruct_t *interface) { uint8_t tail = interface->tail; spiClient_t *client = interface->slots[tail].client; uint32_t tmp; spiDisableSPI(interface); spiDisableDMA(interface); spiDeselect(client); // record longest txn tmp = timerMicros() - interface->txnStart; if (tmp > interface->txnMaxTime) interface->txnMaxTime = tmp; spiNotify(client); tail = (tail + 1) % SPI_SLOTS; interface->tail = tail; interface->txRunning = 0; spiTriggerSchedule(client->interface); }