找回密码
 立即注册

微信扫码登录

查看: 528|回复: 4

[Audio] [求助]audio使用DMA链怎么让一个buf满的时候产生中断

[复制链接]

1

主题

2

回帖

19

积分

新手上路

积分
19
发表于 2024-8-23 16:01:44 | 显示全部楼层 |阅读模式
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: TLSR9517C 开发板
驱动SDK版本: telink_b91m_driver_sdk V2.3.0.
程序目的是将输入的音频数据从rx buf取出,做一定处理后,放到tx buf播放

使能收发的DMA中断后,不会进入中断dma_irq_handler,初始化代码如下
dma_chain_config_t tx_dma_list_config[2];
dma_chain_config_t rx_dma_list_config[2];
signed short       AUDIO_TX_DMA_BUFF[2][AUDIO_BUFF_SIZE] __attribute__((aligned(4)));
signed short       AUDIO_RX_DMA_BUFF[2][AUDIO_BUFF_SIZE] __attribute__((aligned(4)));



_attribute_ram_code_sec_ void dma_irq_handler(void)
{
    COMM_DEBUG_D("\n");
}
PLIC_ISR_REGISTER(dma_irq_handler, IRQ_DMA)



static void s_audio_init(void)
{

    core_interrupt_enable();
    plic_interrupt_enable(IRQ_DMA);
    dma_set_irq_mask(TX_DMA_CHN, TC_MASK);
    dma_set_irq_mask(RX_DMA_CHN, TC_MASK);


    audio_init(LINE_IN_TO_BUF_TO_LINE_OUT, AUDIO_16K, STEREO_BIT_16);
    audio_rx_dma_config(RX_DMA_CHN, (unsigned short *)(&AUDIO_RX_DMA_BUFF[0]), AUDIO_BUFF_SIZE, &rx_dma_list_config[0]);
    audio_rx_dma_add_list_element(&rx_dma_list_config[0], &rx_dma_list_config[1],
                                  (unsigned short *)(&AUDIO_RX_DMA_BUFF[0]), AUDIO_BUFF_SIZE);
    audio_rx_dma_add_list_element(&rx_dma_list_config[1], &rx_dma_list_config[0],
                                  (unsigned short *)(&AUDIO_RX_DMA_BUFF[1]), AUDIO_BUFF_SIZE);

    audio_tx_dma_config(TX_DMA_CHN, (unsigned short *)(&AUDIO_TX_DMA_BUFF[0]), AUDIO_BUFF_SIZE, &tx_dma_list_config[0]);
    audio_tx_dma_add_list_element(&tx_dma_list_config[0], &tx_dma_list_config[1],
                                  (unsigned short *)(&AUDIO_TX_DMA_BUFF[0]), AUDIO_BUFF_SIZE);
    audio_tx_dma_add_list_element(&tx_dma_list_config[1], &tx_dma_list_config[0],
                                  (unsigned short *)(&AUDIO_TX_DMA_BUFF[1]), AUDIO_BUFF_SIZE);

    audio_rx_dma_en();
    audio_tx_dma_en();

    // plic_set_pending(IRQ_DMA); // 手动触发是可以进入中断的
}



只能轮询对数据做处理,怎样才能在每个fifo的数据满的时候产生中断
_attribute_ram_code_sec_ void audio_data_fifo(void)
{
    unsigned int rx_wptr = audio_get_rx_dma_wptr(RX_DMA_CHN);

    if (rx_wptr == (unsigned int)(&AUDIO_RX_DMA_BUFF[0][0])) {
        memcpy(&AUDIO_TX_DMA_BUFF[1][0], &AUDIO_RX_DMA_BUFF[1][0], AUDIO_BUFF_SIZE);
    } else if (rx_wptr == (unsigned int)(&AUDIO_RX_DMA_BUFF[1][0])) {
        memcpy(&AUDIO_TX_DMA_BUFF[0][0], &AUDIO_RX_DMA_BUFF[0][0], AUDIO_BUFF_SIZE);
    }
}


void bsp_audio_loop(void)
{
    audio_data_fifo();
}



1

主题

2

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-23 16:04:31 | 显示全部楼层
补充:上述代码几个宏的定义
  1. #    define AUDIO_BUFF_SIZE (4 * 1024)
  2. #    define RX_DMA_CHN      DMA2
  3. #    define TX_DMA_CHN      DMA3
  4. #    define COMM_DEBUG_D printf
复制代码

1

主题

2

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-23 17:01:05 | 显示全部楼层
本帖最后由 该起床了1111 于 2024-8-23 17:02 编辑

看开发手册看到了,B91 audio没有中断
Snipaste_2024-08-23_17-02-29.jpg

0

主题

2

回帖

30

积分

版主

积分
30
发表于 2024-9-4 14:44:40 | 显示全部楼层
你好,如文档描述,TLSR9517 是不支持在fifo的数据满的时产生中断的。

2

主题

15

回帖

109

积分

版主

积分
109
发表于 2024-9-20 13:40:46 | 显示全部楼层
B91没这个功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2024-10-30 09:34 , Processed in 0.103623 second(s), 24 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表