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.

[参考译文] TM4C1294KCPDT:短 SPI UDMA 传输未跳闸 SSI_DMARX 中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/593528/tm4c1294kcpdt-short-spi-udma-transfers-not-tripping-ssi_dmarx-interrupt

器件型号:TM4C1294KCPDT

我在 TM4C1294上的 SPI0上有一个 SPI 闪存。 读取块时、从单字节命令到几 KB 命令的传输长度各不相同。

我将使用软件中的 GPIO 控制帧选择引脚、并使用 SSI_DMARX 中断完成传输并关闭帧引脚。

对于超过几个字节的传输、这在100%的时间内都很有效、但是对于短传输、中断不会每次触发。

我猜我有一个比赛状态、但我已经尝试了我想的所有东西、所以现在寻求帮助。

以下是初始化代码:

//为外部串行存储器设置 uDMA
rom_uDMAEnable();
memset (uDMAControlTable、0、sizeof (uDMAControlTable));
rom_uDMAControlBaseSet (uDMAControlTable);
ROM_IntEnable (INT_UDMAERR);

// SSI0用于 EXT 闪存和 FRAM
SSIConfigSetExpClk (SSI0_BASE、系统 CoreClock、SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、16000000、 8);
ROM_SSIEnable (SSI0_BASE);

ROM_uDMAChannelAssign (UDMA_CH10_SSI0RX);
ROM_uDMAChannelAssign (UDMA_CH11_SSI0TX);

ROM_uDMAChannelAttributeDisable (UDMA_CH10_SSI0RX、 UDMA_ATTR_ALL);//UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
ROM_UDMA_LDCC_UDMA_RESTAULT_UDMA_RESTON_UDMA_LD_UCC_UDMA_RESTAULT_UCC_UDR_UDR_TR_UDMA_RESTON_UCC_TR_UDMA_LD_UDMA_RESTAULT_UCC_TR_UTR_UDMA_LD_UDMA_RESTON_UTR_TR_UTR_UDMA_RESTON_TR_TR_UTR_TR_UDMA_LD_TR_UDMA_RESTDA_TR_UTR_TR_TR_TR_TR_TR_UTR_UTR_TRIGN



;UDMA_RESTR_UDMA_LD_UTR_UTR_UTR_UTR_UTR_UTR_UTR_UTR_UTR_UTR




这里是运行传输的函数:

void bsp_simem (uint16_t n、uint8_t * buf)
{
uint16_t c、r;
uint32_t a;

R = n;
while (r){
// DMA 一次只能执行1024字节的操作,因此将其块化:
如果(r > 1024)
C = 1024;
其他
C = r;

ROM_SSIDMADisable (SSI0_BASE、SSI_DMA_RX | SSI_DMA_TX);//重新配置时禁用
EVENT_CLEAR (BSP_EVENTs, EV_SSI); //确保标志已关闭

HWREG (SSI0_BASE + SSI_O_CR1)&=~SSI_CR1_EOT;//请参阅勘误表

while (ROM_SSIDataGetNonBlocking (SSI0_BASE、&a)){} //刷新 FIFO

//设置 DMA 以发送和接收
ROM_uDMAChannelTransferSet (UDMA_CH11_SSI0TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、buf、(void *)(SSI0_BASE + SSI_O_DR)、c);
ROM_uDMAChannelTransferSet (UDMA_CH10_SSI0RX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(SSI0_BASE + SSI_O_DR)、buf、c);

ROM_uDMAChannelEnable (UDMA_CH10_SSI0RX);
ROM_uDMAChannelEnable (UDMA_CH11_SSI0TX);
ROM_SSIDMAEnable (SSI0_BASE、SSI_DMA_RX | SSI_DMA_TX);//开始!

if (EVENT_WAIT_TIMEOUT (BSP_EVENT_SSI、5)=0) //等待中断,但不超过50ms
DMA 勘误计数++;

r -= c;
buf += c;
}
}

最后、这里是 ISR。

void SSI0_IRQHandler (void)//外部闪存/ram
{
uint32_t f;

ROM_SSIDMADisable (SSI0_BASE、SSI_DMA_RX | SSI_DMA_TX);

f = ROM_SSIIntStatus (SSI0_BASE、false);
ROM_SSIIntClear (SSI0_BASE、f);//清除任何中断

EVENT_SET (BSP_EVENTs, EV_SSI);
}

这在99.9%的时间内工作、但随机中断不会被触发、并且更频繁地进行较短的传输。 当我将 SPI 时钟减慢至1MHz 时、它的工作效果会更好、但单字节传输偶尔也会失败。

我非常希望有任何想法或建议。

