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.

[参考译文] TMS320F28379D:在 FIFO 中 DMA 传输到 SPI TX 的问题

Guru**** 2779935 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1609564/tms320f28379d-issues-with-dma-transfer-to-spi-tx-in-fifo

部件号: TMS320F28379D
主题: SysConfig 中讨论的其他器件

大家好:

我正在处理一个项目、希望 通过 SPI 将 F28379D 用作外设。 为此、我们要尝试配置器件以使用 DMA。  我们当前的测试设置是 Raspberry Pi 作为控制器、F28379D 作为外设。 目前、我们正在对内核 1 进行所有测试、以避免出现内存/外设所有权问题。

我们已通过使用写入/读取阻止命令验证此设置是否有效、并已成功完成具有当前设置的事务。 首先、我们使用了 TI 提供的 SPI 和 DMA 示例来指导我们的实施。  

附件给出了一个使用 driverlib 和 SysConfig 的最小示例、其中、如果我们传输到内部缓冲区(使用#define ALT_EXAMPLE)、则 DMA 传输将处理从 SPI TX 中断触发的情况、但当我们尝试传输到 SPI TX FIFO 缓冲区时、我们会得到垃圾数据。 此外、我们在 DMA 事务完成后设置了中断、可以确认在任何一种情况下都发生了中断。  

就 我们可以看出这表明触发条件正确(由于 TX 未填充、我们反复触发 DMA、直到其完全传输到 ALT_EXAMPLE 中的 example_buf)。 该命令还指示 SRC 指针正确、因为 example_buf 中显示了正确的数据。

此外、我们还遵循使用带 DMA```的 SPI 接收数据的```18.2.8.2 指导、并将 RXFFIL 设置为 8 个样本、 将 DMA_BURST_SIZE 设置为 7。

希望我们的配置出现小问题、因为我们不确定应从何处调试该问题。 感谢您的帮助。

 

系统配置中的 SPI 配置:

image.png

DMA 配置:

image.png

 

DMA 的 SRC 和 Dest 在代码中配置(从 empty_driverlib_main.c 中配置):

    #ifdef ALT_EXAMPLE
    DMA_configAddresses(example_spi_TX_DMA_BASE, example_buf,  test_buf);
    DMA_configBurst(example_spi_TX_DMA_BASE, 8, 1, 1); // Burst Size, Src step, dest step 
    DMA_configTransfer(example_spi_TX_DMA_BASE, 16,  1, 1); // Transfer Size, Src Step, dest step 
    #else
    DMA_configAddresses(example_spi_TX_DMA_BASE, example_spi_TX_DMA_ADDRESS,  test_buf);
    DMA_configBurst(example_spi_TX_DMA_BASE, 8, 1, 0); // Burst Size, Src step, dest step (Notice how dest step is zero)
    DMA_configTransfer(example_spi_TX_DMA_BASE, 16,  1, 0); // Transfer Size, Src Step, dest step (Again, notice step is zero)
    #endif
    DMA_startChannel(example_spi_TX_DMA_BASE);

 

Driverlib 空 CPU1 示例 CCS Project.zip 

 

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

    尊敬的 Bendik:

    我看不到您的设置有任何明显的问题。  

    当我们尝试传输到 SPI TX FIFO 缓冲区时、我们会得到垃圾数据

    您如何查看此内容? 是否确定了 MISO 引脚的作用、数据看起来是垃圾的? 当您在传输 DMA ISR 结束期间暂停时、是否可以发送 SPI 寄存器的值(连续刷新打开)? 我可以查看传输后 SPI 的状态是否有任何问题。

    此外、在测试时、您的应用中是否启用了任何其他 DMA 通道?

    此致、

    Delaney

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

    尊敬的 Delaney:

    我们正在 Raspberry Pi 上检查此项、并使用示波器验证了配置。 具体而言、我们在没有 DMA 的情况下进行了测试、以确保数据可以正确传输、现在、使用这些设置、我们已经转向使用 Raspberry Pi

    说数据是垃圾数据可能是不正确的;返回的数据在各事务之间基本是一致的。 因此、无论首次返回的数据是什么、通常都会重复。 我们将看到一些值发生变化、但这可能是因为这是原型设计、我们误读了该位。

    在所有情况下、我们插入的前两个字 (0x00 和 0xAA) 始终读取正确、然后是所述的行为。

    以下是 SPI 寄存器状态:

    SPICCR  0x00CF  0x00006100@数据  SPI 配置控制寄存器
    SPICTL  0x0002  0x00006101@数据  SPI 操作控制寄存器
    SPISTS  0x0000  0x00006102@数据  SPI 状态寄存器
    SPIBRR  0x0031  0x00006104@数据  SPI 波特率寄存器
    SPIRXEMU  0x7FFF  0x00006106@数据  SPI 仿真缓冲寄存器
    SPIRXBUF  0x240A  0x00006107@数据  SPI 串行输入缓冲寄存器
    SPITXBUF  0x00AA  0x00006108@数据  SPI 串行输出缓冲寄存器
    SPIDAT  0x00AA  0x00006109@数据  SPI 串行数据寄存器
    SPIFFTX  0xE0A8  0x0000610A@数据  SPI FIFO 发送寄存器
    SPIFFRX  0x2022  0x0000610B@数据  SPI FIFO 接收寄存器
    SPIFFCT  0x0000  0x0000610C@数据  SPI FIFO 控制寄存器
    SPIPRI  0x0000  0x0000610F@数据  SPI 优先级控制寄存器

    此外、DMA 寄存器状态:

    模式  0x8301  0x00001020@数据  模式寄存器
    控制  0x0100  0x00001021@数据  控制寄存器
    BURST_SIZE  0x0007  0x00001022 μ s@  突发大小寄存器
    BURST_COUNT  0x0000  0x00001023@数据  突发计数寄存器
    SRC_BURST_STEP  0x0001  0x00001024@数据  源突发阶跃寄存器
    DST_BURST_STEP  0x0000  0x00001025@数据  目标突发阶跃寄存器
    Transfer_size  0x000F  0x00001026@数据  传输大小寄存器
    Transfer_count  0x0000  0x00001027@数据  传输计数寄存器
    SRC_TRANSFER_STEP  0x0001  0x00001028@数据  源传输步骤寄存器
    DST_TRANSFER_STEP  0x0000  0x00001029@数据  目标传输步骤寄存器
    src_wrap_size  0xFFFE  0x0000102A@数据  源绕回大小寄存器
    SRC_WRAP_COUNT  0xFFEE  0x0000102B@数据  源绕回计数寄存器
    src_wrap_step  0x0000  0x0000102C@数据  源绕回步骤寄存器
    DST_WRAP_SIZE  0xFFFE  0x0000102D@数据  目标绕回大小寄存器
    DST_WRAP_COUNT  0xFFEE 0x0000102E  @数据  目标绕组计数寄存器
    DST_WRAP_STEP  0x0000  0x0000102F@数据  目标绕回步骤寄存器
    src_beg_ADDR_SHADOW  0x0000C000 0x00001030  @数据  源起始地址影子寄存器
    SRC_ADDR_SHADOW 0x0000C000 0x00001032    @数据  源地址影子寄存器
    src_beg_ADDR_ACTIVE  0x0000C000 0x00001034  @数据  源起始地址有效寄存器
    SRC_ADDR_ACTIVE  0x0000C080 0x00001036  @数据  源地址有效寄存器
    DST_Beg_ADDR_SHADOW  0x00006108 0x00001038  @数据  目标起始地址影子寄存器
    DST_ADDR_SHADOW 0x00006108 0x0000103A    @数据  目标地址影子寄存器
    dst_beg_ADDR_ACTIVE  0x00006108 0x0000103C  @数据  目标起始地址有效寄存器
    DST_ADDR_ACTIVE  0x00006108 0x0000103E  @数据  目标地址有效寄存器

    如果有更好的导出方法、请告诉我。 我使用了“Registers"选项“选项卡(在 SpiaRegs 中选择每一列)、然后将其复制并粘贴到此窗口中。

    在更大的程序和我附加的重新创建的示例中、只有此 DMA 通道处于活动状态。  

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

    尊敬的 Bendik:

    感谢您发送寄存器导出、我将查看您的设置并返回给您。

    此致、

    Delaney

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

    尊敬的 Bendik:

    对延迟深表歉意。 几个注意事项:

     在程序执行过程中、是否可以尝试删除 Interrupt_disable() 和 Interrupt_enable () 调用? 我建议仅在初始化期间使用这些函数;我已经看到它们会在常规程序流中使用时某个时候导致问题。 是否尝试在获得 RX 中断和执行 TX DMA 传输之间一次切换? 如果是、您能否尝试使用全局状态变量来跟踪应该进行的操作?

    例如、如果全局变量被称为 txdma 且初始化为=0。 在 RX 中断内部、您可以在执行任何代码之前检查 txdma==0、除了清除 SPI 中断状态并对中断加以处理外、这些应该始终存在。 在 DMA 通道启动/重新启动之前、可以将 txdma 设置为 1。 然后在传输 ISR 结束时清除 txdma。 请告诉我这是否可行。

    由于 SPI 是外设器件、无法控制事务何时发生、因此时序也可能会出现一些问题。 您能否尝试启用超限错误中断并在 ISR 内添加一个断点来查看是否标记了超限? 遗憾的是、在 SPI 外设模式下似乎没有任何 SPI DMA 示例。 我会亲自尝试一下、但与此同时、请查看 上述任何一项建议是否有所改进、并告诉我。  

    此致、

    Delaney

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

    尊敬的 Delaney:

    我遵循了第一个建议并删除了 Interrupt_disable() 和 Interrupt_enable () 调用。 然后我们尝试从主设备发送我们的请求,但我们再次收到垃圾数据。 垃圾数据与以前不同:它最初包含随机数,然后在传输的其余部分归零。 对于调试、我认为此解决方案很好、并且可能在应用程序成熟时起作用。 (我们预计周期会受到限制,但还没有发生这种情况。)

    理想情况下、我们会在数据传输期间关闭 RX 上的中断。 由于我们传输 256 字的数据包、因此每次传输额外产生至少 256/16(16 个中断)。 虽然可以通过优化来避免一些开销、但如果我们需要保持 RX 中断以使 DMA 正常工作、那么不使用 DMA 进行传输会更好。

    我们当前在没有 DMA 的情况下使用 RX/TX 中断、遗憾的是、这会产生 TX 中断来保持 TX 缓冲区已填充。 此策略会在数据传输期间禁用 RX 中断。 相比之下、这将释放另一个 DMA 通道、同时产生类似的中断损失。 总体而言、这应该更快、因为 DMA 可以在其他地方用于节省额外的周期数。  

    除此之外、我们在使 interrupt_enable/disable 正常运行时遇到了初始问题。 我们发现在重新启用 SPI RX 中断之前需要复位 SPI RX FIFO 缓冲器;否则、不会触发中断。  

    使用新设置、我们还检查了 RXFFOVF(接收 FIFO 溢出标志)、并且没有发出该标志。 这是意料之外的。 在当前代码中、RX 在 TX DMA 完成之前不会被清除。 因此、我们应该在没有处理 RX ISR 的情况下溢出很多次以清除 FIFO 缓冲区。 我知道这不是您推荐的方法。 如果这是检查溢出的不正确方法、请告诉我、我将按照您的描述进行设置。

    修改的代码:e2e.ti.com/.../8156.Driverlib-Empty-CPU1-Example-CCS-Project.zip

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

    尊敬的 Bendik:

    我仍在自行测试您的代码、但明天会更新您。  

    此致、

    Delaney

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

    尊敬的 Bendik:

    为了进行更新、我能够使用您最新的代码复制您在设置中描述的行为。 我还在调查这个问题。

    此致、

    Delaney

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

    尊敬的 Bendik:

    为了进行更新、我仍在积极调试。 我尝试得到一个简单的示例、其中有两个 SPI 实例、用于外围设备使用 DMA 进行传输。 SPI_TX_DMA 触发逻辑似乎可能与我预期的不同、我将继续研究它并在下周更新您。

    此致、

    Delaney

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

    尊敬的 Delaney:

    为了澄清一下、您的意思是否与 SPRUHM8K 中第 18.2.4 节“DMA 支持“和 18.3.8.1 节“SPI DMA 传输“中的规定不同?

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

    尊敬的 Bendik:

    我用于测试的设置是根据 SPI/DMA TRM 部分的建议进行计算的、我只是在让 SPI TX DMA 触发器在从模式下与 SPI 正常工作时遇到问题。 我知道您的代码能够触发 DMA、但没有导致 来自 SPI 从器件的正确传输。 我仍在尝试将每种情况下的行为拼在一起。 请留出更多时间进行调试、我可能需要与设计团队讨论。 我将在一周结束时提供最新情况。  

    此致、

    Delaney

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

    尊敬的 Bendik:

    很抱歉耽误你的时间。 我想我已经找出了你的问题,或至少部分问题. 在该器件上、为了使 DMA 能够访问 SPI 寄存器、需要在外设帧 2 的 SECMSEL 寄存器中将 DMA 配置为辅助主器件。 请参阅 此处 介绍此信息的 TRM 部分。 如果没有此配置、对 SPI 寄存器的 DMA 写入将不会生效。  

    您能否尝试将以下代码添加到您的初始化中并告诉我它是否解决了问题:

        SysCtl_selectSecController(SYSCTL_SEC_CONTROLLER_DMA, SYSCTL_SEC_CONTROLLER_DMA);
    

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您研究这个问题。 在 Board_init () 之后立即添加此代码段、使示例正常工作。  

    对于未来的用户、或者如果我忘记了:

    必须按照 18.2.4(DMA 支持)配置 SPI 外设

    DMA 外设必须按照 18.3.8(SPI DMA 传输)中所述进行配置

    最后、应该为目标 DMA 外设配置 SPI 外设的 SECMSEL 和 CPUSEL。

    附件是工作示例。

    e2e.ti.com/.../4520.Driverlib-Empty-CPU1-Example-CCS-Project.zip

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

    尊敬的 Bendik:

    很高兴听到这个问题解决了! 我已经为此 SysConfig 提交了一个错误、以便在通过 SPI 添加 DMA 支持时在未来版本中自动生成该行。 我将关闭此主题、但如果您有任何其他问题、请随时再提出一个主题。  

    此致、

    Delaney