请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 eventHandle、uint32_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!= obj、829);
事务= obj->currTransaction;
chNum = Transaction->channel;
chObj =&obj->chObj[chNum];
rxChHandle = chObj->dmaChCfg.rxChHandle;
CacheP_inv (chObj->dmaChCfg.rxHpdMem、chObj->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 (obj、rxChHandle、(MCSPI_Handle) config、pHPD、事务);
}
retVal = uDMA_ringQueueRaw (uDMA_chGetFqRingHandle (rxChHandle)、pDesc);
//...错误处理//
}
}
返回;
}
这是可行的、但会出现一个问题。 例如、在调试期间(应用程序正在停止)
DMA 停止运行。 这种情况按预期发生、因为对等器件仍在持续发送数据。
应用程序重新启动后、会发出 DMA IRQ、并在 IRQ 处理程序中处理所有描述符。
在那里、我看到使用了 DMA 取消限制的最大数量。 因此、我认为发生了所谓的绝望饥饿。
问题是、一旦我"处理"所有术语并将其重新放入转发队列、SPI 接收就不会继续。
之后不会产生 DMA IRQ。 我找不到重新启动 DMA 传输的方法。
有什么提示或问题可能是什么问题或可能的解决方案?
此致、
Torsten Bitterlich