在嵌入式系统开发中,多通道缓冲串行端口(Multi-channel Buffered Serial Port, McBSP)是实现高速串行通信的核心外设模块。作为TI OMAP平台的重要组件,McBSP凭借其灵活的时钟配置、多通道支持和强大的缓冲能力,在音频处理、工业通信等领域广泛应用。本文将深入剖析McBSP2作为从设备接收器的完整配置流程,结合寄存器级操作详解实现细节。
McBSP本质上是增强型同步串行接口,其核心功能模块包括:
典型应用场景中,McBSP工作频率可达96MHz,支持8/12/16/20/24/32位多种数据格式。如图1所示,数据通过DR引脚串行输入,经采样、移位后存入接收缓冲寄存器(DRR),最终由DMA控制器搬运至系统内存。
关键特性提示:OMAP平台的McBSP模块仅支持32位数据访问,16位或8位访问会导致寄存器内容损坏。这是硬件设计上的重要限制条件。
以下以OMAP3530的McBSP2为例,展示作为从设备接收TWL4030音频数据的完整配置流程。该配置实现32位单字帧接收,使用外部时钟同步。
McBSP的正常工作需要两个时钟源:
c复制// 配置CONTROL_DEVCONF0寄存器选择PER_96M_FCLK作为功能时钟
CONTROL.CONTROL_DEVCONF0[6] = 0x0; // MCBSP2_CLKS=0
// 通过PRCM模块启用时钟
PRCM.CM_FLCKEN_PER[0] = 0x1; // 使能功能时钟
PRCM.CM_ILCKEN_PER[0] = 0x1; // 使能接口时钟
时钟分频原理:当使用内部时钟源时,SRGR1.CLKGDV寄存器控制时钟分频比。计算公式为:
CLKG频率 = 输入时钟频率 / (1 + CLKGDV)
例如96MHz输入,CLKGDV=1时生成48MHz的CLKG。
正确的初始化需要遵循严格的时序流程,否则可能导致数据错位或同步失败:
复位接收器和帧同步生成器
c复制MCBSPLP_SPCR1_REG[0] = 0x0; // RRST=0
MCBSPLP_SPCR2_REG[7] = 0x0; // FRST=0
配置接收参数寄存器
c复制// 单相帧配置
MCBSPLP_RCR2_REG[15] = 0x0; // RPHASE=0
MCBSPLP_RCR2_REG[1:0] = 0x0; // RDATDLY=0 (无数据延迟)
// 32位字长,单字帧
MCBSPLP_RCR1_REG[7:5] = 0x5; // RWDLEN1=5 (32-bit)
MCBSPLP_RCR1_REG[14:8] = 0x0; // RFRLEN1=0 (1字/帧)
// FIFO阈值设置(半满触发DMA)
MCBSPLP_THRSH1_REG[6:0] = 0x7F; // RTHRESHOLD=127
数据对齐与同步配置
c复制MCBSPLP_SPCR1_REG[14:13] = 0x0; // RJUST=0 (右对齐,MSB补零)
// 外部设备生成帧同步
MCBSPLP_PCR_REG[10] = 0x0; // FSRM=0 (FSR为输入)
MCBSPLP_PCR_REG[2] = 0x0; // FSRP=0 (高电平有效)
// 外部时钟配置
MCBSPLP_PCR_REG[8] = 0x0; // CLKRM=0 (CLKR为输入)
MCBSPLP_PCR_REG[0] = 0x0; // CLKRP=0 (下降沿采样)
释放接收器复位
c复制MCBSPLP_SPCR1_REG[0] = 0x1; // RRST=1
表1列出了核心寄存器的配置值与功能说明:
| 寄存器名称 | 地址 | 值 | 功能描述 |
|---|---|---|---|
| MCBSPLP_SPCR1_REG | 0x49022014 | 0x00000001 | 接收器启动 |
| MCBSPLP_SPCR2_REG | 0x49022010 | 0x00000000 | 帧同步生成器保持复位 |
| MCBSPLP_RCR1_REG | 0x4902201C | 0x000000A0 | 32位字长,单字帧 |
| MCBSPLP_RCR2_REG | 0x49022018 | 0x00000000 | 无数据延迟 |
| MCBSPLP_THRSH1_REG | 0x49022094 | 0x0000007F | FIFO半满阈值(127) |
| MCBSPLP_PCR_REG | 0x49022048 | 0x00000000 | 引脚输入模式配置 |
当出现数据错位时,建议按以下步骤检查:
McBSP的128字FIFO可通过THRSH1/2寄存器灵活配置触发阈值:
在语音处理等需要多通道的场景中:
现象:接收数据位顺序异常
解决方法:
现象:周期性出现数据丢失
排查步骤:
当使用sDMA控制器搬运数据时:
c复制// 配置DMA源地址为DRR寄存器
DMA.CCR[0].SRC_ADDR = 0x49022000;
// 设置传输计数与数据宽度
DMA.CCR[0].TC = 128; // 每次触发传输128字
DMA.CCR[0].DST_BW = 32; // 32位数据宽度
// 使能FIFO阈值中断作为DMA触发源
MCBSPLP_IRQENABLE_REG[1] = 0x1; // RINTEN=1
OMAP35xx系列提供6个McBSP实例,各模块地址空间如下:
| 模块名称 | 基地址 | 大小 |
|---|---|---|
| McBSP1 | 0x48074000 | 4KB |
| McBSP2 | 0x49022000 | 4KB |
| McBSP3 | 0x49024000 | 4KB |
| SIDETONE_McBSP2 | 0x49028000 | 4KB |
关键寄存器地址偏移量:
通过本文详述的配置方法和实践技巧,开发者可以充分发挥McBSP在高速串行通信中的性能优势。实际应用中还需结合具体外设时序要求微调参数,建议使用示波器或逻辑分析仪验证信号质量。