在线时间6 小时
UID4077084
注册时间2024-12-27
NXP金币153
TA的每日心情 | 衰 2024-12-31 10:51 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
注册会员

- 积分
- 56
- 最后登录
- 2025-3-24
|
各位恩智浦开发者的老师们,你们好,我是一名恩智浦,我在使用LPC55S28 实现DMA 传输I2S的数据,我发现恩智浦官方sdk的I2S 使用DMA传输是16位,我不知道怎么修改成24位,麻烦各位老师指点我们一下。谢谢(鞠躬)。另外附上一部分代码
//I2S的配置
I2S_TxGetDefaultConfig(&s_TxConfig);
s_TxConfig.divider = DEMO_I2S_CLOCK_DIVIDER;
s_TxConfig.masterSlave = DEMO_I2S_TX_MODE;
s_TxConfig.dataLength = DataLenth;
s_TxConfig.frameLength = FrameLength;
s_TxConfig.leftJust = false;
I2S_TxInit(DEMO_I2S_TX, &s_TxConfig);
I2S_RxGetDefaultConfig(&s_RxConfig);
s_RxConfig.divider = DEMO_I2S_CLOCK_DIVIDER;
s_RxConfig.masterSlave = DEMO_I2S_RX_MODE;
s_RxConfig.dataLength = DataLenth;
s_RxConfig.frameLength = FrameLength;
s_RxConfig.leftJust = false;
I2S_RxInit(DEMO_I2S_RX, &s_RxConfig);
PRINTF("AUDIO Loopback started!\r\n");
PRINTF("Headphones will play what is input into Audio Line-In connector.\r\n");
// PRINTF("CLOCK_GetPll0OutFreq = %d\r\n", CLOCK_GetPll0OutFreq);
s_RxTransfer.data = &s_Buffer[0];
s_RxTransfer.dataSize = sizeof(s_Buffer);
// s_TxTransfer.data = &s_Buffer[0];
// s_TxTransfer.dataSize = sizeof(s_Buffer);
#if I2S_24BIT
// 24位
s_TxTransfer.data = &sin_24bit[0];
s_TxTransfer.dataSize = sizeof(sin_24bit);
#else
// 16位
s_TxTransfer.data = &sin_16bit[0];
s_TxTransfer.dataSize = sizeof(sin_16bit);
#endif
//DMA0 的配置
#if DMA_Transfer
DMA_Init(DEMO_DMA);
DMA_EnableChannel(DEMO_DMA, DEMO_I2S_TX_CHANNEL);
DMA_EnableChannel(DEMO_DMA, DEMO_I2S_RX_CHANNEL);
DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S_TX_CHANNEL, kDMA_ChannelPriority2);
DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S_RX_CHANNEL, kDMA_ChannelPriority3);
DMA_CreateHandle(&s_DmaTxHandle, DEMO_DMA, DEMO_I2S_TX_CHANNEL);
DMA_CreateHandle(&s_DmaRxHandle, DEMO_DMA, DEMO_I2S_RX_CHANNEL);
I2S_TxTransferCreateHandleDMA(DEMO_I2S_TX, &s_TxHandle, &s_DmaTxHandle, TxCallback, (void *)&s_TxTransfer);
I2S_TxTransferCreateHandleDMA(DEMO_I2S_RX, &s_RxHandle, &s_DmaRxHandle, RxCallback, (void *)&s_RxTransfer);
// 这个屏蔽掉 帧时钟LRCK 位时钟BCLK 会失效
/* need to queue two transmit buffers so when the first one
* finishes transfer, the other immediatelly starts */
I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
//I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
I2S_RxTransferReceiveDMA(DEMO_I2S_RX, &s_RxHandle, s_RxTransfer);
I2S_RxTransferReceiveDMA(DEMO_I2S_RX, &s_RxHandle, s_RxTransfer);
#else //I2S传输
// 这个屏蔽掉 帧时钟LRCK 位时钟BCLK 会失效
I2S_TxTransferCreateHandle(DEMO_I2S_TX, &s_TxHandle, TxCallback, (void *)&s_TxTransfer);
I2S_RxTransferCreateHandle(DEMO_I2S_RX, &s_RxHandle, RxCallback, (void *)&s_RxTransfer);
I2S_RxTransferNonBlocking(DEMO_I2S_RX, &s_RxHandle, s_RxTransfer);
I2S_TxTransferNonBlocking(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
#endif
//另外附加我的工程代码
|
|