您好,
我正在开发一个音频应用程序,使用DMA接收和传输立体 声音频数据。 我已在您的音频和aic23b示例中基于我的配置。 n´t能够以这种方式正确地处理和接收数据,但我决定更改接收中断传输大小,因此我不需要等待整个接收才能开始处理数据。 以这种方式对DMA进行的配置如下:
void dma_init(){
EALLOW;
DmaRegs.DMACTRL.bit.hardreset = 1;
ASM (" NOP");
DMARegs.PRIORITYCTRL1.bit.CH1PRIORITY = 0;
// DMA通道1 - McBBSP-A接收
DmaRegs.CH1.burst_size.all = 1; // 2 16位字/连字符(每个RRDY 1个32位字)-内存地址内部被1碰撞
DmaRegs.CH1.SRC_burst_step = 1; //必须先读取DRR2,然后再读取DRR1。 增量为1。 因此,值为+1。 (这是2的C #)
DmaRegs.CH1.DST_STUST_STEP =-1; //将DRR2数据复制到地址N+1,将DRR1数据复制到N Hence -1 (32位读取=将addr N+1读取为MSB,然后将N读取为LSB)
DmaRegs.CH1.transfer_size =(buffer_size>>>1)-1; //这是更改!!! 每 (n+1)个突发中断。 McBSP仅处理16位数据(DRR2和DRR1是16位寄存器)
DmaRegs.CH1.SRC_TRANSFER_STEP =-1;//在处理完突发数据后,将源地址从DRR1重新减至DRR2
DmaRegs.CH1.dst_transfer_step =(buffer_size+1);//复制L-C数据后,在给定缓冲区中向下(向上más bien)移动到R-C数据
DmaRegs.CH1.SRC_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all; //首先从DRR2读取
DmaRegs.CH1.SRC_beG_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all;
DmaRegs.CH1.DST_ADDR_shadow = ping_buffer_offset; //首先写入ping_buffer[1]
DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;
DmaRegs.CH1.dst_wrap_size = 1; //左(1)后,然后右(2)后,返回到左缓冲区
DmaRegs.CH1.SRC_wrap_size = 0xffffff;//垂体大值。 我们永远不会来这里…
DmaRegs.CH1.dst_wrap_step =2;// 从起始地址下移(向上más bien) 2个16位地址以写入nxt 32位字
DmaRegs.CH1.control.bit.PERINTCLR = 1; //清除外设中断,同步和sycn错误标志
DmaRegs.CH1.control.bit.SYNCCLR = 1;
DmaRegs.CH1.control.bit.ERRCLR = 1;
DmaRegs.CH1.mode.bit.CHINTE =1; //通道中断启用
DmaRegs.CH1.MODE.bit.CHINTMODE =0; //在传输开始时生成中断
DmaRegs.CH1.mode.bit.PERINTE =1; //启用外设中断
DMARegs.CH1.MODE.Bit.PERINTSEL = 15; // McBSP MREVTA
DmaRegs.CH1.mode.bit.continuous = 1; //连续模式
// DMA通道2 - McBSPA-A传输
DmaRegs.CH2.burst_size.all = 1; // 2 16位字/连字符(每个XRDY 1个32位字)-值内部被1递增
DmaRegs.CH2.SRC_burst_step =-1; //首先将地址N+1处的数据复制到DXR2,然后将地址N处的数据复制到DXR1。 因此-1
DmaRegs.CH2.DST_STUST_STEP = 1; // DXR2必须先写入,然后写入DXR1。 增量为1。 因此,值为+1。 (这是2的C #)
DmaRegs.CH2.transfer_size =(buffer_size-1); //每1024 (n+1)个16位字中断一次。 McBSP仍然只处理寄存器中的16位数据
DmaRegs.CH2.SRC_transfer_step =(buffer_size+1);//复制L-C数据后,在给定缓冲区中向下移动到R-C数据
DMARegs.CH2.DST_TRANSFER_STEP =-1; //在处理完突发数据后,以1表示目标地址(DXR1返回DXR2)
DmaRegs.CH2.SRC_ADDR_shadow = ping_buffer_offset; //从ping_buffer[1]中首次读取
DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
DmaRegs.CH2.DST_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all; //首先写入DXR2
DmaRegs.CH2.dst_beg_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all;
DmaRegs.CH2.SRC_wrap_size = 1; //左(1)后,右(2)后,返回到左缓冲区
DmaRegs.CH2.dst_wrap_size = 0xffffff; //垂体大值。 我们永远不会来这里…
DmaRegs.CH2.SRC_Wrap步骤=2;// 从起始地址下移2个16位地址,读取下一个32位字
DmaRegs.CH2.control.bit.PERINTCLR = 1; //清除外设中断,同步和同步错误标志
DmaRegs.CH2.control.bit.SYNCCLR = 1;
DmaRegs.CH2.control.bit.ERRCLR = 1;
DmaRegs.CH2.mode.bit.CHINTE =1; //通道中断启用
DmaRegs.CH2.mode.bit.CHINTMODE =0; //在传输开始时生成中断
DmaRegs.CH2.mode.bit.PERINTE =1; //启用外设中断
DmaRegs.CH2.mode.bit.PERINTSEL = 14; // McBSP MXEVTA
DmaRegs.CH2.mode.bit.continuous = 1; //连续模式
EDIS;
EALLOW;
DmaRegs.CH1.control.bit.run = 1; //启动通道1
EDIS;
}
但是,我在接收缓冲区的后半部分时遇到了问题。 那么,该配置是否正确? 是否可以有2个中断用于接收,而有1个中断用于传输? 我希望是这样。
提前感谢
Ignacio