This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8335万:乒乓球缓冲,半缓冲问题

Guru**** 2564565 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/640375/tms320f28335-ping-pong-buffering-half-buffering-problem

部件号:TMS320F2.8335万

您好,

我正在开发一个音频应用程序,使用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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ignacio,

    我找不到您提到的原始示例,所以我不清楚您所做的更改。 您是否基本上将传输大小减半? 在传输开始时,它会将传输地址重置回起始地址。 您是否正在ISR中执行某些操作来切换开始地址,以便它继续填充缓冲区的下半部分而不是重新启动?

    或者,我完全误解了您要做的事情吗?

    谢谢!
    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正确地理解了这一点。 我未正确更新ISR中的传输地址。 现在它开始工作了。

    谢谢!