This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:TMS320F28335:关于使用 McBSP 和 DMA 进行数据处理的问题

Guru**** 2465890 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/836458/tms320f28335-tms320f28335-problem-about-receve-data-processing-using-mcbsp-and-dma

器件型号:TMS320F28335

尊敬的团队:

我遇到了一个问题、即使用带有 DMA 的 McBSP 接收数据时、会将一个信道移至9.375MHz 时钟以下。
(例如:Buffer_TX[0] -> Buffer_RX[1]、Buffer_TX[1] -> Buffer_RX[2]、... 、Buffer_TX[15] -> Buffer_RX[0])
但是、在18.75MHz 时钟或仅 低于18.75MHz 的一个通道中、16通道的运行是令人满意的。

McBSP 被应用为 SPI 主控模式、在最大18.75或 低于 MHz 串行时钟时具有16通道16位突发。
DMA 被用于 事件触发方法、而不是临时中断。
接收和发送测试由 DLB (数据回路)模式执行。

如何解决此问题? 我想解决这个问题。

谢谢你。
此致

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否共享 McBSP 初始化代码?

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、团队成员。 
    当然。 我共享 McBSP 和 DMA 初始化代码。
    您会检查我的 C 源代码吗?

    谢谢。
    此致。
    ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ 
    // DMA Intila 设置代码 void DMAInitialize (void){ EALLOW; DmaRegs.DMACTRL.bit.hardreset = 1; asm (" nop"); //通道1、McBSPA 发送 DMARegs.CH1.MODE.BIT.PERINTSEL = 14;//外设中断选择14 = bit.PERMXTA. //启用外设中断事件,0=禁用,1=启用 DmaRegs.ch1.mode.bit.CHINTMODE = 0;// 0=新传输开始时的中断,1=传输结束 时的中断 DmaRegs.ch1.mode.bit.CHINTE = 0; //通道中断使能位、0=Disable、1=Enable DmaRegs.ch1.mode.bit.SyncE = 0; //无同步信号 DmaRegs.ch1.mode.bit.SYNCSEL = 0; //无同步信号 DmaRegs.ch1.control.bit.PERINTCLR = 1;//清除外设中断事件标志 DmaRegs.ch1.control.bit.SYNCCLR = 1;//清除同步标志 DmaRegs.ch1.control.bit.ERRCLR = 1;//清除同步错误标志 DmaRegs.SYNCCLR = 1;//清除同步标志 DmaRegs.chdst.step.d1 ;dst_dst_dstep.d1;//突发 dstep_d1;dst_dstep.d_dstep.d1;// dstr_dstr_d1;dstr_dr_dstr_d1;// str_dstep.dr_d //目标突发步长、0 = 0step DmaRegs.ch1.transfer_size = 15;// 0 = 1字/传输 DmaRegs.ch1.SRC_transfer_step = 2;//源传输步长、0 = 0step DmaRegs.ch1.dst_transfer_step = 0;//目标传输步长、DADDR_1[0_ADDR_ADDR_1]_ADDR_D_ADDR_TRB = 0[0_ADDR_ADDR_ADDR_ADDR_1]_ADDR_ENTRB = 0[0_ADDR_ADDR_ADDR_ADDR_ENTRFACT.US_ENTR_0_ADDR_ENTR_0_ADDR_TRIP_0_ENTR_TR_TR_TRUTR //除非使用换行函数 DmaRegs.CH1.dst_ADDR_SHADDADDR =(uint32)& McbspaRegs.DXR1.all;//起始地址= McBSPA DXR DmaRegs.ch1.dst_beg_ADDR_SHADDR_SHADDR =(uint32)& McbspaRegs.DXr1.dwrap = 0xt_dsp_dwrap = 0xt_ds.dr1.dr1.dsp_sb =不需要、否则不需要;//除非使用最大值;// dmawrap = 0xt_dch1;// dr1.dr1.t_mafr1;//不需要最大值;// d //设置为最大值-不希望源代码换行 dmaRegs.ch1.control.bit.PERINTCLR = 1;//清除任何寄生中断标志 //通道2、McBSPA 接收 DmaRegs.ch2.mode.bit.PERINTSEL = 15;//外设中断选择15 = MREVTA DmaRegs.ch2 ;禁用 dmaINTCH.bit = 1.dit.MODE=0;启用中断模式= 0;中断= 0;中断= 1;中断= 0;中断= 0 = 1;中断 // 0 =新传输开始时的中断,1 =传输结束时的中断 DmaRegs.ch2.mode.bit.CHINTE = 0;//通道中断使能位,0 =禁用,1 =启用 DmaRegs.ch2.mode.bit.SyncE = 0; //无同步信号 DmaRegs.ch2.mode.bit.SYNCSEL = 0; //无同步信号 DmaRegs.ch2.control.bit.PERINTCLR = 1;//清除外设中断事件标志 DmaRegs.ch2.control.bit.SYNCCLR = 1;//清除同步标志 DmaRegs.ch2.control.bit.ERRCLR = 1;//清除同步错误标志 DmaRegs.SYNCCLR = 1;//清除同步标志 DmaRegs.step_d2 ;dst_dstep.d_dstep.d_0_dstep.dch.dstb = 0/突发 dstr_dstr_dst_d_d_dstep.d_d_d_dstr_0_dstr_d_d_d_dstep.d_d_ //目标突发阶跃、1 = 1步 DmaRegs.ch2.transfer_size = 15;// 0 = 1字/传输 DmaRegs.ch2.SRC_transfer_step = 0;//源传输阶跃、0 = 0step DmaRegs.ch2.dst_transfer_step = 2;//目标传输阶跃、0 = 0drf_dr.drc.drc.drc.drc.drfb ;drc.drc.drc.drc.drc.drc.drc.drc.drc.drc.drf_drf_dr2;//目标传输速率= 0drf_drc.drc.drc.drc.drf_drc.drc.drc.drc.drc.drc. //除非使用后续处理函数 DmaRegs.ch2.dst_ADDR_SHADDADDR =(UINT32)& Buffer_RX_A[0];//起始地址=接收缓冲区(对于 McBSP-A) DmaRegs.ch2.dst_beg_ADDR_SHADDR =(UINT32)& Buffer_RX_A[0];//除非不需要 后续处理0xmaRegs.ch2;dst_beg_en_r_ds.dsp_en_en_d/sime.s/不需要后续处理 //设置为最大值-不希望源代码换行 DMARegs.ch2.control.bit.PERINTCLR = 1;//清除任何寄生中断标志 //通道3、McBSPB 发送 DMARegs.ch3.mode.bit.PERINTSEL=16;//外设中断选择16 = MXEVTB DMARegs.ch3.dit.MODE=0 ;启用中断= 1、中断= 0;中断= 0 = 0;中断= 1;中断= 0 =中断;中断=中断=中断;中断=中断=中断;中断=中断;中断=中断;中断=中断=中断;中断=中断=中断1;中断=中断;中断=中断=中断 // 0 =新传输开始时的中断,1 =传输结束时的中断 DmaRegs.ch3.mode.bit.CHINTE = 0;//通道中断使能位,0 =禁用,1 =启用 DmaRegs.ch3.mode.bit.SyncE = 0; //无同步信号 DmaRegs.ch3.mode.bit.SYNCSEL = 0; //无同步信号 DmaRegs.ch3.control.bit.PERINTCLR = 1;//清除外设中断事件标志 DmaRegs.ch3.control.bit.SYNCCLR = 1;//清除同步标志 DmaRegs.ch3.control.bit.ERRCLR = 1;//清除同步错误标志 DmaRegs.bit.SYNCCLR = 1;//清除同步标志 DmaRegs.step_d3 ;dst_dst_d3 = 0_dstep.dst_d_dstep.ch3;/burst = 0_dst_dst_d_dst_dst_d_dst_d3;//猝发 Regs.dst_dst_dst_d3;/st_dst_ //目标突发阶跃、0 = 0step DmaRegs.ch3.transfer_size = 15;// 0 = 1字/传输 DmaRegs.ch3.SRC_transfer_step = 2;//源传输阶跃、0 = 0step DmaRegs.ch3.dst_transfer_step = 0;//目标传输阶跃、0 = 0_DmaADDR_b.ADDR_3[0_ADDR_ADDR_ADDR_B&b = 0_ADDR_ADDR_ADDR_ADDR_ADDR_ADDR_3_ENTRB = 0_ADDR_ADDR_ENTRB; //缓冲区[0_ADDR_ADDR_ADDR_ENTRB = 0_ADDR_ADDR_3_ADDR_ENTRB = //除非使用换行函数 DmaRegs.CH3.dst_ADDR_SHADDADDR_SHADDADDR =(UINT32)& McbspbRegs.DXR1.ALL;//起始地址= McBSPA DXR DmaRegs.CH3.dst_beg_ADDR_SHADDR_SHADDR =(UTRD)& McbSPRRegs.DXr1.DX3;//除非不需要 、否则不使用0xSP_RAPUT_TRF_SIZE = 0xt_TRFF.DX3; // d_TRF_TRF_TH_THUFFF_TRF_TRF_SIZE = 0xt_TRFF.D/ TOP= 0xt_SI //置为最大值-不希望源代码换行 DMARegs.ch3.control.bit.PERINTCLR = 1;//清除任何寄生中断标志 //通道4、McBSPB 接收 DMARegs.Ch4.MODE.BIT.PERINTSEL = 17;//外设中断选择17 = MREVTB DMARERegs.MODE = 0、PERINTCH.MODE = 1;/ LET.MOINTCH4 = 0;/ LET.MODE.MODE=0;0;0 = 0;0;0 = LET.CONTINTRINTRIBE = 1;0;0 = 1 // 0 =新传输开始时的中断,1 =传输结束时的中断 DmaRegs.Ch4.mode.bit.CHINTE = 0;//通道中断使能位,0 =禁用,1 =启用 DmaRegs.Ch4.mode.bit.SyncE = 0; //无同步信号 DmaRegs.Ch4.mode.bit.SYNCSEL = 0; //无同步信号 DmaRegs.Ch4.control.bit.PERINTCLR = 1;//清除外设中断事件标志 DmaRegs.Ch4.CONTROL.BIT.SYNCCLR = 1;//清除同步标志 DmaRegs.Ch4.CONTROL.BIT.ERRCLR = 1;//清除同步错误标志 DmaRegs.Ch4.all = 0; // 5 = 6字/突发 DmaRegs.Ch4.SRC_BURST_STEP = 0; //源突发阶跃、0 = 0step DmaRegs.Ch4.dst_burst_step = 0; //目标突发阶跃、1 = 1步 DmaRegs.Ch4.transfer_size = 15; // 0 = 1字/传输 DmaRegs.Ch4.SRC_TRANSFER_STEP = 0; //源传输步长、0 = 0step DmaRegs.Ch4.dst_transfer_step = 2; //目标传输阶跃、0 = 0step DmaRegs.Ch4.SRC_ADDR_SHADDR =(uint32)& McbspbRegs.DRR1.all; //起始地址= McBSPA DRR DmaRegs.Ch4.SRC_beg_ADDR_SHADDR_SHADDR =(uint32)& McbspbRegs.DR1.all;//除非使用 wrap函 数 DmaRegs.Ch4.dst_ADDR_SHADDR_SHADDR =(uint32)& Buffer_RX_B[0]; //起始地址=接收缓冲区(对于 McBSP-A) DmaRegs.Ch4.dst_beg_ADDR_shadow =(uint32)& Buffer_RX_B[0]; //除非使用换行函数 DmaRegs.Ch4.dst_wrap_size = 0xFFFF; //置为最大值-不希望目标换行 DmaRegs.Ch4.SRC_wrap_size = 0xFFFF; //置为最大值-不希望源代码换行 DMaRegs.Ch4.control.bit.PERINTCLR = 1; //清除任何伪中断标志 EDIS; } //- McBSP 初始设置代码 void InitMcbSPA (void){ McbspaRegs.SPCR2.all =0x0000;//复位 FS 发生器、采样率发生器和发送器 McbspaRegs.SPCR2.bit.XINTM =2;//当检测到每个发送帧同步脉冲时,McBSP 发送一个 McBSP 请求 CPU McbspaRegs.SPCR1.all =0x0000;//复位接收器、右对齐字、数字回路中断。 McbspaRegs.SPCR1.bit.RINTM =2;//当每个接收帧同步脉冲被检测时、McBSP 向 CPU 发送一个 Rint 请求 McbspaRegs.pcr.all=0x0F08; //(CLKXM=CLKRM=FSRM=1、FXP=1) McbspaRegs.pcr.bit.FSRP=1;//帧同步脉冲 FSR 为低电 平有效 McbspaRegs.pcr.bit.FSRP=1;//帧同步脉冲 FSR 为低电 平有效 McbspaRegs.bspr.pcpr.bsps.pcr.bsps = 1.bsprq.bsprp.bsps; // 0:外部1:内部 McbspaRegs.pcr.bit.CLKXM = 1; McbspaRegs.pcr.bit.SCLKME= 0; McbspaRegs.pcr.bit.FSXP = 1; McbspaRegs.SPCR1.bit.DLB = 1; McbspaRegs.SPCR1.bit.CLKSTP = 2;//无时钟延迟的时钟停止模式 McbspaRegs.pcr.bit.CLKXP = 0; // CLKXP=0:发送数据在 CLKX McbspaRegs.pcr.bit.CLKRP = 0的上升沿被采样; // CLKRP = 0:在 CLKR McbspaRegs.RCR2.bit.RDATDLY=0的下降沿对接收数据进行采样; //在 Fram 同步信号 McbspaRegs.XCR2.bit.XDATDLY=0之后接收数据延迟; // Fram 同步信号 McbspaRegs.RCR1.bit.RWDLEN1=2之后的传输数据延迟; // 16位字 McbspaRegs.XCR1.bit.XWDLEN1=2; // 16位字 McbspaRegs.SRGR2.All=0x2000; // CLKSM=1、FPER = 1 CLKG 周期 McbspaRegs.SRGR2.bit.FPER = 0x0010;// CLKSM=1、FPER = 1 CLKG 周期 McbspaRegs.SRGR2.bit.CLKSM = 1; McbspaRegs.SRGR2.bit.FSGGM = 0; McbspaRegs.SRGR1.bit.CLKGDV = 3;// CLK = 18.75MHz/(McBSP_A_CLKDIV+1) McbspaRegs.SPCR2.bit.GRST=0; //重置采样率发生 器 McbspaRegs.SPCR2.bit.frst=0; //帧同步发生器复位 McbspaRegs.SPCR2.bit.XRST=0; //重置 TX 以禁用 McbspaRegs.SPCR1.bit.RRST=0; //重置 RX 以禁用 McbspaRegs.SPCR1.bit.RJUST = 0x01;//将数据扩展到 MSP: clkg_delay_loop(); //等待至少2个 CLKG 周期 McbspaRegs.SPCR2.bit.GRST=1; //启用采样率发生 器 McbspaRegs.SPCR2.bit.frst=1; //帧同步发生器使能 McbspaRegs.SPCR2.bit.XRST=1; //从 Reset McbspaRegs.SPCR1.bit.RRST=1启用 TX; //从重置 DelayU(10)启用 RX; } 空 InitMcbspb (空) { McbspbRegs.SPCR2.all=0x0000; McbspbRegs.SPCR2.bit.XINTM =2; McbspbRegs.SPCR1.all =0x0000; McbspbRegs.SPCR1.bit.RINTM =2; McbspbRegs.pcr.all=0x0F08; McbspbRegs.pcr.bit.FSRP = 1; McbspbRegs.pcr.bit.FSXP = 1; McbspbRegs.pcr.bit.FSXM = 1; McbspbRegs.pcr.bit.FSRM = 0; // 0:外部1:内部 McbspbRegs.pcr.bit.CLKXM = 1; McbspbRegs.pcr.bit.SCLKME= 0; McbspbRegs.pcr.bit.FSXP = 1; McbspbRegs.SPCR1.bit.DLB = 1; McbspbRegs.SPCR1.bit.CLKSTP= 2; McbspbRegs.pcr.bit.CLKXP = 0; McbspbRegs.pcr.bit.CLKRP = 0; McbspbRegs.RCR2.bit.RDATDLY=0; McbspbRegs.XCR2.bit.XDATDLY=0; McbspbRegs.RCR1.bit.RWDLEN1=2; // 16位字 McbspbRegs.XCR1.bit.XWDLEN1=2; // 16位字 McbspbRegs.SRGR2.All=0x2000; McbspbRegs.SRGR2.bit.CLKSM = 1; McbspbRegs.SRGR2.bit.FSGM=0; McbspbRegs.SRGR1.bit.CLKGDV = 3; // CLK = 18.75MHz/(McBSP_A_CLKDIV+1) McbspbRegs.SPCR2.bit.GRST=0; //重置采样率发生器 McbspbRegs.SPCR2.bit.frst=0; //帧同步发生器复位 McbspbRegs.SPCR2.bit.XRST=0; //将 TX 重置为禁用 McbspbRegs.SPCR1.bit.RRST=0; //将 RX 复位为禁用 McbspbRegs.SPCR1.bit.RJUST = 0x01;//将数据扩展到 MSP:2019.08.28 clkg_delay_loop (); //等待至少2个 CLKG 周期 McbspbRegs.SPCR2.bit.GRST=1; //启用采样率发生器 McbspbRegs.SPCR2.bit.frst=1; //帧同步发生器使能 McbspbRegs.SPCR2.bit.XRST=1; //从复位中启用 TX McbspbRegs.SPCR1.bit.RRST=1; //从复位中启用 RX DelayU (10); } //- McBSP 和 DMA 复位代码 void ExtADCReset () { int i=0; McbspaRegs.DXR1.all =(uint16)(0x0000);//模式选择(mode I ->伪 DFFERENTIAL 模式 II) McbspbRegs.DXR1.all =( uint16);//模式选择(mode I ->伪 DFFERENTIAL 模式 I) DelayU (1); Buffer_RX_A[0]=((int)(McbspaRegs.DRR1.all));// McBSP RX 缓冲器清 零 Buffer_RX_B[0]=(int)(McbspbRegs.DRR1.all);// McBSP RX 缓冲器清零 EALLOW;bit=dESRE1.tc.tcTR1.ma1.tcESR1.tch.control=ma1.tcr.tchds.tcr1.ma1.ma1.tcr.tcr1.tcr1.tch.tch.ma1.ma1.ma1.ma1.r.r.r.r.r.r.r.r.r.r.r.r.r.r.t DMARegs.CH3.CONTROL.BIT.SOFTRESET=1; DMARegs.Ch4.CONTROL.BIT.SOFTRESET=1; DMARegs.Ch4.CONTROL.BIT.PERINTCLR=1; EDIS; DelayU(1); for (i=0;i<16;i++){ Buffer_RX_A[i]= 0;// RX 缓冲区清零 Buffer_RX_B[I]=0; Buffer_TX_A[i]= 0;// TX 缓冲区清零 Buffer_TX_B[i]= 0; } void InitAD7617 (){ EALLOW; DmaRegs.CH1.control.bit.SOFTRESET=1; DmaRegs.CH2.CONTROL.bit.SOFTRESET=1;DmaRegs.CH3.CONTROL.bit.SOFTRESET=1 ;控制 TRESET=SOTR1.Ch4;控制 TREST.1;控制 TRFTREST.1;控制 TREST.TR1.MOBIT.1;控制 EDIS; ExtADCReset(); EALLOW; DmaRegs.ch1.control.bit.run = 1; //从 McBSP-A DmaRegs.ch2.control.bit.run 开始 DMA 传输= 1; //开始从 McBSP-A DmaRegs.ch3.control.bit.run 接收 DMA = 1; //从 McBSP-B DmaRegs.Ch4.control.bit.run 开始 DMA 传输= 1; //开始从 McBSP-B EDIS 接收 DMA; DelayU (10); ExtADCerorCheck (); }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [引用用户="Seungmo Kim "]

    McbspbRegs.SPCR2.bit.XRST=1;         // Enable TX from Reset
        McbspbRegs.SPCR1.bit.RRST=1;         // Enable RX from Reset

    [/报价]

    您是否可以先启用接收器、然后启用发送器(如下所示)并尝试? 我在 DLB 模式下看到了这个问题。

    McbspbRegs.SPCR1.bit.RRST=1; //通过复位
    McbspbRegs.SPCR2.bit.XRST=1启用 RX; //从复位中启用 TX
    

    我将对此进行研究、并很快回来。

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vasudha。

    我在  评论回复时标记为调试程序(接收器先重置、然后重置发送器)。

    但是,我很抱歉地说,情况 以前没有变化。

    感谢 您的友好回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否能够解决该问题。 我认为问题是由于 DLB 模式。

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Vasudha。
    我在数据表中被欺骗了。
    此测试条件为 DLB=0、SPI 主模式、并且 RX-TX 与光纤轴相连。
    -如果 SCLK 为18.75MHz:在 CLKX 信号处于低电平状态后,FSX 信号处于低电平状态的保持时间已处于数据表所示的最短时间内  
    接收数据正常(例如:Buffer_Tx_A[0]-> Buffer_Rx_A[0])

    -如果 SCLK 低于9.375MHz:CLKX 信号处于低电平状态后,FSX 信号处于低电平状态的保持时间不会在最短时间内保持。
    因此、我认为这会导致接收数据通道发生移位。 (例如:Buffer_Tx_A[0]-> Buffer_Rx_A[1])

    这只是我的看法。  
    你会评论我的吗?

    谢谢

    e2e.ti.com/.../McBSP_2700_s-Receive-Problem.pptx

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们将对此进行研究、一旦发现问题、我们将返回。

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们正在尝试重现此问题。 如果您仅在 DLB 模式下看到此问题、您能告诉我们吗?  

    当 DLB = 0配置时、McBSPA 和 McBSPB 是否被配置为 SPI 主设备和接收器?

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Seungmo、

    再次查看、看看您是否有机会尝试上文 Vasudha 的建议?  我将标记为 TI 认为已解决、但如果您有更多信息、请回复、我们将收到通知。

    最棒的

    Matthew