DSP

dsp McBSP模块

2019-07-13 10:12发布

McBSP,是多通道缓冲串行接口。在DSP嵌入式系统中,常常用来连接音频编码解码芯片,串行AD/DA器件等。具有如下特性: 全双工; 两个数据缓冲寄存器; 独立的发送和接收帧和时钟; 多达129通道的发送和接收等等。 McBSP结构图如下:
首先对引脚进行介绍: CLKR:接收时钟 CLKX:发送时钟 CLKS:外部时钟源 DR“:串行数据接收 DX:串行数据发送 FSR:接收同步帧 FSX:发送同步帧 注意到接收部分是三重缓冲,发送部分是两重缓冲。
接下来介绍它的相关寄存器: DRR:数据接收寄存器,存放接收到的数据。 DXR:数据发送寄存器,存放将要发送的数据。 SPCR:串行接口控制寄存器,配置串行接口,包括状态控制字位,可得知工作状态,分为SPCR1和SPCR2,分别是收和发。 RCR:接收控制寄存器,设置接收操作的参数。 XCR:发送控制寄存器,设置发送操作的参数。 SRGR:设置波特率相关。 MCR:多通道控制寄存器,设置多通道选择模式。也是分收、发两个。 RCER:接收通道使能寄存器,分A/B区,使能奇偶组的16个通道可选。 XCER:发送通道使能寄存器,同上。 PCR:引脚控制寄存器,配置串口作用,和SPCR配合。
这里有必要弄懂什么是多通道?当初是纠结了很久。 这个多通道不是AD采样器那个多通道,而是类似于时分复用的数据流,强调时隙的概念。128个发送通道和128个接收通道,一帧数据最多128个通道,也即128个数据单元,一个通道可以移近或移出一个串行字。那么这一帧里面还分八个子帧,每个子帧16个通道,这样总共就是128个通道。这八个子帧还分两区,偶数为A区,奇数为B区。通过使能寄存器确定每个区16个通道哪些要使用。
关于编程架构: 1、首先创建结构体,配置: MCBSP_Config myMCBSP = { MCBSP_SPCR1_RMK( ... ), MCBSP_SPCR2_RMK( ... ), ... ... } 2、创建句柄并配置: hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); MCBSP_config(hMcbsp,&myMCBSP); delay(); //注意寄存器配置完成后需要延时,以便内同步 注意它和EDMA一样,配置需要句柄。 3、各种使能: MCBSP_enableSrgr(hMcbsp); delay(); //内同步 MCBSP_enableRcv(hMcbsp); MCBSP_enableXmt(hMcbsp); .. 有些资料是用另外一个函数搞定: MCBSP_start(hMcbsp,MCBSP_RCV_START | MCBSP_XMIT_START,0); 4、收发的实现 MCBSP_read16(hMcbsp); MCBSP_write16(hMcbsp,buff); 里面具体的代码就是对DRR或者DXR进行赋值和返回。 实际的收发有两种实现方法,一种是查询SPCR状态位,一种是中断,中断实时性高,建议使用。有对应的中断ID。 rcvEventID = MCBSP_getRcvEventId(hMcbsp); 再来个plug函数就能绑定中断程序。