/*FUNCTION****************************************************************
 *
 * Function Name: FLEXIO_UART_Tx_HAL_Configure
 * Description: Configure the flexio working as uart tx device.
 *
 *END*********************************************************************/
flexio_status_t FLEXIO_UART_Tx_HAL_Configure(
    flexio_uart_tx_dev_t *devPtr, const flexio_uart_config_t *configPtr)
{
    flexio_timer_config_t   mFlexioTimerConfigStruct;
    flexio_shifter_config_t mFlexioShifterConfigStruct;
    memset(&mFlexioShifterConfigStruct, 0, sizeof(mFlexioShifterConfigStruct));
    memset(&mFlexioTimerConfigStruct, 0, sizeof(mFlexioTimerConfigStruct));

    uint32_t divider, timCmp;
    
    if ( (!devPtr) || (!configPtr) )
    {
        return kStatus_FLEXIO_InvalidArgument;
    }

    /* 1. Configure the shifter 0 for tx buffer. */
    mFlexioShifterConfigStruct.timsel = devPtr->timerIdx;
    mFlexioShifterConfigStruct.timpol = kFlexioShifterTimerPolarityOnPositive;
    mFlexioShifterConfigStruct.pincfg = kFlexioPinConfigOutput;
    mFlexioShifterConfigStruct.pinsel = devPtr->txPinIdx;
    mFlexioShifterConfigStruct.pinpol = kFlexioPinActiveHigh;
    mFlexioShifterConfigStruct.smode  = kFlexioShifterModeTransmit;
    mFlexioShifterConfigStruct.insrc  = kFlexioShifterInputFromPin;
    mFlexioShifterConfigStruct.sstop  = kFlexioShifterStopBitHigh;
    mFlexioShifterConfigStruct.sstart = kFlexioShifterStartBitLow;
    FLEXIO_HAL_ConfigureShifter(
        devPtr->flexioBase, devPtr->shifterIdx, &mFlexioShifterConfigStruct);

    /* 2. Configure the timer 0 for bandrate. */
    mFlexioTimerConfigStruct.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_SHIFTnSTAT(devPtr->shifterIdx);
    mFlexioTimerConfigStruct.trgpol = kFlexioTimerTriggerPolarityActiveLow;
    mFlexioTimerConfigStruct.trgsrc = kFlexioTimerTriggerSourceInternal;
    mFlexioTimerConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
    mFlexioTimerConfigStruct.pinsel = devPtr->txPinIdx;
    mFlexioTimerConfigStruct.pinpol = kFlexioPinActiveHigh;
    mFlexioTimerConfigStruct.timod  = kFlexioTimerModeDual8BitBaudBit; 
    mFlexioTimerConfigStruct.timout = kFlexioTimerOutputOneNotAffectedByReset;
    mFlexioTimerConfigStruct.timdec = kFlexioTimerDecSrcOnFlexIOClockShiftTimerOutput;
    mFlexioTimerConfigStruct.timrst = kFlexioTimerResetNever;
    mFlexioTimerConfigStruct.timdis = kFlexioTimerDisableOnTimerCompare;
    mFlexioTimerConfigStruct.timena = kFlexioTimerEnableOnTriggerHigh;
    mFlexioTimerConfigStruct.tstop  = kFlexioTimerStopBitEnableOnTimerCompareDisable;
    mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitEnabled;
    divider = configPtr->flexioBusClk / configPtr->baudrate;
    timCmp = ( ((configPtr->bitCount) << 1U) - 1U )  << 8U;
    timCmp |= ( (divider >> 1U) - 1U );
    mFlexioTimerConfigStruct.timcmp = timCmp;
    FLEXIO_HAL_ConfigureTimer(
        devPtr->flexioBase, devPtr->timerIdx, &mFlexioTimerConfigStruct);

    return kStatus_FLEXIO_Success;
}
/*FUNCTION****************************************************************
 *
 * Function Name: FLEXIO_Camera_HAL_Configure
 * Description: Configure the flexio working as flexio_camera device.
 *
 * There are only data pin, pclk pin and href pin are simulated with flexio. 
 * So the camera interface can be considered as an advanced SPI interface with
 * 8-bit data parallel bus. the pclk and href signal are just working as SCLK 
 * and CS signal of SPI bus.
 *
 *END*********************************************************************/
