TI DSP McBSP DMA

  • 概述

5509的McBSP具有

.双缓冲发送,三缓冲接收,支持连续的数据流

.支持全双工通信;

.支持独立的(由内部产生或外部输入的)收发时钟信号(CLKX、CLKR)和帧信号(FSX、FSR);

.128通道时分复用;

.支持DMA触发事件和中断触发;

.传输字的长度(字长)可以是8、12、16、20、24、32位,一次可传输1~128个字(帧长);

.支持数据压缩和符号扩展功能;McBSP引脚可设置位通用IO口。

McBSP可以配置成的模式包括:GPIO模式、SPI模式、I2S模式、多通道模式。
     关于多通道
        多通道一般用作时分复用,帧长指定一次传输应该传输多少个字,等同于传输给多少个通道(每个通道可以接收一个字)。由于传输顺序默认从通道1~通道128,且通道使能是可以自定义的,因此帧长度设置必须大于或等于已经使能的通道中最大的通道号。例如:我使能了第0、15、39通道,McBSP一帧内将接收39个字,现在开始传输字0、字2……字N,McBSP通道0接收字0,通道15接收字15,通道39接收字39,但只有真正使能后的通道才有相应的硬件动作

  • McBSP寄存器
  1. 数据接收寄存器(DRR1和DRR2)

CPU或DMA控制器从DRR2和DRR1读取接收数据。McBSP支持8位、12位、16位、20位、24位、32位的字长。当字长等于或小于16位,只是用DRR1;当字长超过16位,DRR1存放低16位,DRR2存放其余数据位。

DRR1和DRR2位I/0映射寄存器,可以通过访问I/O空间来访问该寄存器。

  1. 数据发送寄存器(DXR1和DXR2)

发送数据时,CPU或DMA控制器从DXR2和DXR1读取接收数据。当字长等于或小于16位,只是用DRR1;当字长超过16位,DRR1存放低16位,DRR2存放其余数据位。

DXR1和DXR2位I/0映射寄存器,可以通过访问I/O空间来访问该寄存器。

  1. 串口控制寄存器(SPCR1和SPCR2)

SPCR1

字段

复位值

说明

15

DLB

0

数字回环模式使能

14~13

RJUST

00

接收数据符号扩展和调整方式

12~11

CLKSTP

00

时钟停止模式

10~8

Rsvd

 

保留

7

DXENA

0

DX引脚延时使能

6

Rsvd

0

保留

5~4

RINTM

00

接收中断模式

3

RSYNCERR

0

接收帧同步错误标志

2

RFULL

0

接收过速错误标志

1

RRDY

0

接收就绪标志

0

RRST

0

接收器复位

 

 

SPCR2

 

字段

复位值

说明

15~10

Rsvd

0

保留

9

FREE

00

自由运行

8

SOFT

00

软停止

7

FRST

0

帧同步逻辑复位

6

GRST

0

采样率发生器复位

5~4

XINTM

00

发送中断模式

3

XSYNCERR

0

发送帧同步错误标志

2

XEMPTY

0

发送寄存器空标志

1

XRDY

0

发送就绪标志

0

XRST

0

发送器复位

 

 

  1. 采样率发生寄存器(SRGR1和SRGR2)

 

字段

复位值

说明

15~8

FWID

00000000

帧同步信号FSG的脉冲宽度

7~0

CLKGDV

00000001

输出时钟信号CLKG的分频值

 

字段

复位值

说明

15

GSYNC

0

时钟同步模式

14

CLKSP

0

CLKS引脚极性

13

CLKSM

1

采样率发生器时钟源选择

12

FSGM

0

采样率发生器发送帧同步模式

11~0

FPER

0

FSG信号帧同步周期数

  1. 引脚控制寄存器(PCR)

 

 

字段

说明

15

Rsvd

保留

14

IDLEEN

省电使能

13

XIOEN

发送GPIO使能

12

RIOEN

接收GPIO使能

11

FSXM

发送帧同步模式,0由FSX引脚提供,1由McBSP引脚

10

FSRM

接收帧同步模式,0由FSR引脚提供,1由SRG提供

9

CLKXM

发送时钟模式

8

CLKRM

接收时钟模式

7

SCLKME

采样率发生器时钟源模式

6

CLKSSTAT

CLKS引脚上的电平,0低电平,1高电平

5

DXSTAT

DX引脚上的电平

4

DRSTAT

DR引脚上的电平

3

FSXP

发送帧同步信号

2

FSRP

接收帧同步信号

1

CLKXP

发送时钟极性

0

CLKRP

接收时钟极性

 

 

 

  1. 接收控制寄存器(RCR1和RCR2)和发送控制寄存器(XCR1和XCR2)

字段

复位值

说明

15

Rsvd

0

保留

14~8

R(X)FRLEN1

0

接收(发送)阶段1的帧长(1-128)个字

7~5

