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

 

 

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