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.

[参考译文] F28M36P63C2:当在 ISR 内部调用时,SSIIntStatus()返回0x0000000

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/716222/f28m36p63c2-ssiintstatus-returns-0x0000000-when-called-inside-isr

器件型号:F28M36P63C2
Thread 中讨论的其他器件:controlSUITEADS8638

你好!

在 M3内核项目中,我们初始化一个名为 ISR_ADCP()的函数作为 SSI 的 ISR,如下所示:

#define ADCP_SPI_base  SSI0_BASE

#define ADCP_SPI_INT   INT_SSI0

(笑声)

SSIIntEnable (ADCP_SPI_base、SSI_RXFF|SSI_RXOR);

SSIIntRegister (ADCP_SPI_base、ISR_ADCP);

IntPrioritySet (ADCP_SPI_INT、2);

IntEnable (ADCP_SPI_INT);

(笑声)

在 ISR_ADCP()内部,我检查哪个中断源被称为当前 ISR:

ulStatus = SSIIntStatus (ADCP_SPI_base、true);

 

令我惊讶的是、此函数最终返回0x0000000。 除了这种行为、我应该做什么? 我觉得很奇怪、因为如果没有任何屏蔽的位 处于活动状态、那么该 ISR 首先是如何调用的? 我尝试 在第二个参数中使用 false、但仍然得到该结果。

此致、

