IMXRT1170-EVKB - SAI TDM

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

IMXRT1170-EVKB - SAI TDM

2,476件の閲覧回数
Femio
Contributor II

Hello everyone,

I'm trying to implement a SAI with TDM protocol for audio data transfer.

Starting from sai_edma_tdm_record_playback without CS42448, I've changed few configurations in order to implement a loopback between SAI1_RX/TX.

Links are:

TX_BCLK -> RX_BCLK

TX_SYNC -> RX_SYNC

TX_DA0 -> RX_DA0

 

On an oscilloscope connected to TX_DA0, it is possible to see data sent but they are uncorrect.

someone can explain to me how to correctly configure a TDM communication and what is wrong in the code below?

Thanks a lot,

-F

AT_NONCACHEABLE_SECTION_ALIGN(static uint8_t Buffer[BUFFER_NUMBER * BUFFER_SIZE], 4);
#if defined(DEMO_QUICKACCESS_SECTION_CACHEABLE) && DEMO_QUICKACCESS_SECTION_CACHEABLE
AT_NONCACHEABLE_SECTION_INIT(sai_edma_handle_t txHandle);
AT_NONCACHEABLE_SECTION_INIT(sai_edma_handle_t rxHandle);
#else
AT_QUICKACCESS_SECTION_DATA(sai_edma_handle_t txHandle);
AT_QUICKACCESS_SECTION_DATA(sai_edma_handle_t rxHandle);
#endif
static uint32_t tx_index = 0U, rx_index = 0U;
volatile uint32_t emptyBlock = BUFFER_NUMBER;
edma_handle_t dmaTxHandle = {0}, dmaRxHandle = {0};
extern codec_config_t boardCodecConfig;
codec_handle_t codecHandle;

/*******************************************************************************
 * Code
 ******************************************************************************/
static void rx_callback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData)
{
    if (kStatus_SAI_RxError == status)
    {
        /* Handle the error. */
    }
    else
    {
        emptyBlock--;
    }
}

static void tx_callback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData)
{
    if (kStatus_SAI_TxError == status)
    {
        /* Handle the error. */
    }
    else
    {
        emptyBlock++;
    }
}

/*!
 * @brief Main function
 */
