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.

[参考译文] CCS/TMS320F2.8069万:基于DMA的McBSP (SPI模式)数据传输问题

Guru**** 2560390 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635735/ccs-tms320f28069-problem-with-dma-based-mcbsp-spi-mode-data-transfer

部件号:TMS320F2.8069万

工具/软件:Code Composer Studio

McBSP (SPI模式)用于使用DMA发送和接收132字节数据。 接收数据时出现问题。 有时,接收的第一个字节是总线上传输的字节;有时,第一个字节是随机 数据。 我 怀疑 在 传输开始时DRR1可能不是空的,然后 我尝试 通过在传输前读取来清除DRR1,但 它没有帮助。  下面是我的代码:

132字节传输完成后,通过以下方式关闭DMA:

 EALLOW;
 DmaRegs.CH1.control.bit.halt = 1;
 DmaRegs.CH2.control.bit.halt = 1;
 DmaRegs.CH1.control.bit.SOFTRESET = 1;
 DmaRegs.CH2.control.bit.SOFTRESET = 1;
 EDIS;

开始传输132字节:

   EALLOW;
   DmaRegs.CH1.SRC_wrap_size = 0xff;//在N个脉冲后自动换行源地址
   DmaRegs.CH1.SRC_wrap_step =0;//源代码换行的步骤
   DmaRegs.CH1.dst_wrap_size = 0xFFff;//在N个突发后包装目的地址
   DmaRegs.CH1.DST_Wrap步骤= 0;//目标换行的步骤
   EDIS;

   EALLOW;
   DmaRegs.CH2.SRC_wrap_size = 0xff;//在N个脉冲后自动换行源地址
   DmaRegs.CH2.SRC_wrap_step =0;//源代码换行的步骤
   DmaRegs.CH2.dst_wrap_size = 0xFFff;//在N个突发后包装目的地址
   DmaRegs.CH2.dst_wrap_step =0;//目标自动换行的步骤
   EDIS;

 //通道1,McBSPA传输
   EALLOW;
   DmaRegs.CH1.SRC_beG_ADDR_shadow =(UINT32) src;
   DmaRegs.CH1.SRC_ADDR_shadow =    (UINT32) src;
   DmaRegs.CH1.DST_beG_ADDR_shadow =(UINT32)(UINT16 *)&McbspaRegs.DXR1.all;
   DmaRegs.CH1.DST_ADDR_shadow =    (UINT32)(UINT16 *)&McbspaRegs.DXR1.all;
   EDIS;

 //通道2,McBSPA接收
   EALLOW;
   DmaRegs.CH2.SRC_beG_ADDR_shadow =(UINT32)&McbspaRegs.DR1.all;
   DmaRegs.CH2.SRC_ADDR_shadow =    (UINT32)&McbspaRegs.DR1.all;
   DmaRegs.CH2.DST_beG_ADDR_shadow =(UINT32)(UINT16 *) DES;
   DmaRegs.CH2.DST_ADDR_shadow =    (UINT32)(UINT16 *) DES;
   EDIS;

   EALLOW;
   DmaRegs.CH1.control.bit.run = 1;
   DmaRegs.CH2.control.bit.run = 1;
   EDIS;

 //必须在DXR获得其值后设置frst,
 //所以必须在启用DMA后设置frst。
 EALLOW;
 McbspaRegs.SPR2.bit.frst = 1;
 EDIS;

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

    感谢您的提问。 您的线程已分配给一位C2000专家,很快会得到回复。

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

    很抱歉,您对McBSP有一些问题。

    您是否在使用自定义示例? 您是否已将标准McBSP DMA示例修改为在SPI模式下工作?
    您是否使用大于或小于16位的单词?

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

    Mark,您好!

    感谢你的帮助。

    是的,我修改了标准McBSP DMA示例,以在SPI模式下工作。

    我正在使用16位数据,CLKSTP=3,CLKXP=0,CLKRP=1和运行SPI时钟

    在18MHz时。 以下是初始化McBSP的代码:

       //
       //重置FS发生器,采样率发生器和发射器
       //
     McbspaRegs.SPCR1.all=0x0000;
       McbspaRegs.SPR2.all=0x0000;
     McbspaRegs.SRGR2.all=0x0000;

       //
       //重置接收器,右对齐字,数字回送断开
       //
       McbspaRegs.pcr.bit.CLKXM=1;
       McbspaRegs.pcr.bit.CLKRM=0;
       McbspaRegs.pcr.bit.SCLKME=0;
       McbspaRegs.pcr.bit.FSXM=1;
       McbspaRegs.pcr.bit.FSXP=1;
       McbspaRegs.SPCR1.bit.DLB=0;
       McbspaRegs.SRGR2.bit.CLKSM=1;

       //
       //与CLKXP/CLKRP一起确定时钟方案
       //
       McbspaRegs.SPCR1.bit.CLKSTP=3;//3.
       McbspaRegs.pcr.bit.CLKXP=0;
       McbspaRegs.pcr.bit.CLKRP=1;//1.

       //
       //主模式下的FSX设置时间1。 0表示从属模式(接收)
       //
       McbspaRegs.RCR2.bit.RDATDLY=2;//2.
       McbspaRegs.RCR2.bit.RCOMPAND=0;//首先为MSB
       McbspaRegs.RCR2.bit.RPHASE=0;
       McbspaRegs.RCR2.bit.RFIG=1;

       //
       //主模式下的FSX设置时间1。 0表示从属模式(传输)
       //
       McbspaRegs.XCR2.bit.XDATDLY=1;
       McbspaRegs.XCR2.bit.XCOMPAND=0;//首先为MSB
       McbspaRegs.XCR2.bit.XPhase=0;
       McbspaRegs.XCR2.bit.XCONFIG=1;

       McbspaRegs.RCR1.bit.RWDLEN1=2;
       McbspaRegs.RCR1.bit.RFRLEN1=0;
       McbspaRegs.XCR1.bit.XWDLEN1=2;
       McbspaRegs.XCR1.bit.XFRLEN1=0;

       //// CLKSM=1,FPER = 1 CLKG周期
       McbspaRegs.SRGR2.bit.fsgm=0;
       McbspaRegs.SRGR1.all=0x0003; //帧宽度=1 CLKG周期,CLKGDV=5
       McbspaRegs.SPCR2.bit.GRST=1;    //启用采样率生成器
       delay_loop();//                   至少等待2个SRG时钟周期

     McbspaRegs.SPR2.bit.XRST = 1;
     McbspaRegs.SPCR1.bit.RRST = 1;