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,但只有真正使能后的通道才有相应的硬件动作
CPU或DMA控制器从DRR2和DRR1读取接收数据。McBSP支持8位、12位、16位、20位、24位、32位的字长。当字长等于或小于16位,只是用DRR1;当字长超过16位,DRR1存放低16位,DRR2存放其余数据位。
DRR1和DRR2位I/0映射寄存器,可以通过访问I/O空间来访问该寄存器。
发送数据时,CPU或DMA控制器从DXR2和DXR1读取接收数据。当字长等于或小于16位,只是用DRR1;当字长超过16位,DRR1存放低16位,DRR2存放其余数据位。
DXR1和DXR2位I/0映射寄存器,可以通过访问I/O空间来访问该寄存器。
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 |
发送器复位 |
位 |
字段 |
复位值 |
说明 |
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信号帧同步周期数 |
位 |
字段 |
说明 |
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 |
接收时钟极性 |
位 |
字段 |
复位值 |
说明 |
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 |
接收(发送)数据延时 |
位 |
字段 |
说明 |
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
),
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