int main(void)
{
    sai_transfer_t xfer;
    edma_config_t dmaConfig = {0};
    sai_transceiver_t saiConfig;

    BOARD_InitHardware();

    PRINTF("SAI TDM record playback example started!\n\r");

    /* Init DMA and create handle for DMA */
    EDMA_GetDefaultConfig(&dmaConfig);
#if defined(BOARD_GetEDMAConfig)
    BOARD_GetEDMAConfig(dmaConfig);
#endif
    EDMA_Init(EXAMPLE_DMA, &dmaConfig);
    EDMA_CreateHandle(&dmaTxHandle, EXAMPLE_DMA, EXAMPLE_TX_CHANNEL);
    EDMA_CreateHandle(&dmaRxHandle, EXAMPLE_DMA, EXAMPLE_RX_CHANNEL);
#if defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX
    EDMA_SetChannelMux(EXAMPLE_DMA, EXAMPLE_TX_CHANNEL, EXAMPLE_SAI_TX_SOURCE);
    EDMA_SetChannelMux(EXAMPLE_DMA, EXAMPLE_RX_CHANNEL, EXAMPLE_SAI_RX_SOURCE);
#endif

#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT 
#if defined(EXAMPLE_DMAMUX_TX_CHANNEL) && defined(EXAMPLE_DMAMUX_RX_CHANNEL)
    /* Init DMAMUX */
    DMAMUX_Init(EXAMPLE_DMAMUX_TX);
    DMAMUX_Init(EXAMPLE_DMAMUX_RX);
    DMAMUX_SetSource(EXAMPLE_DMAMUX_TX, EXAMPLE_DMAMUX_TX_CHANNEL, (uint8_t)EXAMPLE_SAI_TX_SOURCE);
    DMAMUX_EnableChannel(EXAMPLE_DMAMUX_TX, EXAMPLE_DMAMUX_TX_CHANNEL);
    DMAMUX_SetSource(EXAMPLE_DMAMUX_RX, EXAMPLE_DMAMUX_RX_CHANNEL, (uint8_t)EXAMPLE_SAI_RX_SOURCE);
    DMAMUX_EnableChannel(EXAMPLE_DMAMUX_RX, EXAMPLE_DMAMUX_RX_CHANNEL);
#else
    /* Init DMAMUX */
    DMAMUX_Init(EXAMPLE_DMAMUX);
    DMAMUX_SetSource(EXAMPLE_DMAMUX, EXAMPLE_TX_CHANNEL, (uint8_t)EXAMPLE_SAI_TX_SOURCE);
    DMAMUX_EnableChannel(EXAMPLE_DMAMUX, EXAMPLE_TX_CHANNEL);
    DMAMUX_SetSource(EXAMPLE_DMAMUX, EXAMPLE_RX_CHANNEL, (uint8_t)EXAMPLE_SAI_RX_SOURCE);
    DMAMUX_EnableChannel(EXAMPLE_DMAMUX, EXAMPLE_RX_CHANNEL);
#endif
#endif

    /* SAI init */
    SAI_Init(DEMO_SAI);

    SAI_TransferTxCreateHandleEDMA(DEMO_SAI, &txHandle, tx_callback, NULL, &dmaTxHandle);
    SAI_TransferRxCreateHandleEDMA(DEMO_SAI, &rxHandle, rx_callback, NULL, &dmaRxHandle);

    /* TDM mode configurations */
    SAI_GetTDMConfig(&saiConfig, kSAI_FrameSyncLenOneBitClk, DEMO_AUDIO_BIT_WIDTH, DEMO_AUDIO_DATA_CHANNEL,
                     kSAI_Channel0Mask);
    saiConfig.frameSync.frameSyncEarly = true;
    saiConfig.masterSlave = kSAI_Master;
    SAI_TransferTxSetConfigEDMA(DEMO_SAI, &txHandle, &saiConfig);
    saiConfig.masterSlave = kSAI_Slave;
    SAI_TransferRxSetConfigEDMA(DEMO_SAI, &rxHandle, &saiConfig);

    /* set bit clock divider */
    SAI_TxSetBitClockRate(DEMO_SAI, DEMO_AUDIO_MASTER_CLOCK, DEMO_AUDIO_SAMPLE_RATE, DEMO_AUDIO_BIT_WIDTH,
                          DEMO_AUDIO_DATA_CHANNEL);
    SAI_RxSetBitClockRate(DEMO_SAI, DEMO_AUDIO_MASTER_CLOCK, DEMO_AUDIO_SAMPLE_RATE, DEMO_AUDIO_BIT_WIDTH,
                          DEMO_AUDIO_DATA_CHANNEL);

    /* master clock configurations */
    BOARD_MASTER_CLOCK_CONFIG();
    /* CS42888 initialization */
    //DEMO_InitCodec();

    memset((uint8_t *)&Buffer,'5', sizeof(uint8_t) * 4096);

    while (1)
    {
        if (emptyBlock > 0)
        {
            xfer.data     = Buffer + rx_index * BUFFER_SIZE;
            xfer.dataSize = BUFFER_SIZE;
            if (kStatus_Success == SAI_TransferReceiveEDMA(DEMO_SAI, &rxHandle, &xfer))
            {
                rx_index++;
            }
            if (rx_index == BUFFER_NUMBER)
            {
                rx_index = 0U;
            }
        }
        if (emptyBlock < BUFFER_NUMBER)
        {
            xfer.data     = Buffer + tx_index * BUFFER_SIZE;
            xfer.dataSize = BUFFER_SIZE;
            if (kStatus_Success == SAI_TransferSendEDMA(DEMO_SAI, &txHandle, &xfer))
            {
                tx_index++;
            }
            if (tx_index == BUFFER_NUMBER)
            {
                tx_index = 0U;
            }
        }
    }
}

 

タグ(1)
0 件の賞賛
返信
4 返答(返信)

2,346件の閲覧回数
Omar_Anguiano
NXP TechSupport
NXP TechSupport

kSAI_FrameSyncLenOneBitClk is typically for I2S. For TDM, you might need a longer sync pulse depending on your frame size.
You're using kSAI_Channel0Mask, which means only one channel is active. For TDM, you usually want multiple channels (e.g., kSAI_Channel0Mask | kSAI_Channel1Mask | ...).
Ensure DEMO_AUDIO_DATA_CHANNEL matches the number of active channels in the mask.

BR,
Omar

0 件の賞賛
返信

2,286件の閲覧回数
Femio
Contributor II

 

DEMO_AUDIO_DATA_CHANNEL is set to 8 but in this example si configured only one channel in the channel mask. 

In output, measuring the TX output pin, I see wrong data as shown in the attached image (red is the RX input data and cyan TX output data). Is this behavior related to not having configured the channels correctly?