谢谢、

 // Anders

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

    我的小组(稍后等待一段可怕的经历)是否可以大声称赞您的"了不起的"第一篇帖子?   绝对出色——细致,组织得井井有条——解释得非常好。

    我们不使用您的 MCU (120 MHz 和外部总线/显示驱动器-与其他的 M4没有"跟上")、但我们的技术业务中有很高的百分比来自这种远程"诊断"。

    您的"轻微和随机"故障是否可能是由(任何)其他 MCU 使用导致的(可能会延迟或以某种方式抑制) SSI_DMARX 中断?   这没有说明。

    您的代码表明您"勘误表已识别"-但该特定勘误表是否是最新的?    列出"非(精确/重叠)勘误表-以某种方式产生或促成您的问题?"

    正如您已经认识到并实施的那样、"缓慢的 SPI 时钟"改善了问题。    然而、为了实现最佳(和最快)故障排除、"加快 SPI 时钟速度"可能会增加此类中断故障的发生率、从而提供"更多线索-在更短的时间范围内"-帮助您进行分析。

    我对您的 MCU 非常不熟练、也不了解如何快速/轻松地注意到:"您的"更长数据传输"会如何或甚至是如何创建条件或设置-哪种情况下"最好地启用" SSI_DMARX 中断来声明...   该路径可能需要您进一步调查...    再一次-很棒的工作!

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

    我非常感谢大家的掌声! 你的答复肯定使我的星期一上午更加明亮!

    首先、我已通过禁用除系统勾号之外的所有其他活动来隔离此问题。 丢失的中断的频率似乎不受其他活动的影响。

    我只查看最新的勘误表和手册、但我将深入研究以前的修订版本、看看这是否揭示了任何线索。

    提高时钟速度会使问题变得更严重。 它显然与时间有关。

    我可以跳过使用 UDMA 进行短(1-4字节)传输-实际上、这甚至可以节省几个 CPU 周期、而不必重新配置 UDMA 并处理中断-但我真的想在执行似乎大部分时间都正常工作的权变措施之前了解这种情况的根本原因。

    再次感谢您的鼓励、明智的建议、请分享任何其他想法!

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

    您的帖子-包括开场白和这篇帖子-都值得注意。   (大量(仍有)抵达这里----宣布"不起作用"。  而不是问题描述的一个词!)

    跳过 μ µDMA 进行短传输是不能满足的-我们"通过避让解决问题"-这并不是(始终)一个选择!

    让您提出"SPI 时钟速度"的要点是:

    • 更快地生成故障条件
    • 和更大的数字

    希望(经验表明)在这种情况下,"更快到达和增加"问题数据"证明是"朋友",而不是敌人。   

    如果您只启动"一系列短(1-4字节)传输"、会发生什么情况?

    当您跟随几次"长距离传输"-短距离传输时、会发生什么情况?

    短传输序列相隔(许多)秒时会发生什么情况?

    建议您"真正/深入"识别触发 "SSI_DMARX"中断所涉及的(所有)。   然后、您可能会在每个触发器"元素"之前出现(已知)障碍-目标是加深(部分)对(相对)敏感性的理解。

    并且-这意味着没有犯罪-您(真正)如何知道中断没有触发?   它是否可以(部分)触发?   它是否可以由(一些)机制提前"清除",但尚未被发现?   确认此类函数的"成功进入、完全进入和退出"的最佳方法是采取已知操作-"仅在函数进入时-在函数退出之前"。

    这些挑战在被识别和纠正时会产生巨大的心理"高"-"不那么多"、而是"过度挑战"。   也许这份洗衣清单能加快您的识别速度并激发您对 germlin 的热情...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这一天的殴打之后,问题得到解决。
    此问题与 UDMA 或 SPI 无关。 这只是一个中断优先级问题。

    对于任何有兴趣的人、我将使用 Rowley 的 CTL、他们明确警告 ISR 优先级。 具体而言、任何使用 CTL 服务的 ISR (在我的情况下是事件)必须设置为低于不使用 CTL 服务的 ISR 的优先级。

    又学到了教训。 阅读*所有*文档。

    在尝试解决此类问题时、强制解释此问题确实很有帮助、因此我非常感谢这里的对话。 我通常会让我(非编程人员)的妻子受到这些影响,所以她也很高兴这次不知道;)

    '到下一次、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为了记录和"改进"您(否则)出色的帖子-直到"现在!"之前、没有出现这样的"Rowley CTL"提及! 这种情况会出现在我的洗衣房名单上-如果我"知道"。 (即 Rowley 的"事实"不是证据...)

    一致认为对话-始终遵循亲吻-通常提供最短的成功时间/距离...