flexio_status_t FLEXIO_Camera_HAL_Configure(flexio_camera_dev_t *devPtr)
{
    uint32_t i;

    
    flexio_shifter_config_t flexioShifterConfig;
    flexio_timer_config_t flexioTimerConfig;

    if (!devPtr)
    {
        return kStatus_FLEXIO_InvalidArgument;
    }
    
    /* FLEXIO_CAMERA_SHIFTER_TEMPLETE_CONFIG */
    flexioShifterConfig.timsel = 0; /* control the available data, would be changed according to application. */
    flexioShifterConfig.timpol = kFlexioShifterTimerPolarityOnPositive;
    flexioShifterConfig.pincfg = kFlexioPinConfigOutputDisabled;
    flexioShifterConfig.pinsel = 0; /* data pin, would be changed according to application. */
    flexioShifterConfig.pinpol = kFlexioPinActiveHigh;
    flexioShifterConfig.smode  = kFlexioShifterModeReceive;
    flexioShifterConfig.pwidth = FLEXIO_CAMERA_PARALLEL_DATA_WIDTH-1U;
    flexioShifterConfig.insrc  = kFlexioShifterInputFromNextShifterOutput;
    flexioShifterConfig.sstop  = kFlexioShifterStopBitDisable;
    flexioShifterConfig.sstart = kFlexioShifterStartBitDisabledLoadDataOnEnable;
    
    /* FLEXIO_CAMERA_TIMER_TEMPLETE_CONFIG */
    flexioTimerConfig.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_PININPUT(0); /* HREF pin, would be changed. */
    flexioTimerConfig.trgpol = kFlexioTimerTriggerPolarityActiveHigh;
    flexioTimerConfig.trgsrc = kFlexioTimerTriggerSourceInternal;
    flexioTimerConfig.pincfg = kFlexioPinConfigOutputDisabled;
    flexioTimerConfig.pinsel = 0U; /* PCLK pin, would be changed. */
    flexioTimerConfig.pinpol = kFlexioPinActiveHigh;
    flexioTimerConfig.timod  = kFlexioTimerModeSingle16Bit;
    flexioTimerConfig.timout = kFlexioTimerOutputZeroNotAffectedByReset;
    flexioTimerConfig.timdec = kFlexioTimerDecSrcOnPinInputShiftPinInput;
    flexioTimerConfig.timrst = kFlexioTimerResetOnTimerTriggerRisingEdge;
    flexioTimerConfig.timdis = kFlexioTimerDisableOnTriggerFallingEdge;
    flexioTimerConfig.timena = kFlexioTimerEnableOnTriggerRisingEdge;
    flexioTimerConfig.tstop  = kFlexioTimerStopBitDisabled;
    flexioTimerConfig.tstart = kFlexioTimerStartBitDisabled;
    flexioTimerConfig.timcmp = 0;  /* time of shift buffer, would be changed. */
    
    /* Configure the shifters as FIFO buffer. */
    flexioShifterConfig.timsel = devPtr->timerIdx; /* driven timer. */
    flexioShifterConfig.pinsel = devPtr->datPinStartIdx; /* data pin. */
    for ( i = devPtr->shifterStartIdx;
          i < (devPtr->shifterStartIdx + devPtr->shifterCount - 1U);
          i++)
    {
        FLEXIO_HAL_ConfigureShifter(devPtr->flexioBase, i, &flexioShifterConfig);
    }
    flexioShifterConfig.insrc = kFlexioShifterInputFromPin;
    FLEXIO_HAL_ConfigureShifter(devPtr->flexioBase, i, &flexioShifterConfig);

    /* Configure the timer to select the available data. 
    * The PCLK's clk is source of timer to drive the shifter.
    * The HREF is the selecting signal for available data.
    */
    flexioTimerConfig.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_PININPUT(devPtr->hrefPinIdx); /* HREF pin. */
    flexioTimerConfig.pinsel = devPtr->pclkPinIdx; /* PCLK pin. */
    flexioTimerConfig.timcmp = 8U * devPtr->shifterCount - 1U;
    FLEXIO_HAL_ConfigureTimer(devPtr->flexioBase, devPtr->timerIdx, &flexioTimerConfig);

    /* Clear flags. */
    FLEXIO_HAL_ClearShifterErrorFlags(devPtr->flexioBase, ((1U<<(devPtr->shifterCount))-1U)<<(devPtr->shifterStartIdx) );
    FLEXIO_HAL_ClearTimerStatusFlags(devPtr->flexioBase, 1U<<(devPtr->timerIdx) );
    
    return kStatus_FLEXIO_Success;
}
/*FUNCTION****************************************************************
 *
 * Function Name: FLEXIO_I2C_HAL_ConfigMaster
 * Description: Configure the flexio working as i2c master device.
 *
 *END*********************************************************************/
