完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我在 RT600 上有一个使用四个 I2S 端口的新项目。两个用于接收,两个用于发送。我有一个项目正在工作,将音频输入传递到输出(基于示例项目),但需要修改其中一个传递以将数据发送到 DSP 进行处理。我已经查看了文档(存在的很少)和其他示例项目,但似乎缺少有关接收 DMA 中断的关键信息。
我知道我需要两个缓冲区:1 个用于发送到 DSP,而 2 个用于填充传入数据。我可以创建两个缓冲区并将其排队。问题是 I2S DMA 中断在回调中有用户数据,但这个空指针对于特定的 I2S 通道是全局的。它不会根据缓冲区发送或接收数据而改变。所以当中断发生时,不知道刚刚填充或清空了哪个缓冲区。 我认为有一个 DMA 乒乓缓冲区示例项目可以解决问题。但它也只有一个通用用户数据指针。然后中断不指示细节。部分示例代码如下: static i2s_transfer_t s_rxTransfer[2] = {{ .data = s_Buffer[0], .dataSize = DEMO_BUFFER_SIZE, }, { .data = s_Buffer[1], .dataSize = DEMO_BUFFER_SIZE, }}; static i2s_transfer_t s_txTransfer[2] = {{ .data = s_Buffer[1], .dataSize = DEMO_BUFFER_SIZE, }, { .data = s_Buffer[0], .dataSize = DEMO_BUFFER_SIZE, ... I2S_TxTransferCreateHandleDMA(DEMO_I2S_TX, &s_TxHandle, &s_DmaTxHandle, TxCallback, (void *)&s_txTransfer); I2S_RxTransferCreateHandleDMA(DEMO_I2S_RX, &s_RxHandle, &s_DmaRxHandle, RxCallback, (void *)&s_rxTransfer); I2S_TransferInstallLoopDMADescriptorMemory(&s_TxHandle, s_txDmaDescriptors, 2U); I2S_TransferInstallLoopDMADescriptorMemory(&s_RxHandle, s_rxDmaDescriptors, 2U); if (I2S_TransferSendLoopDMA(DEMO_I2S_TX, &s_TxHandle, &s_txTransfer[0], 2U) != kStatus_Success) { assert(false); } if (I2S_TransferReceiveLoopDMA(DEMO_I2S_RX, &s_RxHandle, &s_rxTransfer[0], 2U) != kStatus_Success) { assert(false); } while (1) { } } static void TxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { i2s_transfer_t *transfer = userData; __NOP(); // Where is the data located? if (transfer->data == s_Buffer[0]) { // Code never gets here!!!! __NOP(); } else if (transfer->data == s_Buffer[1]) { __NOP(); } } static void RxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData) { i2s_transfer_t *transfer = userData; __NOP(); // Where is the data located? if (transfer->data == s_Buffer[0]) { __NOP(); } else if (transfer->data == s_Buffer[1]) { // Code never gets here...!!!!! __NOP(); } } I2S_TxTransferCreateHandleDMA (Rx) 函数分配用户数据并保持静态,无论哪个缓冲区已填充以生成中断。 是否有我在驱动程序库中没有找到的功能?这应该怎么做?理想情况下,ISR 回调中的用户数据似乎会指向应用程序应该处理的缓冲区。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2135个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
37376 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
6775 浏览 1 评论
7793 浏览 1 评论
7642 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
5071 浏览 0 评论
1556浏览 2评论
关于NINA-W132 Wi-Fi模块SPI通信遇到的疑问求解
1208浏览 2评论
如何在MPC PowerPC MCU上首次刷写后禁用BDM?
749浏览 1评论
将HFREFR和LFREFR寄存器值设置为错误的值来将故障注入CMU,但CMU_ISR值始终为零,为什么?
735浏览 1评论
将SPSDK for FRDM-MCX-W71 SDK与VS一起安装时出现hidapi构建错误怎么解决?
678浏览 1评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 03:38 , Processed in 1.342662 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1725