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.

[参考译文] AM6442:SPI 外设连续接收和 DMA 描述符耗尽

Guru**** 2393725 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1495383/am6442-spi-peripheral-contineous-reception-and-dma-descriptor-starvation

器件型号:AM6442

工具与软件:

尊敬的所有人:

我们有一个基于 AM64x 的应用、其中2个 MCSPI 接口用于外设模式。 在这些接口上、需要接收任意长度的帧(128 . 1536字节)。  

MCSPI Am64x 的基础 SPI 驱动器仅提供 DMA 接收已知数据长度的功能。

我设法更改了驱动程序、因此在 IRQ 处理程序中分配并处理任意数量的 DMA 描述符。

因此、在启动接收之前、我分配了 DMA 描述符、并将它们放入转发队列。
1传输完成后、持续从对等器件接收数据。 对等器件以128个块的形式发送数据
准确地表示 DMA 消息的大小。

在我们的应用中、处于外设模式的 SPI 接口仅接收数据、没有可用的发送线路。

基本上、IRQ 处理程序如下所示:

//@BSP 函数的简短修改版本
static void MCSPI_PD_udmaIsrRx (Udma_Event le eventHandleuint32_t eventType
                void * args){
 int32_t retVal
 uint64_t pDESC
 CSL_UdmapCppi5Hmpd * pHPD
 MCSPI_Config *配置
 MCSPI_Object * obj
 MCSPI_ChObject * chObj
 MCSPI_Transaction *交易
 uint32_t chNum
 Udma_Ch 3824le rxChHandle;

 (void) eventHandle
 (void) eventType

 /*检查参数*/
 if (NULL!= args){
  CONFIG =(MCSPI_Config *) args
  obj = config->object
  safety_assert (NULL!= obj829);
  事务= obj->currTransaction
  chNum = Transaction->channel
  chObj =&obj->chObj[chNum]
  rxChHandle = chObj->dmaChCfg.rxChHandle

  CacheP_inv (chObj->dmaChCfg.rxHpdMemchObj->dmaChCfg.hpdMemSize
        高速缓存 P_TYPE_ALLD);
  retval = UDMA_SOK
  while (uDMA_SOK = retVal){
   //从完成队列中获取描述符
   retVal = uDMA_ringDequeueRaw (uDMA_chGetCqRingHandle (rxChHandle)、&pDesc);
   if (retVal == uDMA_SOK){
    pHPD =(CSL_UdmapCppi5HMPD *)(uintptr_t) pDESC
    //处理数据
    dataCb (objrxChHandle、(MCSPI_Handle) configpHPD事务);
   }
   retVal = uDMA_ringQueueRaw (uDMA_chGetFqRingHandle (rxChHandle)、pDesc);
   //...错误处理//
  }
 }
 返回
}
这是可行的、但会出现一个问题。 例如、在调试期间(应用程序正在停止)
DMA 停止运行。 这种情况按预期发生、因为对等器件仍在持续发送数据。
应用程序重新启动后、会发出 DMA IRQ、并在 IRQ 处理程序中处理所有描述符。
在那里、我看到使用了 DMA 取消限制的最大数量。 因此、我认为发生了所谓的绝望饥饿。
问题是、一旦我"处理"所有术语并将其重新放入转发队列、SPI 接收就不会继续。
之后不会产生 DMA IRQ。 我找不到重新启动 DMA 传输的方法。
有什么提示或问题可能是什么问题或可能的解决方案?
此致、
Torsten Bitterlich
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好  Torsten Bitterlich:

    主题专家今天不在办公室。 如果您在星期四之前没有收到回复、请对该主题执行 ping 操作。

    此致、

    Nihar Potturu.