flexio_status_t FLEXIO_I2C_HAL_ConfigMaster(flexio_i2c_dev_t *devPtr, 
    const flexio_i2c_master_config_t *configPtr)
{
    flexio_shifter_config_t mFlexioShfiterConfigStruct;
    flexio_timer_config_t mFlexioTimerConfigStruct;
    memset(&mFlexioShfiterConfigStruct, 0, sizeof(mFlexioShfiterConfigStruct));
    memset(&mFlexioTimerConfigStruct, 0, sizeof(mFlexioTimerConfigStruct));

    uint32_t timdiv = 0U, timcmp = 0U;

    if ( (!devPtr) || (!configPtr) )
    {
        return kStatus_FLEXIO_InvalidArgument;
    }

    /* 1. Configure the shifter 0 for tx. */
    mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[1];
    mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnPositive;
    mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOpenDrainOrBidirection;
    mFlexioShfiterConfigStruct.pinsel = devPtr->sdaPinIdx; /* Pin 0. */
    mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveLow;
    mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeTransmit; /* Tx. */
    mFlexioShfiterConfigStruct.insrc  = kFlexioShifterInputFromPin;
    mFlexioShfiterConfigStruct.sstop  = kFlexioShifterStopBitHigh; /* Check ACK Tx. */
    mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitLow; /* Start after low ACK. */
    FLEXIO_HAL_ConfigureShifter(
            devPtr->flexioBase, devPtr->shifterIdx[0], &mFlexioShfiterConfigStruct);

    /* 2. Configure the shifter 1 for rx. */
    mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[1];
    mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnNegitive;
    mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
    mFlexioShfiterConfigStruct.pinsel = devPtr->sdaPinIdx; /* Pin 0. */
    mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh; /*inverted or not*/
    mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeReceive; /* Rx. */
    mFlexioShfiterConfigStruct.insrc  = kFlexioShifterInputFromPin;
    mFlexioShfiterConfigStruct.sstop  = kFlexioShifterStopBitLow; /* Check ACK Rx. */
    mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnEnable; /* Do not check start Rx. */
    FLEXIO_HAL_ConfigureShifter(
            devPtr->flexioBase, devPtr->shifterIdx[1], &mFlexioShfiterConfigStruct);

    /* 3. Configure the timer 0 for generating bit clock. */
    mFlexioTimerConfigStruct.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_SHIFTnSTAT(devPtr->shifterIdx[0]); /* trigger from tx shifter. */
    mFlexioTimerConfigStruct.trgpol = kFlexioTimerTriggerPolarityActiveLow;
    mFlexioTimerConfigStruct.trgsrc = kFlexioTimerTriggerSourceInternal;
    mFlexioTimerConfigStruct.pincfg = kFlexioPinConfigOpenDrainOrBidirection;
    mFlexioTimerConfigStruct.pinsel = devPtr->sckPinIdx; /* Pin 1. */
    mFlexioTimerConfigStruct.pinpol = kFlexioPinActiveHigh;
    mFlexioTimerConfigStruct.timod  = kFlexioTimerModeDual8BitBaudBit; /* To generate baudrate. */
    
    mFlexioTimerConfigStruct.timout = kFlexioTimerOutputZeroNotAffectedByReset;
    mFlexioTimerConfigStruct.timdec = kFlexioTimerDecSrcOnFlexIOClockShiftTimerOutput;
    mFlexioTimerConfigStruct.timrst = kFlexioTimerResetOnTimerPinEqualToTimerOutput;
    mFlexioTimerConfigStruct.timdis = kFlexioTimerDisableOnTimerCompare;
    mFlexioTimerConfigStruct.timena = kFlexioTimerEnableOnTriggerHigh;
    mFlexioTimerConfigStruct.tstop  = kFlexioTimerStopBitEnableOnTimerDisable;
    mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitEnabled;

    /*
     * Set TIMCMP[15:8] = (number of words x 18) + 1. 
     * Set TIMCMP[7:0] = (baud rate divider / 2) - 1.
     */
    timdiv = configPtr->flexioBusClk / configPtr->baudrate;
    timcmp = configPtr->xferWordCount * 18U + 1U;
    timcmp <<= 8U;
    timcmp |= timdiv / 2U - 1U;
    mFlexioTimerConfigStruct.timcmp = timcmp;
    FLEXIO_HAL_ConfigureTimer(
            devPtr->flexioBase, devPtr->timerIdx[0], &mFlexioTimerConfigStruct);

    /* 4. Configure the timer 1 for controlling shifters. */
    mFlexioTimerConfigStruct.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_SHIFTnSTAT(devPtr->shifterIdx[0]); /* trigger from tx shifter. */
    mFlexioTimerConfigStruct.trgpol = kFlexioTimerTriggerPolarityActiveLow;
    mFlexioTimerConfigStruct.trgsrc = kFlexioTimerTriggerSourceInternal; /* trigger no sense here. */
    mFlexioTimerConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
    mFlexioTimerConfigStruct.pinsel = devPtr->sckPinIdx; /* Pin 1. */
    mFlexioTimerConfigStruct.pinpol = kFlexioPinActiveLow;
    mFlexioTimerConfigStruct.timod  = kFlexioTimerModeSingle16Bit;
    
    mFlexioTimerConfigStruct.timout = kFlexioTimerOutputOneNotAffectedByReset; /* no sense here. */
    mFlexioTimerConfigStruct.timdec = kFlexioTimerDecSrcOnPinInputShiftPinInput;
    mFlexioTimerConfigStruct.timrst = kFlexioTimerResetNever;
    mFlexioTimerConfigStruct.timdis = kFlexioTimerDisableOnPreTimerDisable;
    mFlexioTimerConfigStruct.timena = kFlexioTimerEnableOnPrevTimerEnable;
    mFlexioTimerConfigStruct.tstop  = kFlexioTimerStopBitEnableOnTimerCompare;
    mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitEnabled;

    /* Set TIMCMP[15:0] = (number of bits x 2) - 1 */
    mFlexioTimerConfigStruct.timcmp = 8U * 2U - 1U;// change to 8 bit
    FLEXIO_HAL_ConfigureTimer(
            devPtr->flexioBase, devPtr->timerIdx[1], &mFlexioTimerConfigStruct);

    return kStatus_FLEXIO_Success;
}
Example #4
0
/*!
 * @brief Main function
 */
