- 概述
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寄存器
- 數據接收寄存器(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空間來訪問該寄存器。
- 數據發送寄存器(DXR1和DXR2)
發送數據時,CPU或DMA控制器從DXR2和DXR1讀取接收數據。當字長等於或小於16位,只是用DRR1;當字長超過16位,DRR1存放低16位,DRR2存放其餘數據位。
DXR1和DXR2位I/0映射寄存器,可以通過訪問I/O空間來訪問該寄存器。
- 串口控制寄存器(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 |
發送器復位 |
- 採樣率發生寄存器(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信號幀同步週期數 |
- 引腳控制寄存器(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 |
接收時鐘極性 |
- 接收控制寄存器(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 |
接收(發送)數據延時 |
- 多通道控制寄存器(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