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.

[参考译文] TMS320C6678:在 BIOS 应用中需要 DMA 和 SPI 方面的帮助!

Guru**** 2611705 points
Other Parts Discussed in Thread: TMS320C6678

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579793/tms320c6678-need-help-with-dma-and-spi-in-bios-application

器件型号:TMS320C6678

您好!

我将使用从  c6678  评估板上的线程 e2e.ti.com/.../170614  我需要进行一些更改才能使其适用于我的应用、并且不能通过 DMA 进行引用我不太确定如何执行它。  我的设置将有一个 SPI ADC 连接到电路板、我需要对接收到的数据进行实时处理。  我想使用 DMA 在处理背景中加载 memoy 中的数据。  我意识到 TMS320C6678上的 SPI 模块仅在主模式下受支持。  那么、我的问题是如何设置所有内容、以便我拥有最少的数据传输开销。  我当时在想一个 ADC 转换速率为预期的定时器、它会触发软件中断并检查 DMA 传输。  这是合理的、还是您建议了其他什么?

感谢您的回答。

 

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

    我已将其转发给设计团队。 他们的反馈应发布在此处。

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

    E2E 论坛中的参考代码是基于 C6670的编码、使用环回、一个通道用作 Tx、另一个通道用作 Rx。 发布在"08-01-2012 5:18 PM"之后、说明了"SPIXEVT 和 SPIREVT (C6670数据手册中的表7-36)"。

    来自 SPI 用户指南 、www.ti.com/.../sprugp2a.pdf、2.10 DMA 事件支持部分
    如果逐个字符处理 SPI 消息通信需要过多的 CPU 开销、则 CPU 可以配置系统 DMA 来处理 SPI 数据传输。
    SPI 模块具有两个用于接收(REVT)和发送(XEVT)的 DMA 同步事件输出、从而允许由 SPI 读取接收和写入发送事件触发 DMA 传输。 SPI 模块通过启用 SPI 中断寄存器(SPIINT0)中的 DMA 请求使能(DMAREQEN)位来启用 DMA 请求。

    因此、我相信您可以使用 REVT 作为来自 Rx 路径的 DMA 传输的触发器。 请检查中断表、因为 C6670和 C6678可能会对 SPI Rx 事件使用不同的中断编号。

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

    非常感谢 Eric 的回答。

    因此、通过使用 REVT、DMA 将在接收缓冲区中有数据时立即触发。  我是否需要一个中断处理程序、还是因为它位于后台、所以它将在启用后启动?  那么如何清除中断?  

    在该代码中、在所有初始化之后调用了一个 SPI_DMA 和 TEST_EDMA 函数、如下所示、我假设它轮询中断位以使其变为活动状态、然后轮询以完成传输:

    void SPI_DMA_request (void)
    {
    //禁用 DMA 请求*/
    ((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIINT0 &=\
    ~(CSL_SPI_SPIINT0_DMAREQEN_ENABLE< SPIINT0 |=\
    CSL_SPI_SPIINT0_DMAREQEN_ENABLE< SPIFLG & 0x00000200);
    //profileTxStart = CSL_tscRead ();
    
    while (!(((((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIFLG & 0x00000100));
    //profileRxStart = CSL_tscRead ();
    } 

    void Test_EDMA (void) { //等待中断 EDIPR.REGION = CSL_EDMA3区域全局; regionIpr.intr regionIpr.intr = 0;regionIpr.intrh = 0;DO{CSL_edma3GetHwStatus (hModule、CSL_EDMA3查询_INTRPEND、&regionIpr);Getwhile (regionIpr.intr & 0x08)!= 0x08);//channel_3 /区域 控制= 0xCSL_TREND;CCTRL = 0xARTI_TREN4 (TRL + TREN4);TRENTRL (TRENTR_TRL = 0xARGED 和 TREN4 * TRENTRL (TRENTR_TRL);TRENTR_TRENTR_TR_TRL = 0xARCH (TREN4

    那么、如果我使用 DMA 中断、我将不需要这些 while 循环?

    感谢你的帮助。

    Maryam

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

    您好!

    它看起来示例代码使用轮询方法。 在本例中、您需要配置 Rx 事件中断、请参阅 processors.wiki.ti.com/.../Configuring_Interrupts_on_Keystone_Devices。 然后在 ISR 中 清除中断。 如果不使用轮询,则不需要 while ()。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Eric 提供的链接。 它非常有用。 我现在只需要作一些澄清。
    在此链接中、系统 BIOS 和 Csl API 可能存在一些冲突。 我的应用程序正在使用 Sys/BIOS 和任务;因此、您建议不要使用上面使用 CSL 库来设置 SPI 和 EDMA3的示例吗? 是否有任何示例说明如何仅使用 Sys/BIOS 执行此操作?

    此致、
    Maryam