我在学习McBSP的使用时遇到一个问题,我编写了一段验证程序,通过CPU中断触发连续的数据输出,但是运行起来后,只能触发第一次中断,后续就无法继续触发中断了,我怀疑写DXR寄存器的逻辑存在问题,但一直没能解决。能否提供一些关于McBSP使用的样例或者帮忙看一下代码里存在的问题?
验证程序的部分代码如下:
volatile int ximt_flag = 1; void InterruptInit(void) { // 初始化 DSP 中断控制器 IntDSPINTCInit(); // 使能 DSP 全局中断 IntGlobalEnable(); } void McBSP0Init(void) { // McBSP0 串行口控制寄存器 McBSP0Regs.SPCR.bit.FREE=1; McBSP0Regs.SPCR.bit.SOFT=0; // McBSP0 使能数据自环 McBSP0Regs.SPCR.bit.DLB=0; // 禁用 FRST GRST XRST RRST McBSP0Regs.SPCR.bit.FRST=0; McBSP0Regs.SPCR.bit.GRST=0; McBSP0Regs.SPCR.bit.XRST=0; McBSP0Regs.SPCR.bit.RRST=0; // McBSP0 管脚控制寄存器 // 发送帧同步信号由内部采样率生成器输出 McBSP0Regs.PCR.bit.FSXM=1; // 接收帧同步信号外部输入 McBSP0Regs.PCR.bit.FSRM=0; // 发送时钟信号由内部采样率生成器产生 McBSP0Regs.PCR.bit.CLKXM=1; // 接收时钟信号由内部采样率生成器产生 McBSP0Regs.PCR.bit.CLKRM=1; // 内部采样率生成器时钟信号由 McBSP 内部输入时钟产生(内部输入时钟 456MHz) McBSP0Regs.PCR.bit.SCLKME=0; // 发送帧同步信号低电平有效 McBSP0Regs.PCR.bit.FSXP=1; // 接收帧同步信号低电平有效 McBSP0Regs.PCR.bit.FSRP=1; // 发送数据在时钟信号上降沿采样 McBSP0Regs.PCR.bit.CLKXP=0; // 接收数据在时钟信号下降沿采样 McBSP0Regs.PCR.bit.CLKRP=0; // McBSP0 采样率生成寄存器 // 采样率生成寄存器自由运行 McBSP0Regs.SRGR.bit.GSYNC=0; // CLKS上升沿产生CLKG和FSG McBSP0Regs.SRGR.bit.CLKSP=0; // 采样率生成器时钟信号由 McBSP 内部输入时钟产生(内部输入时钟 456MHz) McBSP0Regs.SRGR.bit.CLKSM=1; // 指定帧周期值(+1) McBSP0Regs.SRGR.bit.FPER=0; // 指定帧宽度值(+1) McBSP0Regs.SRGR.bit.FWID=0; // 采样率生成器时钟分频,采用16倍的bit采样,CLKGDV的数值在28.987~30.829之间,取30 McBSP0Regs.SRGR.bit.CLKGDV=30; // McBSP0 接收控制寄存器 // 多相位帧 McBSP0Regs.RCR.bit.RPHASE=1; // 指定相位 2 接收帧长度(2个字) McBSP0Regs.RCR.bit.RFRLEN2=1; // 指定相位 2 接收字长度(8 位) McBSP0Regs.RCR.bit.RWDLEN2=0; // 无压缩 MSB(最高有效位) McBSP0Regs.RCR.bit.RCOMPAND=0; // 忽略第一个接收帧同步脉冲 McBSP0Regs.RCR.bit.RFIG=1; // 1位接收数据延迟位 McBSP0Regs.RCR.bit.RDATDLY=1; // 指定相位 1 接收帧长度(10 个字) McBSP0Regs.RCR.bit.RFRLEN1=0x9; // 指定相位 2 接收字长度(16 位) McBSP0Regs.RCR.bit.RWDLEN1=0x2; // 无数据位倒置 McBSP0Regs.RCR.bit.RWDREVRS=0; // McBSP0 发送控制寄存器 // 多相位帧 McBSP0Regs.XCR.bit.XPHASE=1; // 指定相位 2 发送帧长度(2个字) McBSP0Regs.XCR.bit.XFRLEN2=1; // 指定相位 2 发送字长度(8 位) McBSP0Regs.XCR.bit.XWDLEN2=0; // 无压缩 MSB(最高有效位) McBSP0Regs.XCR.bit.XCOMPAND=0; // 忽略第一个发送帧同步脉冲 McBSP0Regs.XCR.bit.XFIG=1; // 无发送数据延迟位 McBSP0Regs.XCR.bit.XDATDLY=0; // 指定相位 1 发送帧长度(10 个字) McBSP0Regs.XCR.bit.XFRLEN1=0x9; // 指定相位 1 发送字长度(16 位) McBSP0Regs.XCR.bit.XWDLEN1=0x2; // 无数据位倒置 McBSP0Regs.XCR.bit.XWDREVRS=0; // 延时100个时钟周期,等待内部同步 unsigned char i; for(i=0;i<100;i++) asm (" nop"); // 使能 接收 McBSP0Regs.SPCR.bit.RRST=1; // 使能 接收帧同步信号 McBSP0Regs.SPCR.bit.FRST=1; // 使能 内部采样率生成器 McBSP0Regs.SPCR.bit.GRST=1; // 使能 发送 McBSP0Regs.SPCR.bit.XRST=1; // 延时100个时钟周期,等待内部同步 for(i=0;i<100;i++) asm (" nop "); } void InterruptInit(void) { // 初始化 DSP 中断控制器 IntDSPINTCInit(); // 使能 DSP 全局中断 IntGlobalEnable(); } void McBSP0InterruptInit(void) { // 注册 McBSP0 中断服务函数 IntRegister(C674X_MASK_INT5, McBSP0ISR_TX); // 映射系统中断至可屏蔽中断 IntEventMap(C674X_MASK_INT5, SYS_INT_MCBSP0_XINT); // 使能可屏蔽中断 IntEnable(C674X_MASK_INT5); } void McBSP0ISR_TX(void) { printf("start transmit.\n"); unsigned int to_send = 0x0; if (ximt_flag) { ximt_flag = 0; to_send = 0x0; } else { ximt_flag = 1; to_send = 0xFFFFFF; } while (!McBSP0Regs.SPCR.bit.XRDY); // 写入数据到DXR寄存器 McBSP0Regs.DXR = to_send; }