int main (void)
{
    /* enable clock for PORTs */
    CLOCK_SYS_EnablePortClock(PORTA_IDX);
    //CLOCK_SYS_EnablePortClock(PORTB_IDX);
    CLOCK_SYS_EnablePortClock(PORTC_IDX);
    CLOCK_SYS_EnablePortClock(PORTD_IDX);
    CLOCK_SYS_EnablePortClock(PORTE_IDX);

    /* Set allowed power mode, allow all. */
    SMC_HAL_SetProtection(SMC, kAllowPowerModeAll);

    /* Set system clock configuration. */
    CLOCK_SYS_SetConfiguration(&g_defaultClockConfigVlpr);

    /* Initialize LPTMR */
    lptmr_state_t lptmrState;
    LPTMR_DRV_Init(LPTMR0_IDX, &lptmrState, &g_lptmrConfig);
    LPTMR_DRV_SetTimerPeriodUs(LPTMR0_IDX, 100000);
    LPTMR_DRV_InstallCallback(LPTMR0_IDX, lptmr_call_back);

    /* Initialize DMA */
    dma_state_t dma_state;
    DMA_DRV_Init(&dma_state);

    /* Initialize PIT */
    PIT_DRV_Init(0, false);
    PIT_DRV_InitChannel(0, 0, &g_pitChan0);

    /* Initialize CMP */
    CMP_DRV_Init(0, &g_cmpState, &g_cmpConf);
    CMP_DRV_ConfigDacChn(0, &g_cmpDacConf);
    PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 0, kPortMuxAlt5);
    CMP_DRV_Start(0);

    /* Buttons */
    GPIO_DRV_InputPinInit(&g_switch1);
    GPIO_DRV_InputPinInit(&g_switch2);
    GPIO_DRV_InputPinInit(&g_switchUp);
    GPIO_DRV_InputPinInit(&g_switchDown);
    GPIO_DRV_InputPinInit(&g_switchLeft);
    GPIO_DRV_InputPinInit(&g_switchRight);
    GPIO_DRV_InputPinInit(&g_switchSelect);

    /* Start LPTMR */
    LPTMR_DRV_Start(LPTMR0_IDX);

    /* Setup LPUART1 */
    LPUART_DRV_Init(1, &g_lpuartState, &g_lpuartConfig);
    LPUART_DRV_InstallRxCallback(1, lpuartRxCallback, rxBuff, NULL, true);
    LPUART_DRV_InstallTxCallback(1, lpuartTxCallback, NULL, NULL);
    LPUART_BWR_CTRL_TXINV(g_lpuartBase[1], 1);
    PORT_HAL_SetMuxMode(g_portBase[GPIOE_IDX], 0, kPortMuxAlt3);
    PORT_HAL_SetMuxMode(g_portBase[GPIOE_IDX], 1, kPortMuxAlt3);

    /* Setup FlexIO for the WS2812B */
    FLEXIO_Type *fiobase = g_flexioBase[0];
    CLOCK_SYS_SetFlexioSrc(0, kClockFlexioSrcMcgIrClk);
    FLEXIO_DRV_Init(0, &g_flexioConfig);
    FLEXIO_HAL_ConfigureTimer(fiobase, 0, &g_timerConfig);
    FLEXIO_HAL_ConfigureShifter(fiobase, 0, &g_shifterConfig);
    PORT_HAL_SetMuxMode(g_portBase[GPIOE_IDX], 20, kPortMuxAlt6);
    FLEXIO_DRV_Start(0);

    FLEXIO_HAL_SetShifterStatusDmaCmd(fiobase, 1, true);
    DMA_DRV_RequestChannel(kDmaAnyChannel, kDmaRequestMux0FlexIOChannel0,
            &g_fioChan);
    DMA_DRV_RegisterCallback(&g_fioChan, fioDmaCallback, NULL);

    /* Connect buzzer to TPM0_CH3 */
    PORT_HAL_SetMuxMode(g_portBase[GPIOE_IDX], 30, kPortMuxAlt3);
    tpm_general_config_t tmpConfig = {
        .isDBGMode = false,
        .isGlobalTimeBase = false,
        .isTriggerMode = false,
        .isStopCountOnOveflow = false,
        .isCountReloadOnTrig = false,
        .triggerSource = kTpmTrigSel0,
    };
    TPM_DRV_Init(0, &tmpConfig);
    TPM_DRV_SetClock(0, kTpmClockSourceModuleMCGIRCLK, kTpmDividedBy1);

    /* Blank LED just in case, saves power */
    led(0x00, 0x00, 0x00);

    /* Init e-paper display */
    EPD_Init();

    /* Throw up first image */
    int ret = EPD_Draw(NULL, images[current_image]);
    if (-1 == ret) {
        led(0xff, 0x00, 0x00);
    } else if (-2 == ret) {
        led(0xff, 0xff, 0x00);
    } else if (-3 == ret) {
        led(0x00, 0x00, 0xff);
    } else {
        led(0x00, 0xff, 0x00);
    }
    blank_led = 30;

    /* Deinit so we can mess around on the bus pirate */
    //EPD_Deinit();

    /* We're done, everything else is triggered through interrupts */
    for(;;) {
        if (cue_next_image) {
            int old_image = current_image;
            current_image = (current_image + 1) % image_count;
            EPD_Draw(images[old_image], images[current_image]);
            cue_next_image = 0;
        }
#ifndef DEBUG
        SMC_HAL_SetMode(SMC, &g_idlePowerMode);
#endif
    }
}
/*FUNCTION****************************************************************
 *
 * Function Name: FLEXIO_SPI_HAL_ConfigMaster
 * Description: Configure the flexio working as spi master.
 *
 *END*********************************************************************/
