打印

关于TI的DSP中的音频接口mcasp的状态标志位的问题???

[复制链接]
4727|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DSP-ahu|  楼主 | 2011-5-24 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
高手求救:

       我现在用TI 的ti816x系列的DSP进行音频的功能。但是在配置完成mcasp的相关寄存器之后,ACLKX和FS时钟引脚都产生了正确的时钟信号(都是内部分频生成),问题就是XBUF的状态标志位XDATA在发送完一个字节的数据之后就变为了0,就不能变回1了,数据也发不出去。我是按照datasheet上面的初始化步骤进行操作的,不知道问题出在哪里???采用cpu轮询XDATA标志位的方法去发送数据。

设置mcasp的源代码:
mcasp_set_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, 0);  //将所有寄存器的值恢复到default value
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, 0);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_GBLCTLR_REG, 0);

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);

  //mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TLGC_REG,0);     
   
  //mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TLMR_REG ,0);  

  //rx
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_RXMASK_REG,  0x000000ff);  //将mask赋值给txmask寄存器  

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_RXFMT_REG, RXORD);
#ifdef test_EDMA_flag
  mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_RXFMT_REG, RXSEL);   //clr-port data
#else
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_RXFMT_REG, RXSEL);   //set-configure bus      
#endif
  mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_RXFMT_REG,  RXSSZ( 0x03), RXSSZ(0x0F)); //TXSSZ(val)        (val<<4)
  mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_RXFMT_REG,  RXROT(6), RXROT(7));  //mcasp_mod_bitd()的作用就是将fmt所代表的格式放到rxfmt寄存器的第0到第2位  //#define TXROT(val)        (val)

  //mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_RXFMCTL_REG,  FSXMOD(32), FSXMOD(0x1FF));//2-slot TDM (I2S mode) to 32-slot TDM.      选择模式
  //mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_RXFMCTL_REG, FSXDUR);  //P697
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_RXFMCTL_REG, 0x00001003);   //bit1   Internally-generated transmit frame sync.
  //mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_RXFMCTL_REG, FSXPOL);   //P697 A falling edge on transmit frame sync (AFSX) indicates the beginning of a frame.

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); //bit5   Internal transmit clock source from output of programmable bit clock divider.
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);//P698  Falling edge
  //mcasp_set_bits(mcasp_base + DAVINCI_MCASP_ACLKRCTL_REG, TX_ASYNC);//rx和TX的时钟、帧同步都是一致的   P698

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);   //P699 Internal transmit high-frequency clock source from output of programmable high clock divider
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_AHCLKRCTL_REG, 89); //得到2M Hz的时钟

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_RXTDM_REG, 0xFFFFFFFF);

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_RXCLKCHK_REG, 0x00FF0007);

  //tx
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXMASK_REG,  0x000000ff);  //将mask赋值给txmask寄存器  
mcasp_set_bits(mcasp_base + DAVINCI_MCASP_TXFMT_REG, TXORD);
#ifdef  test_EDMA_flag
  mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_TXFMT_REG, TXSEL);   //set-configure bus      //clr-port data
#else
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_TXFMT_REG, TXSEL);   //set-configure bus      //clr-port data
#endif
  mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_TXFMT_REG,  TXSSZ( 0x03), TXSSZ(0x0F)); //TXSSZ(val)        (val<<4)
  mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_TXFMT_REG,  TXROT(6), TXROT(7));  //mcasp_mod_bitd()的作用就是将fmt所代表的格式放到rxfmt寄存器的第0到第2位  //#define TXROT(val)        (val)

  //mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_TXFMCTL_REG,  FSXMOD(32), FSXMOD(0x1FF));//2-slot TDM (I2S mode) to 32-slot TDM.      选择模式
  //mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);  //P697
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_TXFMCTL_REG, 0x00001003);   //bit1   Internally-generated transmit frame sync.
  //mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);   //P697 A falling edge on transmit frame sync (AFSX) indicates the beginning of a frame.

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE); //bit5   Internal transmit clock source from output of programmable bit clock divider.
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);//P698  Falling edge
  mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);//rx和TX的时钟、帧同步都是一致的   P698

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);   //P699 Internal transmit high-frequency clock source from output of programmable high clock divider
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_AHCLKXCTL_REG, 89); //得到2M Hz的时钟

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_TXCLKCHK_REG, 0x00FF0007);

  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_XRSRCTL_REG(0), 0x000D);//串口控制寄存器
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_XRSRCTL_REG(1), 0x0002);//串口控制寄存器

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);  //所有的引脚都作为McASP的功能使用

  //mcasp_set_bits(mcasp_base + DAVINCI_MCASP_PDIR_REG, (0x07 << 26));    //Therefore you must ensure that the clock control register is configured appropriately before you set the pin to be an outpu
  //mcasp_set_bits(mcasp_base + DAVINCI_MCASP_PDIR_REG,AXR(0));   //#define AXR(n)                (1<<n)    相应的AXRn被设置成输出
  mcasp_set_bits(mcasp_base + DAVINCI_MCASP_PDIR_REG, 0xFC000001);  
  
  //mcasp_clr_bits(mcasp_base + DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);  //Transmit data DMA request is enabled.

  //mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_WFIFOCTL, 1,  NUMDMA_MASK);  //0xFF  //P709  Write word count per transfer (32-bit words)
  //mcasp_mod_bits(mcasp_base + DAVINCI_MCASP_WFIFOCTL, (1 << 8), NUMEVT_MASK);        
  //mcasp_set_bits(mcasp_base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); //0xFF00 P709 Write word count per DMA event (32-bit)

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXDITCTL_REG , 0);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_LBCTL_REG , 0);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_AMUTE_REG , 0);

mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST); //9    8.2.10.2.3a
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, RXHCLKRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXHCLKRST);

  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, RXCLKRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXCLKRST);
  
#ifdef test_EDMA_flag
  result = ys_tdm_dma_request(&test_dma_params);  //edma初始化
  if(result)
    printk("The channel or slot request failed\n\n");

  edma_start(test_tdm_data->asp_channel);
#endif

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_RXSTAT_REG, 0x0000FFFF);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXSTAT_REG, 0x0000FFFF);

  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);  //10   8.2.10.2.6b
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, RXSERCLR);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXSERCLR);
      
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXBUF_REG, 0);

  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);   //11  //8.2.10.2.8a  状态机复位
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, RXSMRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXSMRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);   //12  //8.2.10.2.9a  FS Clock Reset
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, RXFSRST);  
  mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXFSRST);  

  //mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXBUF_REG, 0);

  while(!(mcasp_get_reg(mcasp_base + DAVINCI_MCASP_XRSRCTL_REG(0)) & TXSTATE));

  //printk("the txstate == 0x%04d\n\n",mcasp_get_reg(mcasp_base + DAVINCI_MCASP_XRSRCTL_REG(0)));
        
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXBUF_REG, 0);

相关帖子

沙发
思行合一| | 2011-5-24 20:39 | 只看该作者
你把整个工程发一下吧

使用特权

评论回复
板凳
cbas| | 2011-5-25 10:09 | 只看该作者
高手在哪呢,我也等着呢

使用特权

评论回复
地板
dolido| | 2011-5-25 10:43 | 只看该作者
有点乱啊

使用特权

评论回复
5
DSP-ahu|  楼主 | 2011-5-26 18:00 | 只看该作者
我把我的初始化代码重新整理了一下:
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, 0);  //将所有寄存器的值恢复到default value
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, 0);

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);

  
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXMASK_REG,  0xffffffff);  //将mask赋值给txmask寄存器  

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXFMT_REG, 0x00018078);

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXFMCTL_REG, 0x00000103);   //bit1   Internally-generated transmit frame sync.


  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_ACLKXCTL_REG, 0x000000cb); //bit5   Internal transmit clock source from output of programmable bit clock divider.


  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_AHCLKXCTL_REG, 0x00000001);   //P699 Internal transmit high-frequency clock source from output of programmable high clock divider


  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXTDM_REG, 0x00000003);

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_EVTCTLX_REG, 0x00000000);

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXCLKCHK_REG, 0x00FF0008);

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_XRSRCTL_REG(0), 0x00000001);//串口控制寄存器

  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);  //所有的引脚都作为McASP的功能使用


  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_PDIR_REG, 0x14000001);  


  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXDITCTL_REG , 0);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_LBCTL_REG , 0);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_AMUTE_REG , 0);

mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST); //9    8.2.10.2.3a
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXCLKRST);
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXCLKRST);
  mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);


mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);  //10   8.2.10.2.6b
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXSERCLR);  //10   8.2.10.2.6b

mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXBUF_REG, 0);

mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXSMRST);
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);  
mcasp_set_ctl_reg(mcasp_base + DAVINCI_MCASP_GBLCTL_REG, TXFSRST);


while(!(mcasp_get_reg(mcasp_base + DAVINCI_MCASP_XRSRCTL_REG(0)) & TXSTATE));

mcasp_set_reg(mcasp_base + DAVINCI_MCASP_TXBUF_REG, 0);

这就是整个的初始化过程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