大家好,又见面了,我是你们的朋友全栈君。
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函数就能绑定中断程序。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143589.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...