flexio_status_t FLEXIO_SPI_HAL_ConfigMaster(flexio_spi_dev_t *devPtr, 
    const flexio_spi_master_config_t *configPtr)
{
    flexio_shifter_config_t mFlexioShfiterConfigStruct;
    flexio_timer_config_t mFlexioTimerConfigStruct;
    memset(&mFlexioShfiterConfigStruct, 0, sizeof(mFlexioShfiterConfigStruct));
    memset(&mFlexioTimerConfigStruct, 0, sizeof(mFlexioTimerConfigStruct));
    uint32_t timdiv = 0U, timcmp = 0U;
    
    if ( (!devPtr) || (!configPtr) )
    {
        return kStatus_FLEXIO_InvalidArgument;
    }

    /* 1. Configure shifter 0 for tx. */
    if (configPtr->cphaOneEnable)
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnPositive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutput;
        mFlexioShfiterConfigStruct.pinsel = devPtr->txPinIdx; /* MOSI */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeTransmit;
        mFlexioShfiterConfigStruct.insrc  = kFlexioShifterInputFromPin;
        mFlexioShfiterConfigStruct.sstop  = kFlexioShifterStopBitLow;
        mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnShift;
    }
    else
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnNegitive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutput;
        mFlexioShfiterConfigStruct.pinsel = devPtr->txPinIdx; /* MOSI */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeTransmit;
        mFlexioShfiterConfigStruct.insrc  = kFlexioShifterInputFromPin;
        mFlexioShfiterConfigStruct.sstop  = kFlexioShifterStopBitDisable;
        mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnEnable;
    }
    FLEXIO_HAL_ConfigureShifter(
        devPtr->flexioBase, devPtr->shifterIdx[0], &mFlexioShfiterConfigStruct);
    
    /* 2. Configure shifter 1 for rx. */
    if (configPtr->cphaOneEnable)
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnNegitive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
        mFlexioShfiterConfigStruct.pinsel = devPtr->rxPinIdx; /* MISO */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeReceive;
    }
    else
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnPositive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
        mFlexioShfiterConfigStruct.pinsel = devPtr->rxPinIdx; /* MISO */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeReceive;
    }
    mFlexioShfiterConfigStruct.insrc  = kFlexioShifterInputFromPin;
    mFlexioShfiterConfigStruct.sstop  = kFlexioShifterStopBitDisable;
    mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnEnable;
    FLEXIO_HAL_ConfigureShifter(
        devPtr->flexioBase, devPtr->shifterIdx[1], &mFlexioShfiterConfigStruct);

    /* 3. Configure timer 1 for csn. */
    mFlexioTimerConfigStruct.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_TIMn(devPtr->timerIdx[0]);
    mFlexioTimerConfigStruct.trgpol = kFlexioTimerTriggerPolarityActiveHigh;
    mFlexioTimerConfigStruct.trgsrc = kFlexioTimerTriggerSourceInternal;
    mFlexioTimerConfigStruct.pincfg = kFlexioPinConfigOutput;
    mFlexioTimerConfigStruct.pinsel = devPtr->csnPinIdx; /* CSn. */
    mFlexioTimerConfigStruct.pinpol = kFlexioPinActiveLow;
    mFlexioTimerConfigStruct.timod  = kFlexioTimerModeSingle16Bit;
    mFlexioTimerConfigStruct.timout = kFlexioTimerOutputOneNotAffectedByReset;
    mFlexioTimerConfigStruct.timdec = kFlexioTimerDecSrcOnFlexIOClockShiftTimerOutput;
    mFlexioTimerConfigStruct.timrst = kFlexioTimerResetNever;
    mFlexioTimerConfigStruct.timdis = kFlexioTimerDisableOnPreTimerDisable;
    mFlexioTimerConfigStruct.timena = kFlexioTimerEnableOnPrevTimerEnable;
    mFlexioTimerConfigStruct.tstop  = kFlexioTimerStopBitDisabled;
    mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitDisabled;
    mFlexioTimerConfigStruct.timcmp = 0xFFFFU;
    FLEXIO_HAL_ConfigureTimer(
        devPtr->flexioBase, devPtr->timerIdx[1], &mFlexioTimerConfigStruct);

    /* 4. Configure timer 0 for sclk. */
    mFlexioTimerConfigStruct.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_SHIFTnSTAT(devPtr->shifterIdx[0]);
    mFlexioTimerConfigStruct.trgpol = kFlexioTimerTriggerPolarityActiveLow;
    mFlexioTimerConfigStruct.trgsrc = kFlexioTimerTriggerSourceInternal;
    mFlexioTimerConfigStruct.pincfg = kFlexioPinConfigOutput;
    mFlexioTimerConfigStruct.pinsel = devPtr->sclkPinIdx; /* SCLK. */
    mFlexioTimerConfigStruct.pinpol = kFlexioPinActiveHigh;
    mFlexioTimerConfigStruct.timod  = kFlexioTimerModeDual8BitBaudBit; 
    mFlexioTimerConfigStruct.timout = kFlexioTimerOutputZeroNotAffectedByReset;
    mFlexioTimerConfigStruct.timdec = kFlexioTimerDecSrcOnFlexIOClockShiftTimerOutput;
    mFlexioTimerConfigStruct.timrst = kFlexioTimerResetNever;
    mFlexioTimerConfigStruct.timdis = kFlexioTimerDisableOnTimerCompare;
    mFlexioTimerConfigStruct.timena = kFlexioTimerEnableOnTriggerHigh;
    mFlexioTimerConfigStruct.tstop  = kFlexioTimerStopBitEnableOnTimerDisable;
    mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitEnabled;
    timdiv = (configPtr->flexioBusClk) / (configPtr->baudrate);
    timcmp = ( (configPtr->bitCount << 1U) - 1U )  << 8U;
    timcmp |= ( (timdiv >> 1U) - 1U);
    mFlexioTimerConfigStruct.timcmp = timcmp;
    FLEXIO_HAL_ConfigureTimer(
        devPtr->flexioBase, devPtr->timerIdx[0], &mFlexioTimerConfigStruct);

    return kStatus_FLEXIO_Success;
}
/*FUNCTION****************************************************************
 *
 * Function Name: FLEXIO_SPI_HAL_ConfigSlave
 * Description: Configure the flexio working as spi slave.
 *
 *END*********************************************************************/
