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.

[参考译文] TMS320F28069:McBSP SPI 模式 DMA

Guru**** 2041660 points
Other Parts Discussed in Thread: C2000WARE, LAUNCHXL-F28069M
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/876353/tms320f28069-mcbsp-spi-mode-dma

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARELAUNCHXL-F28069M

您好!

我们已使用 TI 提供的示例将 DMA 与 SPI 模块配合使用。 我们如何最大限度地提高数据传输速度? 我们需要在代码中修改哪些参数? 在 TI 提供的示例中、SPI 时钟大约为1-2 MHz、但我们需要更快的数据传输速率。 高度赞赏紧急反应。

谢谢  

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

    乔治

    C2000Ware McBSP (SPI)模式使用 LSPCLK (@20MHz)作为输入时钟、SRGR1.CLKGDV = 0xF。 您需要使用 LOSPCP 寄存器(或)增加 LSPCLK 以减少 SRGR1.CLKGDV 以增加 SPICLK 频率。

    此致、

    曼诺伊

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

    您好、Manoj、

    #define CPU_SPD             80E6

    #define McBSP_SRG_FREQ      CPU_SPD/2

    #define CLKGDV_VAL          1.

    SysCtrlRegs.LOSPCP。all = 0x0002;

    SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;
    更改上述值(LOSPCP 除外)不会对时钟频率产生任何影响。 例如、我们尝试了 CLKGDV_VAL 的不同值 、但注意到没有变化。 将 LOSPCP 从2解码为1将时钟频率从1.2MHz 加倍至2.5MHz。 还有其他建议吗? 非常感谢。

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

    乔治

    我不知道这些宏定义。 您正在运行哪个示例代码。 我建议您在 C2000Ware 中尝试以下示例项目。

    \device_support\f2806x\examples\c28\McBSP_SPI_loopback

    此致、

    曼诺伊

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

    Manoj、

    运行与您提到的相同的代码。 请检查" F2806X_McBSP.c "文件。

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

    乔治

    您需要使 init_McBSP_SPI 函数中的更改在 example_2806xMcBSP_SPI_DLB.c 文件中可用。

    示例工程不使用 F2806x_McBSP.c 文件中下面显示的宏定义

    #define CPU_SPD             80E6

    //
    // SRG 输入为 LSPCLK (SYSCLKOUT/2)
    //
    #define McBSP_SRG_FREQ      CPU_SPD/2

    #define CLKGDV_VAL          1.

    //
    // 2个 SRG 周期中的 CPU 周期数-初始化延迟
    //
    #define McBSP_init_delay    2*(CPU_SPD/McBSP_SRG_FREQ)

    //
    // 2个 CLKG 周期中的 CPU 周期数-初始化延迟
    //
    #define McBSP_CLKG_DELAY    2*(CPU_SPD/(McBSP_SRG_FREQ/(1+CLKGDV_VAL)))

    此致、

    曼诺伊

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

    您是否能够使用上述建议使 McBSP 以更高的频率工作?

    -Manoj

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

    不幸的是、不是。 更改 SRGR1.CLKGDV 无效。

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

    我目前被一个重要项目搁置了3天。 我将在本星期五之前对此进行研究并作出回应。

    此致、

    曼诺伊

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

    乔治

    只是想让您知道、我今天将对此进行研究。 我将在今天晚上公布最新情况。

    此致、

    曼诺伊

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

    乔治

    对代码进行了以下更改、并使 SPI 时钟= 18MHz。 请查看以下内容

    1) 1)修改 了 F2806x_McBSP.c 中的以下 InitMcbspaGpio 函数

    InitMcbspaGpio ()

    EALLOW;

    //主设备

    //将 GPIO 配置为 McBSP 信号

    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2;// GPIO22是 MCLKXA 引脚(SPICLK)

    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2;// GPIO23是 MFSXA 引脚(SPISTE)

    GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2;// GPIO20是 MDXA 引脚(MOSI)

    //将 GPIO 配置为异步

    GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 3;//异步输入 GPIO22 (MCLKXA)-(SPICLK)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;//异步输入 GPIO23 (MFSXA)-(SPISTE)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 3;//异步输入 GPIO29 (MDXA)-(MOSI)

    //从属方

    //将 GPIO 配置为 McBSP 信号

    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1;// GPIO58是 MCLKRA 引脚(SPICLK)

    GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 1;// GPIO44为 MFSRA 引脚(SPISTE)

    GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2;// GPIO21是 MDRA 引脚(SOMI)

    //将 GPIO 配置为异步

    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO58 (MCLKRA)-(SPICLK)

    GpioCtrlRegs.GPBQSEL1.bit.GPIO44 = 3;//异步输入 GPIO44 (MFSRA)-(SPISTE)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3;//异步输入 GPIO21 (MDRA)-(SOMI)

    EDIS;

    2) 2)在中的"外设时钟"功能中配置了 SYSCLK = LSPCLK = 90MHz (修改的 LOSPCP = 0 (SYSCLK / 1)

    Example_2806xMcBSP_SPI_DLB.c 文件。

    3) CLKG = LSPCLK /(CLKGDV + 1)= 90MHz /(4+ 1)= 18MHz。

       (修改了 MCbspaRegs.SRGR1.bit.CLKGDV = 4;)在 Example_2806xMcBSP_SPI_DLB.c 文件中的 INIT_McBSP_SPI 函数中。

    此致、

    曼诺伊

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

    您好、Manoj、

    谢谢。 您能否查看我们的以下代码以查看您是否发现任何问题? 基本上、我们尝试使用 McBSP 在 SPI 上实现 DMA。  

    //######################################################################################################################

    //
    //文件:  main.c
    //
    //标题: 带有 DMA 的 McBSP 环回示例
    //
    //! addtogroup f2806x_example_list
    //!

    具有 DMA 的 McBSP 环回(McBSP_loopback_DMA)


    //!
    //!  此程序是使用内部回送的 McBSP 示例
    //!  外设并利用 DMA 从一个缓冲器传输数据
    //!  McBSP、然后从 McBSP 到另一个缓冲器。
    //!
    //!  最初、sdata[]被0x0000- 0x007F 的值填充。
    //!  DMA 将 sdata[]中的值逐个移动到 DXRx
    //!  McBSP 的寄存器。 这些值被传输和
    //!  随后由 McBSP 接收。 然后、DMA 会移动每个
    //!  将数据值更改为 RDATA[]、因为 McBSP 接收到该数据。
    //!
    //!  发送的数据缓冲区将在:\n 之间交替
    //!     0000 0001 0002 0003 0004 0005… 007F  \n
    //!  和\n
    //!     FFFF FFFE FFFD FFFC FFFB FFFA…        \n
    //!
    //!  可以测试三种不同的 McBSP 串行字大小。
    //!  在编译此项目之前、请选择串行字
    //!  大小为8、16或32、方法是在上使用\#define 语句
    //!  代码开始。
    //!
    //!  此示例使用 DMA 通道1和2中断。
    //!  系统会检查传入数据的准确性。  是否存在错误
    //!  发现调用了 error()函数并停止执行。
    //!
    //!  默认情况下、McBSP 示例是 McBSP 采样率发生器
    //!  (SRG)输入时钟频率为 LSPCLK (80E6/4)
    //!  假设 SYSCLKOUT=80MHz。
    //!
    //!  此示例将一直执行、直到用户终止。
    //!
    //!  b 监视\b 变量:\n
    //!  -sdata -已发送数据缓冲区
    //!  -RDATA -接收到的数据缓冲区
    //
    //######################################################################################################################
    //$TI 发行版:F2806x 支持库 v2.03.00.00 $
    //$Release Date:Sun Mar 25 13:24:47 CDT 2018 $
    //版权所有:
    //版权所有(C) 2009-2018 Texas Instruments Incorporated - "="">www.ti.com/.../a>
    //
    //以源代码和二进制形式重新分发和使用,有无
    //如果满足以下条件,则允许进行修改
    //满足:
    //
    //  重新分发源代码必须保留上述版权
    //  注意、此条件列表和以下免责声明。
    //
    //  二进制形式的重新分发必须复制上述版权
    //  注意、中的条件列表和以下免责声明
    //  随提供的文档和/或其他材料
    //  分布。
    //
    //  德州仪器公司的名称和的名称都不是
    //  其贡献者可用于认可或推广衍生产品
    //  未经特定的事先书面许可,从该软件下载。
    //
    //本软件由版权所有者和作者提供
    //“原样”以及任何明示或暗示的保证,包括但不包括
    //限于对适销性和适用性的暗示保证
    //一个特定的目的是免责的。 在任何情况下、版权均不得
    //所有者或贡献者应对任何直接、间接、偶然、
    //特殊、典型或必然的损害(包括但不包括)
    //仅限于采购替代货物或服务;
    //数据或利润;或业务中断)
    //责任理论,无论是合同责任、严格责任还是侵权行为
    //(包括疏忽或其他)以任何方式因使用而产生
    //此软件,即使已被告知可能会发生此类损坏。
    //$
    //######################################################################################################################
    #include "DSP28x_Project.h"    //器件头文件和示例 include 文件
    //选择字大小。  取消注释以下行之一
    #define WORD_SIZE 8    //以8位模式运行环回测试
    //#define WORD_SIZE 16     //以16位模式运行环回测试
    //#define WORD_SIZE 32     //以32位模式运行环回测试
    _interrupt void local_D_INTCH1_ISR (void);
    _interrupt void local_D_INTCH2_ISR (void);
    void McBSP_init_dlb (void);
    void init_dma (void);
    void init_dma_32 (void);
    void start_dma (void);
    void 错误(void);
    void delay_loopp (void);
    //
    //将 sdata 和 RDATA 缓冲区放置在 DMA 可访问的 RAM 中(本例为 L5)
    //
    #pragma DATA_SECTION (sdata、"DMARAML5")
    #pragma DATA_SECTION (RDATA、"DMARAML5")
    uint16 sdata[128];   //发送的数据
    uint16 RDATA[128];   //接收的数据
    uint16 data_size;    //字长变量
    无效
    DELAY_LOOP()

       双 j;
       对于(j = 0;j < 4000000;j++)
       {
       }
    空 init_McBSP_SPI (空)

       //
       // McBSP-A 寄存器设置
       //
       //
       //重置 FS 发生器、采样率发生器和发送器
       //
       McbspaRegs.SPCR2.all=0x0000;
       //
       //重置接收器,右对齐字,数字回送中断
       //
       McbspaRegs.SPCR1.all=0x0000;
       McbspaRegs.pcr.all=0x0F08;      //(CLKXM=CLKRM=FSXM=FSRM=1、FSXP=1)
      McbspaRegs.SPCR1.bit.DLB = 1;
       //
       //与 CLKXP/CLKRP 一起确定时钟方案
       //
       McbspaRegs.SPCR1.bit.CLKSTP= 2;
       McbspaRegs.pcr.bit.CLKXP = 0;  // CPOL = 0、CPHA = 0上升沿无延迟
       McbspaRegs.pcr.bit.CLKRP = 0;
       //
       //在主控模式下 FSX 设置时间1。 0表示从机模式(接收)
       //
       McbspaRegs.RCR2.bit.RDATDLY=01;
       //
       //在主控模式下 FSX 设置时间1。 0表示从机模式(发送)
       //
       McbspaRegs.XCR2.bit.XDATDLY=01;
       McbspaRegs.RCR1.bit.RWDLEN1=0;  // 32位字
       McbspaRegs.XCR1.bit.XWDLEN1=0;  // 32位字
       McbspaRegs.SRGR2.all=0x2000;    // CLKSM=1、FPER = 1个 CLKG 周期
       McbspaRegs.SRGR1.All= 0x000F;   //帧宽度= 1 CLKG 周期、CLKGDV=16
       McbspaRegs.SPCR2.bit.GRST=1;    //启用采样率发生器
       delay_loop ();                   //等待至少2个 SRG 时钟周期
       McbspaRegs.SPCR2.bit.XRST=1;    //从复位中释放 TX
       McbspaRegs.SPCR1.bit.RRST=1;    //从复位中释放 RX
       McbspaRegs.SPCR2.bit.frst=1;    //帧同步发生器复位
    //
    //步骤7. 插入所有本地中断服务例程(ISR)和函数
    //此处:
    //
    空错误(空)

       _asm ("    ESTOP0");//测试失败!! 停下来!
       适用于(;);
    void McBSP_init_dlb ()

       //
       //重置 FS 发生器、采样率发生器和发送器
       //
       McbspaRegs.SPCR2.all=0x0000;
       McbspaRegs.SPCR1.all=0x0000;       //复位接收器、右对齐字
       //
       //启用 DLB 模式。 针对非 DLB 模式注释掉。
       //
      McbspaRegs.SPCR1.bit.DLB = 1;
       McbspaRegs.MFFINT.All=0x0;         //禁用所有中断
       //
       //单相帧,1字/帧,无压扩 (接收)
       //
       McbspaRegs.RCR2.All=0x0;
       McbspaRegs.RCR1.All=0x0;
       //
       //单相帧,1字/帧,无压扩 (发送)
       //
       McbspaRegs.XCR2.All=0x0;
       McbspaRegs.XCR1.All=0x0;
       //
       // CLKSM=1 (如果 SCLKME=0、到 SRG 的 I/p 时钟为 LSPCLK)
       //
       McbspaRegs.SRGR2.bit.CLKSM = 1;
       McbspaRegs.SRGR2.bit.FPER = 31;    // FPER = 32 CLKG 周期
       McbspaRegs.SRGR1.bit.FWID = 0;     //帧宽度= 1 CLKG 周期
       McbspaRegs.SRGR1.bit.CLKGDV = 0;   // CLKG 频率= LSPCLK/(CLKGDV+1)
       //
       // FSX 在内部生成,FSR 源自外部源
       //
       McbspaRegs.pcr.bit.FSXM = 1;
       //
       //在内部生成 CLKX,CLKR 源自外部源
       //
       McbspaRegs.pcr.bit.CLKXM = 1;
       //
       //初始化 McBSP 数据长度
       //
       if (data_size = 8)            //在8位模式下运行回送测试
       {
           InitMcbspa8bit();
       }
       if (data_size = 16)           //在16位模式下运行回送测试
       {
           InitMcbspa16bit();
       }
       if (data_size = 32)           //在32位模式下运行回送测试
       {
           InitMcbspa32位();
       }
       //
       //启用采样率发生器
       //
       McbspaRegs.SPCR2.bit.GRST=1;  //启用采样率发生器
       delay_loop ();                 //等待至少2个 SRG 时钟周期
       McbspaRegs.SPCR2.bit.XRST=1;  //从复位中释放 TX
       McbspaRegs.SPCR1.bit.RRST=1;  //从复位中释放 RX
       McbspaRegs.SPCR2.bit.frst=1;  //帧同步发生器复位

    //数据大小<= 16位的 DMA 初始化
    空 init_dma()

       EALLOW;
       DMACTRL.bit.hardreset = 1;
       _asm (" NOP");                        //每个设计只需要1个 NOP
       DMaRegs.CH1.MODE.BIT.CHINTE = 0;
       //
       //通道1,McBSPA 发送
       //
       DmaRegs.CH1.burse_size.all = 0;    // 1字/突发
       DmaRegs.CH1.SRC_BURST_STEP = 0;    //使用1个字/突发时无效
       DmaRegs.CH1.dst_burst_step = 0;    //使用1个字/突发时无效
       //
       //每帧中断(127次突发/传输)
       //
       DMARegs.CH1.TRANSF_SIZE = 127;
       //
       //在突发中的每个字之后移动到缓冲区中的下一个字
       //
       DMARegs.CH1.SRC_TRANSFER_STEP = 1;
       //
       //不要移动目标地址
       //
       DmaRegs.CH1.dst_transfer_step = 0;
       //
       //起始地址=缓冲区
       //
       DmaRegs.CH1.SRC_ADDR_SHADDow =(uint32)&sdata[0];
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.CH1.SRC_BGE_ADDR_SHADDADDADDR_SHADOW =(uint32)&sdata[0];
       //
       //起始地址= McBSPA DXR
       //
       DmaRegs.CH1.dst_ADDR_SHADDow =(uint32)&McbspaRegs.DXR1.all;
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.CH1.dst_beg_ADDR_SHADDow =(uint32)&McbspaRegs.DXR1.all;
       //
       //清除外设中断事件标志
       //
       DmaRegs.ch1.control.bit.PERINTCLR = 1;
       DMARegs.CH1.CONTROL.BIT.ERRCLR = 1;    //清除同步错误标志
       //
       //设置为最大值-不希望目标换行
       //
       DmaRegs.CH1.dst_wrap_size = 0xFFFF;
       //
       //设置为最大值-不希望源代码换行
       //
       DMARegs.CH1.SRC_WOP_SIZE = 0xFFFF;
       //
       //启用通道中断
       //
       DMaRegs.CH1.MODE.BIT.CHINTE = 1;
       //
       //传输结束时中断
       //
       DMaRegs.CH1.MODE.BIT.CHINTMODE = 1;
       //
       //启用外设中断事件
       //
       DMaRegs.CH1.MODE.BIT.PERINTE = 1;
       //
       //外设中断选择= McBSP MXSYNCA
       //
       DMARegs.CH1.MODE.BIT.PERINTSEL = DMA_MXEVTA;
       //
       //清除任何伪中断标志
       //
       DmaRegs.ch1.control.bit.PERINTCLR = 1;
       //
       //通道2、McBSPA 接收
       //
       DMaRegs.CH2.MODE.BIT.CHINTE = 0;
       DmaRegs.ch2.burse_size.all = 0;    // 1字/突发
       DmaRegs.CH2.SRC_BURST_STEP = 0;    //使用1字/突发时无效
       DmaRegs.CH2.dst_burst_step = 0;    //使用1个字/突发时无效
       DmaRegs.CH2.transfer_size = 127;   //每隔127个突发/传输中断一次
       DmaRegs.CH2.SRC_TRANSFER_STEP = 0; //不要移动源地址
       //
       //在突发中的每个字之后移动到缓冲区中的下一个字
       //
       DmaRegs.CH2.dst_transfer_step = 1;
       //
       //起始地址= McBSPA DRR
       //
       DmaRegs.CH2.SRC_ADDR_SHADDow =(uint32)&McbspaRegs.DRR1.all;
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.CH2.SRC_beg_ADDR_SHADDADDR_SHADDADD=(uint32)&McbspaRegs.DRR1.all;
       //
       //起始地址=接收缓冲区(对于 McBSP-A)
       //
       DmaRegs.CH2.dst_ADDR_SHADDow =(uint32)&RDATA[0];
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.ch2.dst_beg_ADDR_shadow =(uint32)&RDATA[0];
       //
       //清除外设中断事件标志
       //
       DmaRegs.ch2.control.bit.PERINTCLR = 1;
       DMARegs.CH2.CONTROL.BIT.ERRCLR = 1;    //清除同步错误标志
       //
       //设置为最大值-不希望目标换行
       //
       DmaRegs.CH2.dst_wrap_size = 0xFFFF;
       //
       //设置为最大值-不希望源代码换行
       //
       DMARegs.CH2.SRC_WOP_SIZE = 0xFFFF;
       DmaRegs.CH2.MODE.BIT.CHINTE = 1;     //启用通道中断
       DMaRegs.CH2.MODE.BIT.CHINTMODE = 1;  //传输结束时中断
       DMaRegs.CH2.MODE.BIT.PERINTE = 1;    //启用外设中断事件
       //
       //外设中断选择= McBSP MRSYNCA
       //
       DMARegs.CH2.MODE.BIT.PERINTSEL = DMA_MREVTA;
       //
       //清除任何伪中断标志
       //
       DmaRegs.ch2.control.bit.PERINTCLR = 1;
       EDIS;
    //
    // init_dma_32 -针对大于16位和<= 32位的数据大小进行 DMA 初始化。
    //
    空 init_dma_32 ()

       EALLOW;
       DMACTRL.bit.hardreset = 1;
       _asm (" NOP");                        //每个设计只需要1个 NOP
       //
       //通道1,McBSPA 发送
       //
       DmaRegs.ch1.burse_size.all = 1;    // 2字/突发
       DmaRegs.CH1.SRC_BURST_STEP = 1;    //递增1个16位地址。 二字
       DmaRegs.CH1.dst_burst_step = 1;    //递增1个16位地址。 二字
       DMARegs.CH1.TRANSFER_SIZE = 63;    //每隔63次突发/传输中断一次
       //
       //在突发中的每个字之后移动到缓冲区中的下一个字
       //
       DMARegs.CH1.SRC_TRANSFER_STEP = 1;
       DmaRegs.CH1.dst_transfer_step = 0xFFFF;    //返回 DXR2
       DmaRegs.CH1.SRC_ADDR_SHADDow =(uint32)&sdata[0];//起始地址=缓冲区
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.CH1.SRC_BGE_ADDR_SHADDADDADDR_SHADOW =(uint32)&sdata[0];
       //
       //起始地址= McBSPA DXR2
       //
       DmaRegs.CH1.dst_ADDR_SHADDow =(uint32)&McbspaRegs.DXR2.all;
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.CH1.dst_beg_ADDR_SHADDow =(uint32)&McbspaRegs.DXR2.all;
       DMARegs.CH1.CONTROL.BIT.ERRCLR = 1;    //清除同步错误标志
       //
       //设置为最大值-不希望目标换行
       //
       DmaRegs.CH1.dst_wrap_size = 0xFFFF;
       //
       //设置为最大值-不希望源代码换行
       //
       DMARegs.CH1.SRC_WOP_SIZE = 0xFFFF;
       DmaRegs.CH1.MODE.BIT.CHINTE = 1;    //启用通道中断
       DMaRegs.CH1.MODE.BIT.CHINTMODE = 1; //传输结束时中断
       DMaRegs.CH1.MODE.BIT.PERINTE = 1;   //启用外设中断事件
       //
       //外设中断选择= McBSP MXSYNCA
       //
       DMARegs.CH1.MODE.BIT.PERINTSEL = DMA_MXEVTA;
       //
       //清除任何伪中断标志
       //
       DmaRegs.ch1.control.bit.PERINTCLR = 1;
       //
       //通道2、McBSPA 接收
       //
       DmaRegs.ch2.burse_size.all = 1;    // 2个字/突发
       DmaRegs.CH2.SRC_BURST_STEP = 1;    //递增1个16位地址 二字
       DmaRegs.CH2.dst_burst_step = 1;    //递增1个16位地址。 二字
       DmaRegs.CH2.transfer_size = 63;    //每隔63次突发/传输中断一次
       DmaRegs.CH2.SRC_TRANSF_STEP = 0xFFFF;//减量 返回 DRR2
       //
       //在突发中的每个字之后移动到缓冲区中的下一个字
       //
       DmaRegs.CH2.dst_transfer_step = 1;
       //
       //起始地址= McBSPA DRR
       //
       DmaRegs.CH2.SRC_ADDR_SHADDow =(uint32)&McbspaRegs.DRR2.all;
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.CH2.SRC_beg_ADDR_SHADDADDR_SHADDADD=(uint32)&McbspaRegs.DRR2.all;
       //
       //起始地址=接收缓冲区(对于 McBSP-A)
       //
       DmaRegs.CH2.dst_ADDR_SHADDow =(uint32)&RDATA[0];
       //
       //除非使用换行功能,否则不需要
       //
       DmaRegs.ch2.dst_beg_ADDR_shadow =(uint32)&RDATA[0];
       DMARegs.CH2.CONTROL.BIT.ERRCLR = 1;    //清除同步错误标志
       //
       //设置为最大值-不希望目标换行
       //
       DmaRegs.CH2.dst_wrap_size = 0xFFFF;
       //
       //设置为最大值-不希望源代码换行
       //
       DMARegs.CH2.SRC_WOP_SIZE = 0xFFFF;
       DmaRegs.CH2.MODE.BIT.CHINTE = 1;      //启用通道中断
       DMaRegs.CH2.MODE.BIT.CHINTMODE = 1;   //传输结束时中断
       DMaRegs.CH2.MODE.BIT.PERINTE = 1;     //启用外设中断事件
       //
       //外设中断选择= McBSP MRSYNCA
       //
       DMARegs.CH2.MODE.BIT.PERINTSEL = DMA_MREVTA;
       //
       //清除任何伪中断标志
       //
       DmaRegs.ch2.control.bit.PERINTCLR = 1;
       EDIS;
    void start_dma (void)

       EALLOW;
       DMARegs.CH1.control.bit.run = 1;    //开始从 McBSP-A 传输 DMA
       DmaRegs.ch2.control.bit.run = 1;    //开始从 McBSP-A 接收 DMA
       EDIS;
    //
    // local_D_INTCH1_ISR - INT7.1是 DMA Ch1
    //
    _interrupt void local_D_INTCH1_ISR (void)

       EALLOW;    //需要在 ISR 内执行 EALLOW!!!
       DmaRegs.ch1.control.bit.halt = 1;
       //
       //要接收来自此 PIE 组的更多中断,请确认
       //中断
       //
       PieCtrlRegs.PIEACX.ALL = PIEACK_group7;
       DmaRegs.ch1.control.bit.run = 1;//   *******
      //GpioDataRegs.GPBTOGGL.bit.GPIO39 = 1;  //加载输出锁存器
      // GpioDataRegs.GPATOGGL.bit.GPIO26 = 1;  //加载输出锁存器
      //delay_loopp();
      // GpioDataRegs.GPBTOGGL.bit.GPIO34 = 1;  //启用 GPIO8上的上拉
       EDIS;
       返回;
    //
    // local_D_INTCH2_ISR - INT7.2为 DMA 通道2
    //
    _interrupt void local_D_INTCH2_ISR (void)

       uint16 i;
       EALLOW;        //需要在 ISR 内执行 EALLOW!!!
       DmaRegs.ch2.control.bit.halt = 1;
       //
       //要接收来自此 PIE 组的更多中断,请确认
       //中断
       //
       PieCtrlRegs.PIEACX.ALL = PIEACK_group7;
       DmaRegs.ch2.control.bit.run = 1; // ********
       GpioDataRegs.GPATOGGLE.bit.GPIO26 = 1;  //加载输出锁存器

       (i=0;i<128;i++)
       {
           if (data_size = 8)
           {
               if (((RDATA[I]&0x00FF)!=(sdata[I]&0x00FF))
               {
                   error();//检查收到的数据是否正确
               }
           }
           否则、如果(DATA_SIZE = 16)
           {
               if (RDATA[i]!= sdata[i])
               {
                   error(); //如果出现错误则停止!!
               }
           }
           否则、如果(DATA_SIZE = 32)
           {
               if ((RDATA[i])!=(sdata[i]))
               {
                   错误();
               }
           }
       }
       EDIS;
       返回;
    void main (void)

       uint16 i;
       InitSysCtrl();
       InitMcbspaGpio();
       Dint;
       InitPieCtrl();
       IER = 0x0000;
       IFR = 0x0000;
       InitPieVectTable();
       EALLOW;    //允许访问 EALLOW 受保护的寄存器
       PieVectTable.DINTCH1=&LOCAL_D_INTCH1_ISR;
       PieVectTable.DINTCH2=&LOCAL_D_INTCH2_ISR;
       EDIS;      //禁用对 EALLOW 受保护寄存器的访问

       DATA_SIZE =字大小;

       对于(i=0;i< 128;i++)
       {
           sdata[i]= i;     //用0到0x007F 之间的值填充 sdata
           // sdata[i+1]= sdata[i]+0x01;
           RDATA[i]= 0;     //将 RDATA 初始化为所有0x0000。
       }
       如果(DATA_SIZE = 32)
       {
           init_dma_32 ();    // 32位传输的 DMA 初始化
       }
       其他
       {
           //
           // 1. 使用 DMA 时、首先使用外设中断来初始化 DMA
           //
           init_dma();
       }
       start_dma();
       //
       // 2.  然后初始化外设并从复位中释放外设(McBSP)
       //
    //   McBSP_init_dlb ();
       init_McBSP_SPI ();

       //启用此示例所需的中断
       //
       PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //启用 PIE 块
       PieCtrlRegs.PIEIER7.bit.INTx1 = 1; //启用 PIE 组7、INT 1 (DMA CH1)
       PieCtrlRegs.PIEIER7.bit.INTx2 = 1; //启用 PIE 组7、INT 2 (DMA CH2)
       IER = 0x40;                           //启用 CPU INT 组7
       EINT;                               //启用全局中断
       EALLOW;
       GpioCtrlRegs.GPBPUD.bit.GPIO34 = 1; //启用 GPIO34上的上拉
       GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// GPIO34 = GPIO34
       GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34 =输入
       GpioCtrlRegs.GPBPUD.bit.GPIO39 = 0;  //启用 GPIO8上的上拉
       GpioDataRegs.GPBSET.BIO39 = 1;  //加载输出锁存器
       GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0; // GPIO8 = GPIO8
       GpioCtrlRegs.GPBDIR.bit.GPIO39 = 1;  // GPIO8 =输出
       GpioCtrlRegs.GPAPUD.bit.GPIO26 = 1; //启用 GPIO34上的上拉
       GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;// GPIO34 = GPIO34
       GpioCtrlRegs.GPADIR.bit.GPIO26 = 1; // GPIO34 =输入

       EDIS;
       //
       for (;;)
       {
           //GpioDataRegs.GPATOGGL.bit.GPIO26 = 1;  //加载输出锁存器
          //GpioDataRegs.GPBTOGGL.bit.GPIO39 = 1;  //加载输出锁存器
          //delay_loopp();
           GpioDataRegs.GPBSET.BIO34 = 1;  //加载输出锁存器
           GpioDataRegs.GPBSET.BIO39 = 1;  //加载输出锁存器
           delay_loopp();
           GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;  //加载输出锁存器
           GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1;  //加载输出锁存器
           delay_loopp();
           //delay_loopp();
       }
           ;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您还可以上传完整的代码吗? 您使用的代码与我们的代码不同!

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

    您正尝试使用 DMA - SPI 接口实现什么目标? 请提供更多有关您希望 DMA 做什么的详细信息? 很难读取每一行代码来确定您要执行的操作。

    此致、

    曼诺伊

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

    您好、Manoj、

    1-您可以将您修改后的代码发送给我们,以便在 SPI 上获得18MHz 的频率,发送给此电子邮件( georgeandromeda2000@yahoo.com)吗? 对 TI 提供的原始 SPI 代码进行上述更改时、我们不会获得相同的结果。 (Example_2806xMCBSP_SPI_DLB)。 如果我们可以 在我们的设置(LAUNCHXL-F28069M TI 评估板)上成功测试您的代码,我们可以确认我们的设置正确。  

    2- 关于您的问题, 我们从这里( https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/706039/2602073?tisearch=e2e-sitesearch&keymatch=mcbsp_loopback_dma#pi320995filter=all&pi320995scroll=false )开始使用 SPI 模块实施 DMA 事务。  

    我们只是从这里复制了代码、并用它替换了 TI 示例中的 Example_2806xMcBSP_DLB_DMA.c 文件。 未对 TI 提供的示例代码进行任何其他更改。 代码似乎在处理一些小问题、您可以查看我们的代码以查看我们的错误情况吗?  

    感谢您在这方面的紧急帮助。

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

    乔治

    很抱歉、回复此主题帖较晚。 我在星期五下班了。

    正如我在上一个帖子中提到的、您需要解释一下什么是有效的以及上面发送的代码中没有的代码、以便我查看。 我认为您的 McBSP (SPI)代码工作正常并且您希望 DMA 处理发送和接收操作是否正确? 使用示波器时、您是否看到正确的 McBSP 发送消息?

    此致、

    曼诺伊

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

    您好、Manoj、

    谢谢!  TI 的原始 McBSP (SPI)代码唯一的问题是、您建议的更改不会更改 SPI 时钟速度。 这就是我们要求您修改后的代码以了解其工作原理的原因。

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

    乔治

    我在 2020年2月10日星期一下午2:34上发布的帖子 汇总了对以下文件所做的更改列表:-

    这些文件包括我所做的所有更改、您应该能够将其包含在您的 McBSP_SPI_loopback 项目中。 我的理解是、在我在帖子中建议的更改之后、您还能够观察到18MHz 的 SPI 时钟。

    e2e.ti.com/.../F2806x_5F00_Mcbsp.c

    e2e.ti.com/.../F2806x_5F00_SysCtrl.c

    e2e.ti.com/.../Example_5F00_2806xMcBSP_5F00_SPI_5F00_DLB.c

    此致、

    曼诺伊