BR,

Francesco

タグ(1)
0 件の賞賛
返信

2,224件の閲覧回数
Omar_Anguiano
NXP TechSupport
NXP TechSupport

It can be the issue that channels are not configured correctly. 

BR,
Omar

0 件の賞賛
返信

2,285件の閲覧回数
Femio
Contributor II
 
0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-2190000%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EIMXRT1170-EVKB%20-%20SAI%20TDM%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2190000%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E3%81%BF%E3%82%93%E3%81%AA%E3%80%81%3C%2FP%3E%3CP%3E%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%83%87%E3%83%BC%E3%82%BF%E8%BB%A2%E9%80%81%E7%94%A8%E3%81%AB%20TDM%20%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20SAI%20%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%3CSPAN%3ECS42448%3C%2FSPAN%3E%E3%81%AA%E3%81%97%E3%81%AE%20sai_edma_tdm_record_playback%20%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%81%A6%E3%80%81SAI1_RX%2FTX%20%E9%96%93%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%97%E3%83%90%E3%83%83%E3%82%AF%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%AE%E6%A7%8B%E6%88%90%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%3C%2FP%3E%3CP%3E%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AF%E6%AC%A1%E3%81%AE%E3%81%A8%E3%81%8A%E3%82%8A%E3%81%A7%E3%81%99%3A%3C%2FP%3E%3CP%3ETX_BCLK%20-%26gt%3B%20RX_BCLK%3C%2FP%3E%3CP%3ETX_SYNC%20-%26gt%3B%20RX_SYNC%3C%2FP%3E%3CP%3ETX_DA0%20-%26gt%3B%20RX_DA0%3C%2FP%3E%3CBR%20%2F%3E%3CP%3ETX_DA0%20%E3%81%AB%E3%82%B3%E3%83%8D%E3%82%AF%E3%83%86%E3%83%83%E3%83%89%E3%81%95%E3%82%8C%E3%81%9F%E3%82%AA%E3%82%B7%E3%83%AD%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%A7%E3%81%AF%E3%80%81%E9%80%81%E4%BF%A1%E3%81%95%E3%82%8C%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E6%AD%A3%E3%81%97%E3%81%8F%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%3C%2FP%3E%3CP%3ETDM%20%E9%80%9A%E4%BF%A1%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A8%E3%80%81%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%81%A9%E3%81%93%E3%81%8C%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B%E3%82%92%E8%AA%B0%E3%81%8B%E8%AA%AC%E6%98%8E%E3%81%97%E3%81%A6%E3%82%82%E3%82%89%E3%81%88%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%3F%3C%2FP%3E%3CP%3E%E3%81%A9%E3%81%86%E3%82%82%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%80%81%3C%2FP%3E%3CP%3E-F%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3EAT_NONCACHEABLE_SECTION_ALIGN(static%20uint8_t%20Buffer%5BBUFFER_NUMBER%20*%20BUFFER_SIZE%5D%2C%204)%3B%0A%23if%20defined(DEMO_QUICKACCESS_SECTION_CACHEABLE)%20%26amp%3B%26amp%3B%20DEMO_QUICKACCESS_SECTION_CACHEABLE%0AAT_NONCACHEABLE_SECTION_INIT(sai_edma_handle_t%20txHandle)%3B%0AAT_NONCACHEABLE_SECTION_INIT(sai_edma_handle_t%20rxHandle)%3B%0A%23else%0AAT_QUICKACCESS_SECTION_DATA(sai_edma_handle_t%20txHandle)%3B%0AAT_QUICKACCESS_SECTION_DATA(sai_edma_handle_t%20rxHandle)%3B%0A%23endif%0Astatic%20uint32_t%20tx_index%20%3D%200U%2C%20rx_index%20%3D%200U%3B%0Avolatile%20uint32_t%20emptyBlock%20%3D%20BUFFER_NUMBER%3B%0Aedma_handle_t%20dmaTxHandle%20%3D%20%7B0%7D%2C%20dmaRxHandle%20%3D%20%7B0%7D%3B%0Aextern%20codec_config_t%20boardCodecConfig%3B%0Acodec_handle_t%20codecHandle%3B%0A%0A%2F*******************************************************************************%0A%20*%20Code%0A%20******************************************************************************%2F%0Astatic%20void%20rx_callback(I2S_Type%20*base%2C%20sai_edma_handle_t%20*handle%2C%20status_t%20status%2C%20void%20*userData)%0A%7B%0A%20%20%20%20if%20(kStatus_SAI_RxError%20%3D%3D%20status)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F*%20Handle%20the%20error.%20*%2F%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20emptyBlock--%3B%0A%20%20%20%20%7D%0A%7D%0A%0Astatic%20void%20tx_callback(I2S_Type%20*base%2C%20sai_edma_handle_t%20*handle%2C%20status_t%20status%2C%20void%20*userData)%0A%7B%0A%20%20%20%20if%20(kStatus_SAI_TxError%20%3D%3D%20status)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F*%20Handle%20the%20error.%20*%2F%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20emptyBlock%2B%2B%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%2F*!%0A%20*%20%40brief%20Main%20function%0A%20*%2F%0Aint%20main(void)%0A%7B%0A%20%20%20%20sai_transfer_t%20xfer%3B%0A%20%20%20%20edma_config_t%20dmaConfig%20%3D%20%7B0%7D%3B%0A%20%20%20%20sai_transceiver_t%20saiConfig%3B%0A%0A%20%20%20%20BOARD_InitHardware()%3B%0A%0A%20%20%20%20PRINTF(%22SAI%20TDM%20record%20playback%20example%20started!%5Cn%5Cr%22)%3B%0A%0A%20%20%20%20%2F*%20Init%20DMA%20and%20create%20handle%20for%20DMA%20*%2F%0A%20%20%20%20EDMA_GetDefaultConfig(%26amp%3BdmaConfig)%3B%0A%23if%20defined(BOARD_GetEDMAConfig)%0A%20%20%20%20BOARD_GetEDMAConfig(dmaConfig)%3B%0A%23endif%0A%20%20%20%20EDMA_Init(EXAMPLE_DMA%2C%20%26amp%3BdmaConfig)%3B%0A%20%20%20%20EDMA_CreateHandle(%26amp%3BdmaTxHandle%2C%20EXAMPLE_DMA%2C%20EXAMPLE_TX_CHANNEL)%3B%0A%20%20%20%20EDMA_CreateHandle(%26amp%3BdmaRxHandle%2C%20EXAMPLE_DMA%2C%20EXAMPLE_RX_CHANNEL)%3B%0A%23if%20defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX)%20%26amp%3B%26amp%3B%20FSL_FEATURE_EDMA_HAS_CHANNEL_MUX%0A%20%20%20%20EDMA_SetChannelMux(EXAMPLE_DMA%2C%20EXAMPLE_TX_CHANNEL%2C%20EXAMPLE_SAI_TX_SOURCE)%3B%0A%20%20%20%20EDMA_SetChannelMux(EXAMPLE_DMA%2C%20EXAMPLE_RX_CHANNEL%2C%20EXAMPLE_SAI_RX_SOURCE)%3B%0A%23endif%0A%0A%23if%20defined(FSL_FEATURE_SOC_DMAMUX_COUNT)%20%26amp%3B%26amp%3B%20FSL_FEATURE_SOC_DMAMUX_COUNT%20%0A%23if%20defined(EXAMPLE_DMAMUX_TX_CHANNEL)%20%26amp%3B%26amp%3B%20defined(EXAMPLE_DMAMUX_RX_CHANNEL)%0A%20%20%20%20%2F*%20Init%20DMAMUX%20*%2F%0A%20%20%20%20DMAMUX_Init(EXAMPLE_DMAMUX_TX)%3B%0A%20%20%20%20DMAMUX_Init(EXAMPLE_DMAMUX_RX)%3B%0A%20%20%20%20DMAMUX_SetSource(EXAMPLE_DMAMUX_TX%2C%20EXAMPLE_DMAMUX_TX_CHANNEL%2C%20(uint8_t)EXAMPLE_SAI_TX_SOURCE)%3B%0A%20%20%20%20DMAMUX_EnableChannel(EXAMPLE_DMAMUX_TX%2C%20EXAMPLE_DMAMUX_TX_CHANNEL)%3B%0A%20%20%20%20DMAMUX_SetSource(EXAMPLE_DMAMUX_RX%2C%20EXAMPLE_DMAMUX_RX_CHANNEL%2C%20(uint8_t)EXAMPLE_SAI_RX_SOURCE)%3B%0A%20%20%20%20DMAMUX_EnableChannel(EXAMPLE_DMAMUX_RX%2C%20EXAMPLE_DMAMUX_RX_CHANNEL)%3B%0A%23else%0A%20%20%20%20%2F*%20Init%20DMAMUX%20*%2F%0A%20%20%20%20DMAMUX_Init(EXAMPLE_DMAMUX)%3B%0A%20%20%20%20DMAMUX_SetSource(EXAMPLE_DMAMUX%2C%20EXAMPLE_TX_CHANNEL%2C%20(uint8_t)EXAMPLE_SAI_TX_SOURCE)%3B%0A%20%20%20%20DMAMUX_EnableChannel(EXAMPLE_DMAMUX%2C%20EXAMPLE_TX_CHANNEL)%3B%0A%20%20%20%20DMAMUX_SetSource(EXAMPLE_DMAMUX%2C%20EXAMPLE_RX_CHANNEL%2C%20(uint8_t)EXAMPLE_SAI_RX_SOURCE)%3B%0A%20%20%20%20DMAMUX_EnableChannel(EXAMPLE_DMAMUX%2C%20EXAMPLE_RX_CHANNEL)%3B%0A%23endif%0A%23endif%0A%0A%20%20%20%20%2F*%20SAI%20init%20*%2F%0A%20%20%20%20SAI_Init(DEMO_SAI)%3B%0A%0A%20%20%20%20SAI_TransferTxCreateHandleEDMA(DEMO_SAI%2C%20%26amp%3BtxHandle%2C%20tx_callback%2C%20NULL%2C%20%26amp%3BdmaTxHandle)%3B%0A%20%20%20%20SAI_TransferRxCreateHandleEDMA(DEMO_SAI%2C%20%26amp%3BrxHandle%2C%20rx_callback%2C%20NULL%2C%20%26amp%3BdmaRxHandle)%3B%0A%0A%20%20%20%20%2F*%20TDM%20mode%20configurations%20*%2F%0A%20%20%20%20SAI_GetTDMConfig(%26amp%3BsaiConfig%2C%20kSAI_FrameSyncLenOneBitClk%2C%20DEMO_AUDIO_BIT_WIDTH%2C%20DEMO_AUDIO_DATA_CHANNEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kSAI_Channel0Mask)%3B%0A%20%20%20%20saiConfig.frameSync.frameSyncEarly%20%3D%20true%3B%0A%20%20%20%20saiConfig.masterSlave%20%3D%20kSAI_Master%3B%0A%20%20%20%20SAI_TransferTxSetConfigEDMA(DEMO_SAI%2C%20%26amp%3BtxHandle%2C%20%26amp%3BsaiConfig)%3B%0A%20%20%20%20saiConfig.masterSlave%20%3D%20kSAI_Slave%3B%0A%20%20%20%20SAI_TransferRxSetConfigEDMA(DEMO_SAI%2C%20%26amp%3BrxHandle%2C%20%26amp%3BsaiConfig)%3B%0A%0A%20%20%20%20%2F*%20set%20bit%20clock%20divider%20*%2F%0A%20%20%20%20SAI_TxSetBitClockRate(DEMO_SAI%2C%20DEMO_AUDIO_MASTER_CLOCK%2C%20DEMO_AUDIO_SAMPLE_RATE%2C%20DEMO_AUDIO_BIT_WIDTH%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DEMO_AUDIO_DATA_CHANNEL)%3B%0A%20%20%20%20SAI_RxSetBitClockRate(DEMO_SAI%2C%20DEMO_AUDIO_MASTER_CLOCK%2C%20DEMO_AUDIO_SAMPLE_RATE%2C%20DEMO_AUDIO_BIT_WIDTH%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DEMO_AUDIO_DATA_CHANNEL)%3B%0A%0A%20%20%20%20%2F*%20master%20clock%20configurations%20*%2F%0A%20%20%20%20BOARD_MASTER_CLOCK_CONFIG()%3B%0A%20%20%20%20%2F*%20CS42888%20initialization%20*%2F%0A%20%20%20%20%2F%2FDEMO_InitCodec()%3B%0A%0A%20%20%20%20memset((uint8_t%20*)%26amp%3BBuffer%2C'5'%2C%20sizeof(uint8_t)%20*%204096)%3B%0A%0A%20%20%20%20while%20(1)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20(emptyBlock%20%26gt%3B%200)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20xfer.data%20%20%20%20%20%3D%20Buffer%20%2B%20rx_index%20*%20BUFFER_SIZE%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20xfer.dataSize%20%3D%20BUFFER_SIZE%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(kStatus_Success%20%3D%3D%20SAI_TransferReceiveEDMA(DEMO_SAI%2C%20%26amp%3BrxHandle%2C%20%26amp%3Bxfer))%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rx_index%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(rx_index%20%3D%3D%20BUFFER_NUMBER)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rx_index%20%3D%200U%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(emptyBlock%20%26lt%3B%20BUFFER_NUMBER)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20xfer.data%20%20%20%20%20%3D%20Buffer%20%2B%20tx_index%20*%20BUFFER_SIZE%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20xfer.dataSize%20%3D%20BUFFER_SIZE%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(kStatus_Success%20%3D%3D%20SAI_TransferSendEDMA(DEMO_SAI%2C%20%26amp%3BtxHandle%2C%20%26amp%3Bxfer))%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tx_index%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(tx_index%20%3D%3D%20BUFFER_NUMBER)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tx_index%20%3D%200U%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2190000%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CLINGO-LABEL%3E%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%EF%BC%88PDM%20%7C%20I2S%20%7C%20SAI%EF%BC%89%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3E%E9%80%9A%E4%BF%A1%E3%81%A8%E5%88%B6%E5%BE%A1%EF%BC%88I3C%20%7C%20I2C%20%7C%20SPI%20%7C%20FlexCAN%20%7C%20%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%20%7C%20FlexIO%EF%BC%89%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2199219%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20IMXRT1170-EVKB%20-%20SAI%20TDM%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2199219%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E6%A7%8B%E6%88%90%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%A7%E3%81%82%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CP%3EBR%E3%80%81%3CBR%20%2F%3E%E3%82%AA%E3%83%9E%E3%83%BC%E3%83%AB%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2197370%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20IMXRT1170-EVKB%20-%20SAI%20TDM%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2197370%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3EDEMO_AUDIO_DATA_CHANNEL%20%E3%81%AF%208%20%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E3%81%93%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%AF%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%20%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%AB%201%20%E3%81%A4%E3%81%AE%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E3%81%BF%E3%81%8C%E6%A7%8B%E6%88%90%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%E5%87%BA%E5%8A%9B%E3%81%A7%E3%81%AF%E3%80%81TX%20%E5%87%BA%E5%8A%9B%E3%83%94%E3%83%B3%E3%82%92%E6%B8%AC%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E6%B7%BB%E4%BB%98%E7%94%BB%E5%83%8F%E3%81%AB%E7%A4%BA%E3%81%99%E3%82%88%E3%81%86%E3%81%AB%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%20(%E8%B5%A4%E3%81%AF%20RX%20%E5%85%A5%E5%8A%9B%E3%83%87%E3%83%BC%E3%82%BF%E3%80%81%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%AF%20TX%20%E5%87%BA%E5%8A%9B%E3%83%87%E3%83%BC%E3%82%BF)%E3%80%82%E3%81%93%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%AF%E3%80%81%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E6%A7%8B%E6%88%90%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%AB%E9%96%A2%E4%BF%82%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B%3F%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EBR%E3%80%81%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%E3%83%95%E3%83%A9%E3%83%B3%E3%83%81%E3%82%A7%E3%82%B9%E3%82%B3%3C%2FSPAN%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2196772%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20IMXRT1170-EVKB%20-%20SAI%20TDM%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2196772%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EkSAI_FrameSyncLenOneBitClk%20%E3%81%AF%E9%80%9A%E5%B8%B8%20I2S%20%E7%94%A8%E3%81%A7%E3%81%99%E3%80%82TDM%20%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%81%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%20%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%82%88%E3%82%8A%E9%95%B7%E3%81%84%E5%90%8C%E6%9C%9F%E3%83%91%E3%83%AB%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3EkSAI_Channel0Mask%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AA%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AF%201%20%E3%81%A4%E3%81%A0%E3%81%91%E3%81%A7%E3%81%99%E3%80%82TDM%20%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%81%E9%80%9A%E5%B8%B8%E3%81%AF%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%20(%E4%BE%8B%3A%20kSAI_Channel0Mask%20%7C%20kSAI_Channel1Mask%20%7C%20...)%20%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3EDEMO_AUDIO_DATA_CHANNEL%20%E3%81%8C%E3%83%9E%E3%82%B9%E3%82%AF%E5%86%85%E3%81%AE%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AA%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E6%95%B0%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CP%3EBR%E3%80%81%3CBR%20%2F%3E%E3%82%AA%E3%83%9E%E3%83%BC%E3%83%AB%3C%2FP%3E%3C%2FLINGO-BODY%3E