flexio_status_t FLEXIO_SPI_HAL_ConfigSlave(flexio_spi_dev_t *devPtr,
    const flexio_spi_slave_config_t *configPtr)
{
    flexio_shifter_config_t mFlexioShfiterConfigStruct;
    flexio_timer_config_t mFlexioTimerConfigStruct;
    memset(&mFlexioShfiterConfigStruct, 0, sizeof(mFlexioShfiterConfigStruct));
    memset(&mFlexioTimerConfigStruct, 0, sizeof(mFlexioTimerConfigStruct));

    if ( (!devPtr) || (!configPtr) )
    {
        return kStatus_FLEXIO_InvalidArgument;
    }

    /* 1. Configure shifter 0 for tx. */
    if (configPtr->cphaOneEnable)
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnPositive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutput;
        mFlexioShfiterConfigStruct.pinsel = devPtr->txPinIdx; /* MISO */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode = kFlexioShifterModeTransmit;
        mFlexioShfiterConfigStruct.insrc = kFlexioShifterInputFromPin;
        mFlexioShfiterConfigStruct.sstop = kFlexioShifterStopBitDisable;
        mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnShift;
    }
    else
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnNegitive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutput;
        mFlexioShfiterConfigStruct.pinsel = devPtr->txPinIdx; /* MISO */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeTransmit;
        mFlexioShfiterConfigStruct.insrc  = kFlexioShifterInputFromPin;
        mFlexioShfiterConfigStruct.sstop  = kFlexioShifterStopBitDisable;
        mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnEnable;
    }
    FLEXIO_HAL_ConfigureShifter(
        devPtr->flexioBase, devPtr->shifterIdx[0], &mFlexioShfiterConfigStruct);

    /* 2. Configure shifter 1 for tx. */
    if (configPtr->cphaOneEnable)
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnNegitive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
        mFlexioShfiterConfigStruct.pinsel = devPtr->rxPinIdx; /* MOSI */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeReceive;
    }
    else
    {
        mFlexioShfiterConfigStruct.timsel = devPtr->timerIdx[0];
        mFlexioShfiterConfigStruct.timpol = kFlexioShifterTimerPolarityOnPositive;
        mFlexioShfiterConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
        mFlexioShfiterConfigStruct.pinsel = devPtr->rxPinIdx; /* MOSI */
        mFlexioShfiterConfigStruct.pinpol = kFlexioPinActiveHigh;
        mFlexioShfiterConfigStruct.smode  = kFlexioShifterModeReceive;
    }
    mFlexioShfiterConfigStruct.insrc = kFlexioShifterInputFromPin;
    mFlexioShfiterConfigStruct.sstop = kFlexioShifterStopBitDisable;
    mFlexioShfiterConfigStruct.sstart = kFlexioShifterStartBitDisabledLoadDataOnEnable;
    FLEXIO_HAL_ConfigureShifter(
        devPtr->flexioBase, devPtr->shifterIdx[1], &mFlexioShfiterConfigStruct);
    
    /* 3. Configure timer 1 for csn. */
    mFlexioTimerConfigStruct.trgsel = FLEXIO_HAL_TIMER_TRIGGER_SEL_PININPUT(devPtr->csnPinIdx);  /* CSn. */
    mFlexioTimerConfigStruct.trgpol = kFlexioTimerTriggerPolarityActiveLow;
    mFlexioTimerConfigStruct.trgsrc = kFlexioTimerTriggerSourceExternal;
    mFlexioTimerConfigStruct.pincfg = kFlexioPinConfigOutputDisabled;
    mFlexioTimerConfigStruct.pinsel = devPtr->sclkPinIdx; /* SCLK. */
    mFlexioTimerConfigStruct.pinpol = kFlexioPinActiveHigh;
    mFlexioTimerConfigStruct.timod  = kFlexioTimerModeSingle16Bit; 
    mFlexioTimerConfigStruct.timout = kFlexioTimerOutputZeroNotAffectedByReset;
    mFlexioTimerConfigStruct.timdec = kFlexioTimerDecSrcOnPinInputShiftPinInput;
    mFlexioTimerConfigStruct.timrst = kFlexioTimerResetNever;
    mFlexioTimerConfigStruct.timdis = kFlexioTimerDisableOnTriggerFallingEdge;
    mFlexioTimerConfigStruct.timena = kFlexioTimerEnableOnTriggerRisingEdge;
    mFlexioTimerConfigStruct.tstop  = kFlexioTimerStopBitDisabled;
    if (configPtr->cphaOneEnable)
    {
        mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitEnabled;
    }
    else
    {
        mFlexioTimerConfigStruct.tstart = kFlexioTimerStartBitDisabled;
    }
    mFlexioTimerConfigStruct.timcmp = ( (configPtr->bitCount << 1U) - 1U );
    FLEXIO_HAL_ConfigureTimer(
        devPtr->flexioBase, devPtr->timerIdx[0], &mFlexioTimerConfigStruct);

    return kStatus_FLEXIO_Success;
}