高手求救:
我现在用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); |
|