R(X)WDLEN1

0

接收(发送)阶段1的字长

4~0

Rsvd

0

保留

 

字段

复位值

说明

15

R(X)PHASE

0

接收(发送)帧的阶段数

14~8

R(X)FRLEN2

0

接收(发送)阶段2的帧长

7~5

R(X)WDLEN2

0

接收(发送)阶段2的字长

4~3

R(X)COMPAND

0

接收(发送)数据压扩模式

2

R(X)FIG

0

忽略不期望的收(发)的帧同步信号

1~0

R(X)DATDLY

0

接收(发送)数据延时

 

  1. 多通道控制寄存器(MCR1和MCR2)

字段

说明

15~10

Rsvd

保留

9

RMCME

接收多通道使能,0使能32个通道,1使能128个通道

8~7

RPBBLK

接收部分B块的通道使能

6~5

RPABLK

接收部分A块的通道使能

4~2

RCBLK

接收部分的当前块,表示正在接收的是哪个块的16个通道

1

Rsvd

保留

0

RMCM

接收多通道选择,0使能128个通道,1使能选定的通道

 

字段

说明

15~10

Rsvd

保留

9

XMCME

发送多通道使能,0使能32个通道,1使能128个通道

8~7

XPBBLK

发送部分B块的通道使能

6~5

XPBLK

发送部分A块的通道使能

4~2

XCBLK

发送部分的当前块,表示正在发送的是哪个块的16个通道

1~0

XMCM

发送多通道选择,使能全部通道或使能选定的通道

 

 

 

 

 

  • 使用举例

MCBSP_Handle g_hMcbsp1;    //定义McBSP的句柄

/*McBSP set,we use mcbsp1 to send and recieve the data between DSP and M82318G-12*/

