尊敬的 e2e:
标题说明了其中的大部分内容。
我已经为 TDM I2S 配置了 McBSP、现在已经启用了用于测试的数字回路。
DXR (U 和 L)的内容(对于现在的硬编码)已正确且重复从模块中计时、并且在回送时、DMA 控制器(DMA3CH0)会接收并复制到存储器中的正确位置。
但 DMA 控制器(DMA3CH1)不为发送器模块提供服务。 作为测试、我将 DMA3CH1设置为在 REVT 上触发、然后触发正常、因此问题似乎是 McBSP 模块的发送部分实际上不会在发送事件(XEVT)上标记 DMA 控制器。
我不使用该模块的任何多通道功能。
DMA 的初始化代码如下:
void i2sDMAInit (void){
//为 DMA3启用时钟
PCGCR2 &= 0xFFFF -(1 << 5);
//清除 DMA 中断标志
DMAIFR = 0xFFFF;
//为通道0和1启用 DMA 中断
IER0 |= 0x0100;
DMAIER |= 0x3000;
// 0x0001:CH1的 McBSP 发送事件、0x0002:CH0的 McBSP 接收事件
DMA3CESR1 =(0x0001 << 8)+(0x0002);
// DMA3CH0 (接收器)
//来源:McBSP sectiona 的 DMA 地址中的 X2000偏移量
DMA3CH0SSAL =(uint16_t)(&McBSP_DRRL)+ 0x2000;
DMA3CH0SSAU = 0x0000;
//目标:从 CPU 字地址到 DMA 字节地址的转换(<< 1)、拆分为上下两部分、AD 0x8到上两部分用于 SARAM 的0x90000偏移量(即使手动设置为添加0x9)。
DMA3CH0DSAL =(uint16_t)(((uint32_t) inMcBSPDMA3CH0->buf)<< 1);
DMA3CH0DSAU =(uint16_t)((((uint32_t) inMcBSPDMA3CH0->buf)>> 15)+ 8);
// 2字节/字、2通道(L+R)、2个缓冲器(乒乓)、9个编解码器、乘以 BUFSIZE
DMA3CH0TCR1 = BUFSIZE * 2 * 2 * 9;
// EN = 1、INTEN = 1、AUTORLD = 1、DSTAMODE 自动递增、SRAMODE 恒定地址、 BURSTMODE = 0 (32位)、SYNCMODE = 1、PING_PON_EN = 1
DMA3CH0TCR2 = 0xB085;
// DMA3CH1 (发送器)
//目标:McBSP 段的 DMA 地址中的 X2000偏移量
DMA3CH1DSAL =(uint16_t)(&McBSP_DXRL)+ 0x2000;
DMA3CH1DSAU = 0x0000;
//源:从 CPU 字地址到 DMA 字节地址的转换(<< 1)、拆分为上下两部分、AD 0x8到上两部分用于 SARAM 的0x90000偏移量(即使手动设置为添加0x9)。
DMA3CH1SSAL =(uint16_t)(((uint32_t) outMcBSPDMA3CH1->buf)<< 1);
DMA3CH1SSAU =(uint16_t)((((uint32_t) outMcBSPDMA3CH1->buf)>> 15)+ 8);
// 2字节/字、2通道(L+R)、2个缓冲器(乒乓)、9个编解码器、乘以 BUFSIZE
DMA3CH1TCR1 = BUFSIZE * 2 * 2 * 9;
// EN = 1、INTEN = 1、AUTORLD = 1、DSTAMODE 恒定地址、SRAMODE 自动递增、 BURSTMODE = 0 (32位)、SYNCMODE = 1、PING_PON_EN = 1
DMA3CH1TCR2 = 0xB205;
}
McBSP 的初始化如下:
void mcbspInit (void){ PCGCR1 |= 0x0020;//禁用 McBSP 外设 EBSR = 0x0300;//将 SP0设置为 McBSP PCGCR1 &=~0x0020;//启用 McBSP 时钟 CLKSTOP1 &=~0x0040;//禁用 MPBCLKSTPREQ PRCR = 0x0040;//重置 McBSP while ((PRCR & 0x0040)= 0x0040); //Step 2 McBSP_SPCLL=0x0000; McBSP_SPCRU = 0x0000; McBSP_PCRL |= 0x0A00;//将 FSXM 设置为输出和内部源。 //Step 3. McBSP_RCRL =(31 << 8)+(0x5 << 5);// RFRLEN1:(31 + 1)个字每帧(18条 Rx 线路),RWDLEN1:每个字16位(表8-29) McBSP_RCRU = 0x0000; McBSP_XCRL =(31 << 8)+(0x5 << 5);// XFRLEN1:(31 + 1)个字每帧(18条 TX 线路)、XWDLEN1:每个字16位(表8-29) McBSP_XCRU = 0x0000; McBSP_SRGRU =(0x1 << 13)+(0x1 << 12)+ 511;// FGM = CLKSM = 1、FPER = 511 + 1 (表8-34) McBSP_SRGRL =(uint16_t)(255 << 8)+ 15;// FWID = 255 + 1、CLKGDV = 15 + 1 NOP(50); McBSP_SPCRU ||(1 << 6);//启用 CLKG (禁用 GRST) NOP(50); //等待两个 CLKG 时钟周期进行同步 McBSP_SPCRU |= 0x1;//启用发送(禁用 XRST) NOP(50); //等待两个 CLKG 周期以获得可能的同步错误 McBSP_SPCRU &=~0x0001;//禁用发送以清除同步错误 McBSP_SPCRU |= 0x0001;//重新启用发送(禁用 XRST) McBSP_SPCRL |= 0x8001;//启用接收(禁用 RRST) McBSP_PCRL ||(0x1 << 11)+(0x1 << 9);//将 FSXM 设置为输出和内部源(CLKXM = 1)。 McBSP_SPCRU |= 0x0280;//启用帧同步发生器(frst=1)和自由娱乐模式
有没有常见的 McBSP-DMA 组合缺陷、或者有人能发现我在某个地方犯了一个可怕的简单错误吗? 我已经开始关注这个问题并进行调试2天了、对它有点视而不见。
此致。