Gabriel

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

    加布里埃尔

    这是一个有趣的问题。 SSIIntStatus()函数仅根据 true/false 返回 SSI_MIS 或 SSI_RIS。 在调用此函数之前、请确认您肯定没有任何清除中断状态的内容。 如果您遵循 controlSUITE 中提供的任何示例、这应该是在 ISR 中进行的第一个调用。

    您的缓冲区中是否有任何数据?

    SSISR 在 ISR 中的状态是什么?

    这是否在每个中断事件发生时发生?

    这是否仅发生在第一个事件上?

    是否有任何可能强制中断发生的代码? (中断置位挂起或软件触发中断(SWTRIG)寄存器在代码的其他位置置位)

    谢谢、
    标记

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

    Mark、您好!

    感谢你能抽出时间。  下面是一些详细信息:此 SSI 接口用于从具有8个通道的外部 ADC (TI ADS8638)获取样本。 M3内核将 SSI 用作主机、我们使用 UDMA 以1kHz/通道的速率控制8个通道的样本传输。

    作为示例,ISR 中首先要做的就是调用该 SSIIntStatus(),而我清除整个代码中中断状态的唯一位置是在该 ISR 的末尾。

    下面我提供了时序图、以便更轻松地进行解释。 CH1 (黄色)是数字输出(DO)、它分别在 ISR 开始和结束时打开和关闭。 CH3 (粉色)是 SSI CLK 信号。

    如您所见、来自8个通道的样本每1毫秒按顺序发送一次、这由 UDMA 控制。 在第一个样本到达后,调用 ISR (CH1的第一个上升沿),此时 SSIIntStatus()返回0x0。 在 ISR 内部有一个 while (SSIBusy ()){}循环等待 UDMA 完成8个样本的传输;这就是第一个脉冲更大的原因。 由于 SSIIntStatus()为0x0,ISR 代码不会清空 FIFO 缓冲区,因此它会关闭 DO 并离开 ISR,只需再次进入该缓冲区(CH1的第二个上升沿)。 这次 SSIIntStatus()返回0x4,这是可以的,因为 FIFO 大于半满。 此行为每毫秒重复一次、即每次样本传输时。

    当 SSiIntStatus()= 0x0时,以下是每个 SSI 寄存器的状态:

    我不得不承认、这个代码不是我的代码、它来自最近离开实验室的同事、我正在尝试调试这个代码。 但我非常确信、它不会通过软件触发来强制中断发生。 我不确定"中断设置挂起"是什么意思。 请听我说。

    希望这些信息对您有所帮助!

    此致、

    Gabriel

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

    加布里埃尔

    嗯。 那么、您正在使用 UDMA 并且仍然需要中断吗?

     UDMA 章节外设接口部分的 TRM SPRUHE8中有一条注释:"当使用 μ μDMA 与外设之间传输数据时、外设必须禁用所有到 NVIC 的中断。"  UDMA 似乎会影响外设的中断行为。  

    您为什么希望 CPU 和 DMA 访问 SSI 的 TX 中断?  

    -Mark

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现这个似乎相关的线程。 M3内核在器件之间是相似的、可能在以下位置有所帮助: e2e.ti.com/.../662453

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

    Mark、您好!

    感谢您的建议! 我将尝试改用 uDMA 中断。

    但我注意到可能与此相矛盾的一点:我的同事似乎是根据 controlSUITE 中名为  SSI_DMA_LOOP_M3的示例使用此解决方案的、因为它还使用 SSI0 RX 中断、同时使用 UDMA 进行传输(但在本例中、SSI1是回送的主器件)。

    "您为什么希望 CPU 和 DMA 访问 SSI 的 TX 中断?"

    关于这一点、实际上 CPU 可以访问 RX 中断、如前所述。 您的问题是否仍然存在这种情况?

    此致、

    Gabriel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    加布里埃尔
    该示例似乎使用 RX 中断来读取接收到的数据。 UDMA 仅执行 TX 部分。 由于您的代码正在使用 UDMA 读取 RX 缓冲区,因此您可能会遇到竞争。

    我想我需要进一步深入探讨这一点、以了解捕获的是什么。 我将在星期五之前向您回复最新消息。

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

    Mark、您好!

    我不确定我的消息中是否不清楚、但我再次对您的陈述感到困惑:

    1)"似乎该示例使用 RX 中断来读取接收到的数据。 UDMA 仅执行 TX 部分。"

    我在上一条消息中完全提到了这一点:

    "我的同事根据 controlSUITE 中 名为 SSI_DMA_LOIP_m3的示例使用了该解决方案、因为它还使用 SSI0 RX 中断、同时使用 uDMA 进行传输(但在本例中、SSI1是环回的主设备)。"

     

    2) 2)由于您的代码使用 UDMA 读取 RX 缓冲区,因此在您的代码中可能存在争用。  


    我从未说过我们使用 UDMA 读取 RX 缓冲器。 相反、我们使用它来控制 TX、并使用 RX 中断来读取 RX 缓冲区。 请您再次阅读我的所有消息、或许这有助于这些困惑。

    此致、

    Gabriel

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

    加布里埃尔

    您是否仍面临此问题?  

    似乎我在上次沟通中讲错了。  

    以下是我当前对该问题的理解:

    请参阅 SSI 章节的 DMA 操作一节。 "如果启用了 UDMA、那么 UDMA 控制器会在 传输完成时触发中断。 该中断在 SSI 中断向量上发生。 因此、如果 SSI 操作使用中断并且启用了 UDMA、则必须设计 SSI 中断处理程序来处理 UDMA 完成中断。 此外、请参阅 TRM UDMA 部分中的"UDMA 方框图"图。

    因此、是的、SSI 中断中的0状态实际上是合理的。 它实际上是来自 UDMA 并触发 SSI 中断线的 DMA 完成中断。 SSI 中断处理程序需要读取当前的 UDMA 控制结构、以查看这是触发中断的原因。  

    请查看 controlSUITE 中的 UDMA_DEMO 示例。 UART0IntHandler 精确处理此情况。  

    -Mark

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

    对我来说、这种行为似乎是一个很好的解释! 实际上、我仍然没有尝试读取 UDMA 控制结构、也没有使用 UDMA 中断处理程序、但现在我非常有信心。 只要我可以检查它、我就会告诉您。

    感谢您的关注!

    此致、

    Gabriel
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒! 如果您有任何后续行动、请在此处发布。 如果该主题在此之前锁定、您可以单击页面上的"询问相关问题"按钮。 如果您有任何其他问题、请创建新帖子!

    快乐编码!
    标记