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.

[参考译文] TM4C1294NCPDT:具有通知中断的 TMC4C1294主器件和 TM4C123 SPI 从器件返回主器件

Guru**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1336585/tm4c1294ncpdt-tmc4c1294-master-and-tm4c123-spi-slave-with-notification-interrupts-back-to-master

器件型号:TM4C1294NCPDT

您好!

我正在使用 TI-RTOS、其中 TM4C1294通过 SPI 作为主设备、连接到从 TM4C123从设备。 主器件可以向从器件发送各种命令、以便在从器件上配置或执行其他操作、这一切都正常。

然而、当从设备对 SMPTE 时间码数据包进行解码时、它也需要生成发送回主设备的中断通知(通过 GPIO 引脚)。 当从器件对数据包进行解码时、这些中断将以大约2kHz 的速率进行流式传输、并通知主器件从从从器件读取数据并清除中断。 主器件必须读取时间码数据包、并通过读取到从器件的 SPI 状态命令确认从器件的每个中断。  

然而、我的应用中的其他 RTOS 线程将需要通过同一 SPI 总线与从站通信、以控制从站提供的功能。 从器件也将忙于解码时间码数据包并通过 GPIO 引脚中断通知主器件。 问题在于、主站中的 Hwi INT 处理程序需要读取同一 SPI 总线来确认来自从站的中断。 由于同样的 SPI 总线也可以从我的应用中的其他线程同步访问、所以我如何将异步 Hwi SPI 读取与通过同一 SPI 端口执行同步 SPI 读取的其他任务同步。  

我的 INT 通知处理程序应该布置到 Swi、然后在 Swi 和进行 SPI 调用的其他任务之间使用全局互斥量或信标吗?

如果这无法实现、那么设置另一个 SPI 通道来仅处理中断数据流可能会更容易吗? 遗憾的是、设置第二个与从处理器设备的通信通道需要进行昂贵的硬件改动。

提前感谢您提供任何建议。

此致

鲍勃·斯塔尔

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

    您好!

    我的 INT 通知处理程序应该布置到 Swi、然后在 Swi 和进行 SPI 调用的其他任务之间使用全局互斥量或信标吗?

    [/报价]

    您的想法值得尝试。 当主器件访问从器件时、您是否会考虑禁用其他任务? 该中断的优先级应高于其他任务、因此一开始就不应优先。 在将数据发送到从器件之前、也可以使用队列来排队等待所有数据。 不确定我的想法是否值得尝试。  

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

    你好,查尔斯,谢谢你的答复。 我将尝试让我的 Hwi 布置到 Swi。 最好我记得、Swi 的优先级应该比任务高、但是低于布置到任务的 Hwi。 与 TI-RTOS 中的其他驱动程序类似、我创建了自己的驱动程序层。  我在句柄结构中创建一个门互斥,那么我的驱动程序层中的所有 SMPTE_READ()、SMPTE_Write()函数都受此互斥体保护。 我的想法是让 Hwi INT 处理程序向 Swi 发布、进而调用 SPI 调用(使用对象句柄包含的相同互斥)来从 SPI 从站读取异步数据。 读取从器件 INT 数据的操作将重置其"中断"内部逻辑状态。  

    目前我正在使用一个邮箱来在 Hwi 和 SPI 读取器任务之间传递数据、但是我考虑了最初使用 queue_elem 结构和机制来实现这一点。 也许我应该更改我的驱动程序、以便使用信标、而不是栅极互斥量进行所有同步。 然后、当内部发生故障并与 Swi 访问 SPI 流时混淆、从器件读取/写入函数就会超时。

    我需要返回并再次阅读有关 Swi 的文档、首先确保 默认的 SPI 库层调用在 Swi 上下文中有效。 我当前的实现从 Hwi 处理程序中调用 Mailbox_post (),所以我认为 Swi 可以 像处理 Hwi 调用一样做。

    此致、

    鲍勃

    MPTE_Handle SMPTE_building (SMPTE_Object *obj、SMPTE_Params *参数)
    {
    /*初始化对象的字段*/
    obj->spiHandle = params->spiHandle;
    obj->gpioCS = params->gpioCS;

    GateMutex_structure (&(obj->gate)、NULL);

    返回(smpte_handle) obj;

    SMPTE_Handle SMPTE_create (SMPTE_Params * params)
    {
    SMPTE_Handle 句柄;
    Error_Block EB;

    error_init (&eb);

    句柄= Memory_alloc (NULL、sizeof (SMPTE_Object)、NULL、&EB);

    if (句柄== NULL)
    返回 NULL;

    句柄= SMPTE_构造(句柄、参数);

    返回手柄;

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

    尊敬的 Robert:

     我没有听到你的回应。 我希望你能够找到最适合你的问题的解决方案(例如、邮箱、信标、队列或其他)。  我现在将关闭该主题。 如果您有更新、您可以写回该线程、它会将状态更改为"打开"。  

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

    尊敬的 Charles:
    我尝试了 SWI、发现 SPI_READ 只在 SWI 的非阻塞模式下工作。 但是、在 SPI 回调中尝试将此方法与 GateMutex 结合使用时、这会产生其他问题。 所以、我最后从 hwi 返回到邮箱、并有一个读取器任务来读取 SPI 以响应中断。 也许在对中断的响应速度方面不是最好的、但是它似乎至少目前是有效的。 试图与其他任务和中断处理程序共享同一 SPI 通道的做法并不十分简单、我下次会更改我的硬件设计。 感谢您的帮助。