MCBSP_Config Mcbsp1Config = {

  MCBSP_SPCR1_RMK(

    MCBSP_SPCR1_DLB_OFF,           /* DLB = 0,禁止自闭环方式 */

    MCBSP_SPCR1_RJUST_LZF,          /* RJUST = 2左对齐,零填充LSBs */

    MCBSP_SPCR1_CLKSTP_DISABLE,     /* CLKSTP = 0 */

    MCBSP_SPCR1_DXENA_ON,         /* DXENA = 1 DX引脚延时使能 */

    MCBSP_SPCR1_ABIS_DISABLE,       /* ABIS = 0 */

    MCBSP_SPCR1_RINTM_FRM,      /* RINTM = 2,表示当每一个接收帧同步信号时,MCBSP发送RTIN中断请求给CPU*/

    0,                              /* RSYNCER = 0 */

    MCBSP_SPCR1_RRST_DISABLE        /* RRST = 0,复位MCBSP的接收器 */

   ),

    MCBSP_SPCR2_RMK(

    MCBSP_SPCR2_FREE_YES,           /* FREE = 1,当有一个仿真暂停事件时,MCBSP发                                                                                   送和接收仍然继续进行 */

    MCBSP_SPCR2_SOFT_YES,           /* SOFT = 1,与FREE==0有关 */

    MCBSP_SPCR2_FRST_RESET,         /* FRST = 0,当内部产生帧同步信号时,FRST=0表                                                                                             示复位帧同步逻辑*/

    MCBSP_SPCR2_GRST_RESET,          /* GRST = 0,与使用内部时钟有关,此处不用*/

    MCBSP_SPCR2_XINTM_FRM,          /* XINTM = 2,表示当每一个发送帧同步信号FS                                                                                                                                 时,MCBSP发送XTIN中断请求给CPU*/

    0,                                 /* XSYNCER = N/A */          

    MCBSP_SPCR2_XRST_DISABLE          /* XRST = 0,复位MCBSP的发送器 */

   ),

   /*单数据相,接受数据长度为8位,每相32个数据(即32个时隙)*/

  MCBSP_RCR1_RMK(

       MCBSP_RCR1_RFRLEN1_OF(31),   /* RFRLEN1 = 32,接收阶段1的帧长为31+1=32个字*/

       MCBSP_RCR1_RWDLEN1_8BIT       /* RWDLEN1 = 0(8bit),接收阶段1的字长为8bit */

  ),

  MCBSP_RCR2_RMK(   

    MCBSP_RCR2_RPHASE_SINGLE,      /* RPHASE  = 0,接收帧的阶段数为1 */

    MCBSP_RCR2_RFRLEN2_OF(0),      /* RFRLEN2 = 0,接收阶段2的帧长,此处不用 */

    MCBSP_RCR2_RWDLEN2_8BIT,    /* RWDLEN2 = 0,接收阶段1的字长为8bit,此处不用*/

    MCBSP_RCR2_RCOMPAND_ULAW,  /* RCOMPAND = 2(U-Law),接收数据的压扩模式为                                                                                                                          U-Law MCBSP_RCR2_RCOMPAND_ULAW*/

    MCBSP_RCR2_RFIG_NO,         /* RFIG = 0,当检测到不合法的接收帧同步信号时,                                                                                                                                      选择忽略,继续进行接收数据*/

    MCBSP_RCR2_RDATDLY_2BIT       /* RDATDLY = 2,延时2bit,如果FS和时隙31的bit0同时在时钟下降沿采样时,会出现这样的情况,RRDY先产生还是FS的中断先产生,比较随机,因此延时2bit,不会出现这样的情况*/

    ), 

  /*单数据相,发送数据长度为8位,每相32个数据(即32个时隙)*/

  MCBSP_XCR1_RMK(   

    MCBSP_XCR1_XFRLEN1_OF(31),   /* XFRLEN1 = 31,发送阶段1的帧长为31+1=32个字 */

    MCBSP_XCR1_XWDLEN1_8BIT    /* XWDLEN1 = 0(8bit),发送阶段1的字长为8bit  */

   

 ),  

 MCBSP_XCR2_RMK(  

    MCBSP_XCR2_XPHASE_SINGLE,   /* XPHASE  = 0,发送帧的阶段数为1 */

    MCBSP_XCR2_XFRLEN2_OF(0),   /* XFRLEN2 = 0,发送阶段2的帧长,此处不用 */

    MCBSP_XCR2_XWDLEN2_8BIT,   /* XWDLEN2 = 0 ,发送阶段1的字长为8bit,此处不用 */

    MCBSP_XCR2_XCOMPAND_ULAW,   /* XCOMPAND = 2(U-Law),发送数据的压扩模式为                                                                                   U-Law MCBSP_XCR2_XCOMPAND_ULAW*/

    MCBSP_XCR2_XFIG_NO,        /* XFIG = 0,当检测到不合法的发送帧同步信号时,                                                                                          选择忽略,继续进行发送数据 */

    MCBSP_XCR2_XDATDLY_1BIT    /* XDATDLY = 1,延时1bit才可以与M82318CPU的接收时序匹配,手册Page182<c300datasheet.pdf>Page120<TMS320VC5509A Data Sheet (Rev. B).pdf>*/

  ),           

 MCBSP_SRGR1_DEFAULT,

 MCBSP_SRGR2_DEFAULT, 

 MCBSP_MCR1_DEFAULT,

 MCBSP_MCR2_DEFAULT,

 MCBSP_PCR_RMK(

   MCBSP_PCR_IDLEEN_RESET,  /* IDLEEN = 0,省电模式,当PERIPH空闲时,MCBSP仍然运行*/

   MCBSP_PCR_XIOEN_SP,   /* XIOEN = 0,发送I/O使能CLKX,FSX, DX,CLKS pins are serialpins*/

   MCBSP_PCR_RIOEN_SP,   /* RIOEN = 0,接收I/O使能CLKR, FSR, DR,CLKS pins are serial*/

   MCBSP_PCR_FSXM_EXTERNAL,  /* FSXM = 0,由引脚FSX提供发送帧同步信号*/

   MCBSP_PCR_FSRM_EXTERNAL,  /* FSRM = 0,由引脚FSX提供接收帧同步信号*/

   MCBSP_PCR_CLKXM_INPUT,    /* CLKXM = 0,通过CLKX引脚有外部提供发送时钟信号*/

   MCBSP_PCR_CLKRM_INPUT,    /* CLKRM = 0,通过CLKR引脚有外部提供接收时钟信号*/

   MCBSP_PCR_SCLKME_NO,      /* SCLKME = 0,此处不考虑*/

   0,                          /* DXSTAT = N/A*/

   MCBSP_PCR_FSXP_ACTIVEHIGH,  /* FSXP = 0,发送帧同步信号的极性为高电平有效*/

   MCBSP_PCR_FSRP_ACTIVEHIGH,  /* FSRP = 1,接收帧同步信号的极性为高电平有效*/

   MCBSP_PCR_CLKXP_RISING,     /* CLKXP= 0,时钟的上升沿发送数据*/

   MCBSP_PCR_CLKRP_FALLING     /* CLKRP= 0,时钟的下降沿接收数据*/

 ),

 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

}; 

 

 

g_hMcbsp1 = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);

MCBSP_config(g_hMcbsp1,&Mcbsp1Config);//设置McBSP1

 /*启动McBSP1*/

 MCBSP_start(g_hMcbsp1,MCBSP_RCV_START | MCBSP_XMIT_START,0); 

IRQ_plug(IRQ_EVT_RINT1,&Mcbsp_Recv_Framesync_Isr); //MCBSP1 receive interrupt

IRQ_enable(IRQ_EVT_RINT1);                                     // Enable MCBSP1 receive interrupt

IRQ_clear(IRQ_EVT_RINT1);                                         // Clear any pending MCBSP1 receiver interrupts

IRQ_globalEnable();                                                                  // Enable Global IRQ

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章