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.

[参考译文] LAUNCHXL-F28379D:F28379D SPI 和 DMA

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/769030/launchxl-f28379d-f28379d-spi-and-dma

器件型号:LAUNCHXL-F28379D

大家好

嗯、我正在使用 DMA (F28379D Launch Pad)将数据从 SPI 主设备发送到从设备。 数据被接收到
将 FIFO 水平配置为 8 个字或更低、并将突发配置为7。  

当我把 FIFO 水平更改为16,15… 9突发到15,14,… 8、接收到的数据变为未排列、就像在发送端一样、某些数据丢失。

请提出任何建议?

此致  

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

    我将在结尾处尝试重现此问题、并返回给您。

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

    非常感谢 Veena、我将继续关注。

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

    只需确认一下、是否将突发大小配置为16-FIFOLVL 进行发送?

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

    你(们)好、Veena
    我使用了2种配置。 第一个是突发大小= FIFOLVL -1、它适用于8个 FIFO 字或更低的字、如我的帖子中所述。 2ed 情况下的突发大小= (16–TXFFIL)–1 (参考手册:2137)、这不起作用。

    此致、

    霍萨姆

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

    它取决于是 Tx 侧还是 Rx 侧。

    对于发送数据、DMA 突发大小应等于16-TXFFIL。 对于接收数据、DMA 突发大小必须为 RXFFIL。
    请注意、实际的寄存器内容将突发大小- 1. 如果您使用的是 driverlib API dma_configBurst、则 API 会将该值递减1。

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

    您好 Veena
    很抱歉、仍然存在同样的问题。

    期待收到您的回复。

    谢谢  

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

    您能否共享您正在使用的代码?

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

    你(们)好、Veena  
    以下是根据 TI 示例修改的代码。


    //
    #include "F28x_Project.h"

    //
    //定义
    //
    #define TXBUST (16-TXFIFO_LVL)-1 //突发大小应小于8
    #define 传输3 //[(MEM_buffer_size/FIFO_LVL)-1]
    #define TXFIFO_LVL 15 // FIFO 中断级别

    #define RXBUST RXFIFO_LVL-1 //突发大小应小于8
    #define RXFIFO_LVL 15 // FIFO 中断级别
    //
    //全局
    //
    #pragma DATA_SECTION (sdata、"ramgs0");//将 TX 数据映射到存储器
    #pragma DATA_SECTION (RDATA、"ramgs1");//将 RX 数据映射到存储器
    uint16 sdata[128];//发送数据缓冲区
    uint16 RDATA[128];//接收数据缓冲区

    易失性 uint16 * DMADest;
    易失性 uint16 * DMASSOURCE;

    void dma_init (void);
    void SPI_Fifo_init (void);

    //
    //主函
    //
    void main (void)

    uint16 i;

    InitSysCtrl();
    InitSpiaGpio();

    Dint;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();
    //
    //步骤4. 初始化器件外设:
    //
    dma_init ();//为 SPI 配置设置 DMA

    EALLOW;
    CpuSysRegs.SECMSEL.bit.PF2SEL = 1;//确保 DMA 连接到外设帧2桥(EALLOW 受保护)
    EDIS;
    SPI_Fifo_init();//仅初始化 SPI
    //
    //初始化数据缓冲区
    //
    对于(i=0;i<128;i++)

    sdata[i]= i;
    RDATA[i]=0;

    StartDMACH6();
    StartDMACH5();

    while (1)


    //
    // SPI_Fifo_init -初始化 SPIA FIFO
    //
    void SPI_Fifo_init()

    // SPIA FIFO 寄存器配置
    SpibRegs.SPIFFTX.bit.TXFFIL = TXFIFO_LVL;
    SpibRegs.SPIFFRX.bit.RXFFIL = RXFIFO_LVL;//设置 RX FIFO 电平
    SpiaRegs.SPIFFTX.bit.TXFFIL = TXFIFO_LVL;//设置 TX FIFO 电平
    SpiaRegs.SPIFFRX.bit.RXFFIL = RXFIFO_LVL;
    SpiaRegs.SPIFFTX.bit.SPIFFENA=1;
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
    SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
    SpiaRegs.SPIFFTX.bit.SPIRST = 1;
    // SPIB FIFO 寄存器配置
    SpibRegs.SPIFFTX.bit.SPIFFENA=1;
    SpibRegs.SPIFFTX.bit.TXFFINTCLR = 1;
    SpibRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    SpibRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
    SpibRegs.SPIFFTX.bit.TXFIFO = 1;
    SpibRegs.SPIFFRX.bit.RXFIFORESET = 1;
    SpibRegs.SPIFFTX.bit.SPIRST = 1;

    //
    //初始化内核 SPIA 寄存器
    //
    InitSpi();

    //初始化内核 SPIB 寄存器
    SpibRegs.SPICCR.bit.SPISWRESET = 0;
    SpibRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpibRegs.SPICCR.bit.SPICHAR =(16-1);
    SpibRegs.SPICCR.bit.SPILBK = 1;

    SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;
    SpibRegs.SPICTL.bit.TALK = 1;
    SpibRegs.SPICTL.bit.CLK_PHASE = 0;
    SpibRegs.SPICTL.bit.SPIINTENA=0;

    //设置波特率
    SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x0F;/SPI_BRR;

    //设置空闲位
    //在断点上停止不会停止 SPI
    SpibRegs.SPIPRI.bit.FREE = 1;

    //解除 SPI 复位
    SpibRegs.SPICCR.bit.SPISWRESET = 1;

    //
    // dma_init - TX 和 RX 通道的 DMA 设置。
    //
    void dma_init()

    //
    //初始化 DMA
    //
    DMAInitialize();

    DMASource =(volatile UINT16 *) sdata;
    DMADest =(易失性 UINT16 *) RDATA;

    //
    //为 TX 配置 DMACH5
    //
    DMACH5AddrConfig (SpiaRegs.SPITXBUF、DMASource);
    DMACH5BurstConfig (TXBUST、1、0);//突发大小、src 步长、dest 步长
    DMACH5TransferConfig (transfer、1、0);//传输大小、src 阶跃、dest 阶跃
    DMACH5ModeConfig (DMA_SPIATX、PERINT_ENABLE、OneShot_disable、CONT_ENABLE、
    SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、
    Chint_end、CHINT_DISABLE);

    //
    //为 RX 配置 DMA CH2
    //
    DMACH6AddrConfig (DMADest、SpibRegs.SPIRXBUF);
    DMACH6BurstConfig (RXBUST、0、1);
    DMACH6TransferConfig (传输、0、1);
    DMACH6ModeConfig (DMA_SPIBRX、PERINT_ENABLE、OneShot_disable、CONT_ENABLE、
    SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、
    Chint_end、CHINT_DISABLE);

    //
    //文件结束
    //

    此致

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

    您好!

    我稍微更新了您的代码、使其在我的环境中运行。 我将 TX 和 RX FIFO 深度更改为12、并且能够看到数据被正确接收。

    您能否重新检查您正在使用的 SPI/DMA 配置

    附加我使用的代码

    e2e.ti.com/.../new.c

    此致、

    Veena

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

    您好!

    要添加、要配置的 TX 传输大小必须为(字数)/(16 - TXFIFO_LVL)-1而不是(字数)/(TXFIFO_LVL)-1

    这是因为突发大小为16 - TXFIFO_LVL、而不 是 TXFIFO_LVL

    此致、
    Veena

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

    你(们)好、Veena  
    感谢您的努力、是的、您的代码在12和8 TX、RX FIFO 级别上工作、但在10、11、13、14 FIFO 级别上不工作。 对于 FIFO 级别的每次变化、我都将字数更改为整数。 我变得更加困惑。

    此致

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

    我将 FIFO 电平更改为10和11、我仍然看到数据被正确接收。 请注意、我将总数据大小更改为 FIFOLVL 和16-FIFOLVL 的倍数。 例如、如果我将 TX 和 RX FIFOLVL 置位为10、则 TX 突发大小为6、RX 突发大小为10、传输以6个字和10个字的块进行。 我将总缓冲器调整为6和10的倍数。

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

    您是否能够解决您的问题?

    此致、
    Veena
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Veena、
    很抱歉、同样的问题仍然存在。 但是、我不相信对每个 FIFO 水平进行特殊配置、即使该方程[(MEM_buffer_size/FIFO_LVL)-1]的结果也不是整数。 确保 TX/RX 突发必须正确、但正在讨论之前的公式结果。 由于以上两行的原因、代码应适用于任何数量的 FIFO (1-16)、而不会出现问题、除非存在硬件故障或另一个隐藏配置。

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

    我理解您的观点。 我能够再现您所谈论的问题。 我将与设计工程师讨论这一点、并与您联系。
    我要表达的一个建议是、我认为最好在 Tx 和 Rx 两侧保持相同的突发大小。 在 TX 端、一次发送 B 量的数据、在 Rx 端接收 B 量的数据。 我觉得这是一种更清洁的方法(我不确定这是否记录在 TRM 中。 我将与设计团队核实这是不是推荐的方法)。

    我更新了上述代码、将 TXFIFOLVL 设置为11、将 RXFIFOLVL 设置为5。 因此、TX DMA 一次传输5个数据、RX SPI 接收这5个数据、DMA 再次将这5个数据传输到 RAM。
    当我更新代码以将 TX 和 RX FIFOLVL 设置为11时、我发现接收到的数据已按顺序排列。 我不知道为什么会出现这种情况

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

    您使用的是 DMA 连续模式、这意味着即使在传输完成后、它也会重新初始化 DMA 以从开始重新传输数据。 您是否打算启用此选项? 如果您希望发送缓冲区一次、我建议您禁用连续模式。
    如果您通过内存浏览器/表达式窗口查看 rxData、则会发现它不符合顺序、因为调试器在内存浏览器中获取 rxData 内容时 DMA 传输仍在后台进行。 JTAG 在比 DMA 时钟慢得多的时钟上逐个读取 rxData 内容。 您可以通过在 DMA 中配置 DEBUGCTRL 寄存器中的 FREE 位来禁用此功能。 通过配置值0、DMA 传输将在您停止调试器时被冻结。

    希望这对您有所帮助。

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

    非常感谢 Veena 的努力、
    现在我已经知道了一点、但当禁用 DMA 的继续模式并使其自由运行时、数据会出现问题、但没关系。 感谢您的努力。  

    非常感谢