TMS320VC5509A将MCBSP接口配置成I2S主模式与TLV320AIC23B进行通信(二)

      如果有问题,请加QQ群 891339868 进行交流

      由于前一段时间比较忙,博客给荒废了,今天忙里偷闲,继续来说这个话题。具体的工作流程和工作原理已经在TMS320VC5509A通过MCBSP接口与NUC972的IIS接口进行音频传输(二)这个里面说个差不多了,只是在那片博客中没有说具体的主从模式还有代码,今天说的是DSP5509A的MCBSP作为主模式,AIC23B作为从模式,这次废话不多说了,直接上代码:

                             MCBSP_SPCR1_RMK
                             (
                                     MCBSP_SPCR1_DLB_OFF,                   
                                     MCBSP_SPCR1_RJUST_LZF,                 
                                     MCBSP_SPCR1_CLKSTP_DISABLE,            
                                     MCBSP_SPCR1_DXENA_ON,                  
                                     MCBSP_SPCR1_ABIS_DISABLE,              
                                     MCBSP_SPCR1_RINTM_RRDY,               
                                     MCBSP_SPCR1_RSYNCERR_NO,                                   
                                     MCBSP_SPCR1_RRST_DISABLE
                             ),
                             MCBSP_SPCR2_RMK
                             (
                                     MCBSP_SPCR2_FREE_NO,                  
                                     MCBSP_SPCR2_SOFT_NO,                   
                                     MCBSP_SPCR2_FRST_FSG,                  
                                     MCBSP_SPCR2_GRST_CLKG,                
                                     MCBSP_SPCR2_XINTM_XRDY,               
                                     MCBSP_SPCR2_XSYNCERR_NO,                                     
                                     MCBSP_SPCR2_XRST_DISABLE              
                             ),
                             /*双数据相,接受数据长度为16位,每相1个数据*/
                             MCBSP_RCR1_RMK
                             (
                                     MCBSP_RCR1_RFRLEN1_OF(0),              
                                     MCBSP_RCR1_RWDLEN1_16BIT               
                             ),
                             MCBSP_RCR2_RMK
                             (
                                     MCBSP_RCR2_RPHASE_DUAL,              
                                     MCBSP_RCR2_RFRLEN2_OF(0),              
                                     MCBSP_RCR2_RWDLEN2_16BIT,              
                                     MCBSP_RCR2_RCOMPAND_MSB,               
                                     MCBSP_RCR2_RFIG_NO,                    
                                     MCBSP_RCR2_RDATDLY_1BIT               
                             ),
                             MCBSP_XCR1_RMK
                             (
                                     MCBSP_XCR1_XFRLEN1_OF(0),              
                                     MCBSP_XCR1_XWDLEN1_16BIT              
                             ),
                             MCBSP_XCR2_RMK
                             (
                                     MCBSP_XCR2_XPHASE_DUAL,              
                                     MCBSP_XCR2_XFRLEN2_OF(0),              
                                     MCBSP_XCR2_XWDLEN2_16BIT,               
                                     MCBSP_XCR2_XCOMPAND_MSB,              
                                     MCBSP_XCR2_XFIG_NO,                   
                                     MCBSP_XCR2_XDATDLY_1BIT                
                             ),
                             MCBSP_SRGR1_RMK
                             (
                                     MCBSP_SRGR1_FWID_OF(15),
                                     MCBSP_SRGR1_CLKGDV_OF(47)
                             ),
                             MCBSP_SRGR2_RMK
                             (
                                     MCBSP_SRGR2_GSYNC_FREE,
                                     MCBSP_SRGR2_CLKSP_FALLING,
                                     MCBSP_SRGR2_CLKSM_CLKS,
                                     MCBSP_SRGR2_FSGM_FSG,
                                     MCBSP_SRGR2_FPER_OF(31)
                             ),
                             MCBSP_MCR1_DEFAULT,
                             MCBSP_MCR2_DEFAULT,
                             MCBSP_PCR_RMK
                             (
                                     MCBSP_PCR_IDLEEN_RESET,                 
                                     MCBSP_PCR_XIOEN_SP,                    
                                     MCBSP_PCR_RIOEN_SP,                    
                                     MCBSP_PCR_FSXM_INTERNAL,                
                                     MCBSP_PCR_FSRM_INTERNAL,                
                                     MCBSP_PCR_CLKXM_OUTPUT,                  
                                     MCBSP_PCR_CLKRM_OUTPUT,                  
                                     MCBSP_PCR_SCLKME_BCLK,                    
                                     0,                                     
                                     MCBSP_PCR_FSXP_ACTIVELOW,             
                                     MCBSP_PCR_FSRP_ACTIVELOW,             
                                     MCBSP_PCR_CLKXP_FALLING,               
                                     MCBSP_PCR_CLKRP_FALLING                  
                             ),
                             MCBSP_RCERA_DEFAULT,
                             MCBSP_RCERB_DEFAULT,
                             MCBSP_RCERC_DEFAULT,
                             MCBSP_RCERD_DEFAULT,
                             MCBSP_RCERE_DEFAULT,
                             MCBSP_RCERF_DEFAULT,
                             MCBSP_RCERG_DEFAULT,
                             MCBSP_RCERH_DEFAULT,
                             MCBSP_XCERA_DEFAULT,
                             MCBSP_XCERB_DEFAULT,
                             MCBSP_XCERC_DEFAULT,
                             MCBSP_XCERD_DEFAULT,
                             MCBSP_XCERE_DEFAULT,
                             MCBSP_XCERF_DEFAULT,
                             MCBSP_XCERG_DEFAULT,
                             MCBSP_XCERH_DEFAULT

