void FLEXIO_WS2812_TransmitBuffer() { for(uint8_t i = 0; i < FLEXIO_WS2812_BUFFER_SIZE; i++) { /* Check if next 32bit can be transfered */ while(!(FLEXIO_GetShifterStatusFlags(FLEXIO0) & (1 << 7))) { ; } /* Transfer local buffer into shift buffer */ FLEXIO0->SHIFTBUF[7] = flexio_ws2812_buffer[i]; /* Clear buffer when send */ flexio_ws2812_buffer[i] = 0U; } /* Clear index when all bits are send */ flexio_ws2812_bufferindex = 0; flexio_ws2812_bufferiindex = 0; }
static status_t FLEXIO_I2C_MasterTransferInitStateMachine(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle, flexio_i2c_master_transfer_t *xfer) { bool needRestart; uint32_t byteCount; /* Init the handle member. */ handle->transfer.slaveAddress = xfer->slaveAddress; handle->transfer.direction = xfer->direction; handle->transfer.subaddress = xfer->subaddress; handle->transfer.subaddressSize = xfer->subaddressSize; handle->transfer.data = xfer->data; handle->transfer.dataSize = xfer->dataSize; handle->transfer.flags = xfer->flags; handle->transferSize = xfer->dataSize; /* Initial state, i2c check address state. */ handle->state = kFLEXIO_I2C_CheckAddress; /* Clear all status before transfer. */ FLEXIO_I2C_MasterClearStatusFlags(base, kFLEXIO_I2C_ReceiveNakFlag); /* Calculate whether need to send re-start. */ needRestart = (handle->transfer.subaddressSize != 0) && (handle->transfer.direction == kFLEXIO_I2C_Read); /* Calculate total byte count in a frame. */ byteCount = 1; if (!needRestart) { byteCount += handle->transfer.dataSize; } if (handle->transfer.subaddressSize != 0) { byteCount += handle->transfer.subaddressSize; /* Next state, send command byte. */ handle->state = kFLEXIO_I2C_SendCommand; } /* Configure data count. */ if (FLEXIO_I2C_MasterSetTransferCount(base, byteCount) != kStatus_Success) { return kStatus_InvalidArgument; } while (!((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1U << base->shifterIndex[0])))) { } /* Send address byte first. */ if (needRestart) { FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, kFLEXIO_I2C_Write); } else { FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, handle->transfer.direction); } return kStatus_Success; }
static status_t FLEXIO_I2C_MasterTransferRunStateMachine(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle, uint32_t statusFlags) { if (statusFlags & kFLEXIO_I2C_ReceiveNakFlag) { /* Clear receive nak flag. */ FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1U << base->shifterIndex[1]); if ((!((handle->state == kFLEXIO_I2C_SendData) && (handle->transfer.dataSize == 0U))) && (!(((handle->state == kFLEXIO_I2C_ReceiveData) || (handle->state == kFLEXIO_I2C_ReceiveDataBegin)) && (handle->transfer.dataSize == 1U)))) { FLEXIO_I2C_MasterReadByte(base); FLEXIO_I2C_MasterAbortStop(base); handle->state = kFLEXIO_I2C_Idle; return kStatus_FLEXIO_I2C_Nak; } } if (handle->state == kFLEXIO_I2C_CheckAddress) { if (handle->transfer.direction == kFLEXIO_I2C_Write) { /* Next state, send data. */ handle->state = kFLEXIO_I2C_SendData; } else { /* Next state, receive data begin. */ handle->state = kFLEXIO_I2C_ReceiveDataBegin; } } if ((statusFlags & kFLEXIO_I2C_RxFullFlag) && (handle->state != kFLEXIO_I2C_ReceiveData)) { FLEXIO_I2C_MasterReadByte(base); } switch (handle->state) { case kFLEXIO_I2C_SendCommand: if (statusFlags & kFLEXIO_I2C_TxEmptyFlag) { if (handle->transfer.subaddressSize > 0) { handle->transfer.subaddressSize--; FLEXIO_I2C_MasterWriteByte( base, ((handle->transfer.subaddress) >> (8 * handle->transfer.subaddressSize))); if (handle->transfer.subaddressSize == 0) { /* Load re-start in advance. */ if (handle->transfer.direction == kFLEXIO_I2C_Read) { while (!((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1U << base->shifterIndex[0])))) { } FLEXIO_I2C_MasterRepeatedStart(base); } } } else { if (handle->transfer.direction == kFLEXIO_I2C_Write) { /* Send first byte of data. */ if (handle->transfer.dataSize > 0) { /* Next state, send data. */ handle->state = kFLEXIO_I2C_SendData; FLEXIO_I2C_MasterWriteByte(base, *handle->transfer.data); handle->transfer.data++; handle->transfer.dataSize--; } else { FLEXIO_I2C_MasterStop(base); while (!(FLEXIO_I2C_MasterGetStatusFlags(base) & kFLEXIO_I2C_RxFullFlag)) { } FLEXIO_I2C_MasterReadByte(base); handle->state = kFLEXIO_I2C_Idle; } } else { FLEXIO_I2C_MasterSetTransferCount(base, (handle->transfer.dataSize + 1)); FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, kFLEXIO_I2C_Read); /* Next state, receive data begin. */ handle->state = kFLEXIO_I2C_ReceiveDataBegin; } } }