NXP MCU 技术论坛
直播中

李芳

7年用户 1334经验值
私信 关注
[问答]

RT1021 SAI的TDM模式fs时钟不正确是为什么?

RT1021 SAI 的TDM 模式fs 时钟不正确。附件是配置代码和示波器截图。
/* 选择音频/视频 PLL (786.48 MHz) 作为 sai1 时钟源 */
#define DEMO_SAI1_CLOCK_SOURCE_SELECT (2U)
/* sai1 时钟源的时钟预分频器 */
#define DEMO_SAI1_CLOCK_SOURCE_PRE_DIVIDER (1U)
/* sai1 时钟源的时钟分频器 */
#define DEMO_SAI1_CLOCK_SOURCE_DIVIDER (15U)
/* 获取 sai1 时钟的频率 */
#define DEMO_SAI_CLK_FREQ  
(CLOCK_GetFreq(kCLOCK_AudioPllClk) / (DEMO_SAI1_CLOCK_SOURCE_DIVIDER + 1U) /  
(DEMO_SAI1_CLOCK_SOURCE_PRE_UDIDER)
/* 演示音频采样率 */
#define DEMO_AUDIO_SAMPLE_RATE (kSAI_SampleRate16KHz)
/* 演示音频数据通道 */
#define DEMO_AUDIO_DATA_CHANNEL (2U)
/* 演示音频位宽 */
#define DEMO_AUDIO_BIT_WIDTH (kSAI_WordWidth16bits)

int SaiTask(void)
{
edma_config_t dmaConfig = {0};
字符输入='1';
uint8_t 用户项 = 1U;
CLOCK_InitAudioPll(&audioPllConfig);
/* I2C */
/*LPI2C 的时钟设置*/
CLOCK_SetMux(kCLOCK_Lpi2cMux, LPI2C_CLOCK_SOURCE_SELECT);
CLOCK_SetDiv(kCLOCK_Lpi2cDiv, LPI2C_CLOCK_SOURCE_DIVIDER);
/*SAI1 的时钟设置*/
CLOCK_SetMux(kCLOCK_Sai1Mux, DEMO_SAI1_CLOCK_SOURCE_SELECT);
CLOCK_SetDiv(kCLOCK_Sai1PreDiv, DEMO_SAI1_CLOCK_SOURCE_PRE_DIVIDER);
CLOCK_SetDiv(kCLOCK_Sai1Div, DEMO_SAI1_CLOCK_SOURCE_DIVIDER);
/*启用 MCLK 时钟*/
BOARD_EnableSaiMclkOutput(true);
/* 初始化 DMAMUX */
DMAMUX_Init(DEMO_DMAMUX);
DMAMUX_SetSource(DEMO_DMAMUX,DEMO_TX_EDMA_CHANNEL,(uint8_t)DEMO_SAI_TX_SOURCE);
DMAMUX_EnableChannel(DEMO_DMAMUX, DEMO_TX_EDMA_CHANNEL);
DMAMUX_SetSource(DEMO_DMAMUX,DEMO_RX_EDMA_CHANNEL,(uint8_t)DEMO_SAI_RX_SOURCE);
DMAMUX_EnableChannel(DEMO_DMAMUX, DEMO_RX_EDMA_CHANNEL);
PRINTF("SAI 演示开始!nr");
/* 创建 EDMA 句柄 */
/*
* dmaConfig.enableRoundRobinArbitration = false;
* dmaConfig.enableHaltOnError = true;
* dmaConfig.enableContinuousLinkMode = false;
* dmaConfig.enableDebugMode = false;
*/
EDMA_GetDefaultConfig(&dmaConfig);
EDMA_Init(DEMO_DMA, &dmaConfig);
EDMA_CreateHandle(&dmaTxHandle, DEMO_DMA, DEMO_TX_EDMA_CHANNEL);
EDMA_CreateHandle(&dmaRxHandle, DEMO_DMA, DEMO_RX_EDMA_CHANNEL);
#if 定义(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX)&& FSL_FEATURE_EDMA_HAS_CHANNEL_MUX
EDMA_SetChannelMux(DEMO_DMA,DEMO_TX_EDMA_CHANNEL,DEMO_SAI_TX_EDMA_CHANNEL);
EDMA_SetChannelMux(DEMO_DMA, DEMO_RX_EDMA_CHANNEL, DEMO_SAI_RX_EDMA_CHANNEL);
#万一
/* SAI 初始化 */
SAI_Init(DEMO_SAI);
SAI_TransferTxCreateHandleEDMA(DEMO_SAI, &txHandle, txCallback, NULL, &dmaTxHandle);
SAI_TransferRxCreateHandleEDMA(DEMO_SAI, &rxHandle, rxCallback, NULL, &dmaRxHandle);
/* I2S 模式配置 */
//SAI_GetClassicI2SConfig(&saiConfig, DEMO_AUDIO_BIT_WIDTH, kSAI_Stereo, 1U << DEMO_SAI_CHANNEL);
SAI_GetTDMConfig(&saiConfig, kSAI_FrameSyncLenOneBitClk, DEMO_AUDIO_BIT_WIDTH, DEMO_AUDIO_DATA_CHANNEL, 1U << DEMO_SAI_CHANNEL);
saiConfig.frameSync.frameSyncEarly = true;
//saiConfig.syncMode = DEMO_SAI_TX_SYNC_MODE;
//saiConfig.masterSlave = DEMO_SAI_MASTER_SLAVE;
SAI_TransferTxSetConfigEDMA(DEMO_SAI, &txHandle, &saiConfig);
//saiConfig.syncMode = DEMO_SAI_RX_SYNC_MODE;
SAI_TransferRxSetConfigEDMA(DEMO_SAI, &rxHandle, &saiConfig);
/* 设置位时钟分频器 */
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);
/* 主时钟配置 */
BOARD_MASTER_CLOCK_CONFIG();

//tlv320
tlv6410_i2c_init();
tlv6410_config();
tlv6410_Status();
#if 0
/* 使用默认设置初始化编解码器 */
if (CODEC_Init(&codecHandle, &boardCodecConfig) != kStatus_Success)
{
assert(false);
}
if (CODEC_SetVolume(&codecHandle, kCODEC_PlayChannelHeadphoneLeft | kCODEC_PlayChannelHeadphoneRight,
DEMO_CODEC_VOLUME) != kStatus_Success)
{
assert(false);
}
#endif
/* 启用中断以处理 FIFO 错误 */
SAI_TxEnableInterrupts(DEMO_SAI, kSAI_FIFOErrorInterruptEnable);
SAI_RxEnableInterrupts(DEMO_SAI, kSAI_FIFOErrorInterruptEnable);
启用IRQ(DEMO_SAI_TX_IRQ);
启用IRQ(DEMO_SAI_RX_IRQ);
}


                           

更多回帖

发帖
×
20
完善资料,
赚取积分