下面解释一下上面代码的意思:

MCBSP_SPCR1_RMK:这个是代表MCBSP的SPCR1的寄存器,这个里面主要要注意配置数据的左对齐模式,即MCBSP_SPCR1_RJUST_LZF;

MCBSP_SPCR2_RMK:这个代表MCBSP的SPCR2的寄存器,主要是和服务和软件仿真中断有关,这里不细说了,按这个配置就行,有兴趣的话可以产看DSP5509A的MCBSP的开发文档;

MCBSP_RCR1_RMK:这个代表MCBSP的RCR1的寄存器,即是控制寄存器1,这个主要是配置接收数据的每相的数据的个数和数据长度,I2S模式必须配置成每相1个数据,数据是16位的;

MCBSP_RCR2_RMK:这个代表MCBSP的PCR2的寄存器,即是控制寄存器2,MCBSP_RCR2_RPHASE_DUAL代表是双数据相,MCBSP_RCR2_RFRLEN2_OF(0)代表第二相数据每相一个数据,MCBSP_RCR2_RWDLEN2_16BIT代表每个数据是16位长度,MCBSP_RCR2_RCOMPAND_MSB代表高位先接收,MCBSP_RCR2_RFIG_NO代表忽略同步信号,这是因为在主模式下,同步信号是自己产生的,MCBSP_RCR2_RDATDLY_1BIT代表接收数据比同步信号延迟一位;

MCBSP_XCR1_RMK与MCBSP_XCR2_RMK寄存器代表MCBSP发送控制寄存器,他们和接收控制寄存器配置基本一样,这里就不详细说了,可以参考接收寄存器配置的解释;

下面详细说一下采样时钟相关的两个寄存器:MCBSP_SRGR1_RMK与MCBSP_SRGR2_RMK;

首先看一下MCBSP_SRGR1_RMK:

这个寄存器包含两个field,一个是FWID,一个是CLKGDV;

CLKGDV是配置生成的采样时钟对于输入时钟的分频倍数,CLKG = (Input clock frequency)/(CLKGDV + 1);

我这里配置的是双声道数据,数据位宽为16位,采样率是8Khz,输入时钟是12.288M,所以:

采样时钟 CLKG = 2*16*8000 = 256000;

这样根据上面的公式很容易的计算出:

CLKGDV = 47 ;

所以配置成MCBSP_SRGR1_CLKGDV_OF(47) ;

FWID是配置同步脉冲的宽度,同步脉冲的宽度=(FWID+1);

因为在I2S模式下,MCBSP使用同步信号模拟I2S的左右声道切换(WS)信号,所以同步脉冲的宽度应该为单个声道的数据位宽,所以(FWID+1)= 16,FWID配置成15就OK了。

.接着看一下MCBSP_SRGR2_RMK:

这个寄存器包含五个field:

第一个是GSYNC:时钟同步标志,如果是外部接收的同步信号,可以是能该位,周期的进行同步,因为我这里是自己产生的同步信号,所以不需要同步;

第二个是CLKSP:CLKSP引脚电平极性设置,DSP5509A没有这个脚,所以不考虑;

第三个是CLKSM:采样时钟输入选择位,这个标志和寄存器MCBSP_PCR_RMK的SCLKME标志共同决定产生采样时钟的输入时钟选择,如可以参考下图:

我这里使用的是CLKR引脚上的信号,所以CLKSM配置为0,SCLKME配置为1。

第四个是FSGM:发送数据同步信号模式选择位,这里面配置为1,自己定义同步信号;

第五个是FPER:同步信号间隔设置位。FPER+1 = 两个同步信号之间的宽度,在I2S模式下,两个同步信号的宽度正好是WS信号的周期,所以FPER+1=32,FPER = 31,所以这里配置成MCBSP_SRGR2_FPER_OF(31);

下面一个比较重要的寄存器是引脚控制寄存器MCBSP_PCR_RMK:

这个寄存器包含的内容比较多,我一个一个来解释一下:

IDLEEN:配置idle模式,这里不需要;

XIOEN:发送IO口模式选择位,0:CLKX、FSX、DX、CLKS都为串口端口的pin;1:它们都为GPIO口,这里配置为0;

RIOEN:接口IO口模式选择位,与XIOEN设置相同;这里配置为0;

FSXM:发送同步信号模式选择位,0:同步信号从外部接收;1:同步信号内部产生;这里我们是内部产生的同步信号,所以配置为1;

FSRM:接收同步信号模式选择位,同上,我们这里配置为1;

CLKXM:发送时钟模式选择位,0:外部输入,时钟从CLKX引脚上接收;1:内部产生,时钟从CLKX引脚上输出;因为我们是内部产生发送和接收时钟,所以这里配置成1;

CLKRX:接收时钟模式选择位,0:外部输入,时钟从CLKR引脚上接收;1:内部产生,时钟从CLKR引脚上输出;这里需要需要注意一下,虽然我们的MCBSP原始时钟是从CLKR引脚上的来的,但是接收时钟是从内部产生的,所以这里必须也要配置成输出,即1,但是CLKR这个引脚实际并不输出接收时钟;

SCLKME:采样时钟输入选择位,这个标志和寄存器MCBSP_SRGR2_RMK的CLKSM标志共同决定产生采样时钟的输入时钟选择,可以参考上图进行理解;

CLKSSTAT:DSP5509A没有CLKS这个引脚,不考虑;

 

好了,说到这里,MCBSP配置成I2S主模式的硬件和软件都说完了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值