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.

[参考译文] CCS:用于 ti-RTOS 的 CAN 驱动程序

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/942614/ccs-can-driver-for-ti-rtos

工具/软件:Code Composer Studio

大家好,ti-rtos 是否有任何示例作为起点。 我们在 RTOS 中使用 TivaWareforCSerialesPeripheralDriverLibrary 之前。

我在_css.c 文件中的"void hal_CAN_0_IntHandler (void)"之前使用。

我担心中断例程的实现。 我该怎么做?

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

    如果我不使用中断,是否可以在任务中用作轮询模式?

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

    我建议您将访问 CAN 模块的所有函数放入一个任务和一个中断服务例程中。 使用 TI-RTOS 邮箱(不要与 CAN 邮箱或消息混淆)请求 CAN 任务和 CAN 中断例程的数据传输和接收。  

    驱动程序库文件 CAN.c 在 TivaWare 2.2.0.295及更早版本中以及基于 ROM 的版本中、 大多数函数使用接口1 (IF1)寄存 器、接收消息使用接口2 (IF2)寄存器(CANMessageGet())。 当在主应用程序代码中使用 CAN 函数时、这可能会造成问题
    中断例程或 RTOS 的多个线程中。  在中断或任务切换期间不会保持接口寄存器的一致性。 当 CPU 不处于异常 状态时、我连接的 CAN.c 的更新版本将 IF1寄存器用于所有函数、当 CPU 处于异常状态时、将使用 IF2寄存器。 这简化了使用中断为 CAN 编写代码的过程。 使用 RTOS 时、所有 CAN 函数都应在一个线程或一个中断例程中。  位于最新 TivaWare 安装程序 driverlib 文件夹中的 CAN.c 文件可替换为提供 的 CAN.c 文件、并重建驱动程序库、或者提供的 CAN.c 文件可直接添加到您的工程中。

     /cfs-file/__key/communityserver-discussions-components-files/81/can.c

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

    您好、克罗斯比、

    感谢你的答复。  

    是否有任何简单的启动代码,如何将 ti-RTOS 邮箱与 CAN 驱动程序配合使用?  

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

    我希望我有一个简单的例子给你、但我没有。 在如何实现 RTOS CAN 任务和邮箱方面有很多变化。 我可以描述一个简单的示例。

    假设我们有三个需要 CAN 通信的任务。 第一个任务(CANTX1)将定期向同一个 ID 发送一个4字节的消息。 第二个任务(CANRX2)只接收来自 CAN 消息的数据、但该消息可以来自已知固定滤波器生成的多个 ID 中的任何一个。 第三个任务(CANTXRX3)将发送 CAN 消息并等待响应。 已发送消息的 ID 和预期响应的 ID 发生变化。 我们有第四个任务、执行 CAN 连接和 CAN 中断例程。

    静态分配邮箱。 您需要一个用于任务 CANTX1 (Mailbox1)的简单4字节邮箱。 它将包含需要传输的4个字节。 此 ID 可进行硬编码。 任务 CANRX2 (Mailbox2)的邮箱需要12个字节。 接收到的 ID 为三个字节、接收到的数据长度为一个字节、数据为8个字节。 对于第三个任务、我们需要三个邮箱。 第一个邮箱用于发送 CAN 帧、最多需要12个字节、其中3个用于 ID、1个用于长度、8个用于数据(邮箱3)。 第二个邮箱用于设置接收消息、最多需要六个字节、其中三个用于 ID、三个用于掩码(Mailbox4)。 第三个邮箱由中断例程使用、最多需要八个字节、其中三个字节用于接收的 ID、一个字节用于长度、八个字节用于数据(邮箱 x5)。

    检查 Mailbox1、Mailbox3和 Mailbox4的 CAN 任务循环。 当它看到 Mailbox1挂起时、它读取内容并设置 CAN 帧来传输预定义的 ID 和提供的4个字节的数据。 当它看到邮箱3挂起时、它会设置一个 CAN 发送消息、使用邮箱中的 ID、长度和数据。 当它看到 Mailbox4挂起时、它会设置一个带有 ID 的 CAN 接收帧、并从邮箱中屏蔽。

    在 CAN 模块初始化期间、一个接收报文可被配置为 CANRX2任务的接收帧。 然后、中断例程可以将接收到的 ID、长度和数据发布到 Mailbox2。 此外、当它在邮件设置中看到邮箱 x4接收到的数据时、它可以发布邮箱 x5中接收到的 ID、长度和数据。

    但愿这对您有所帮助。

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

    非常感谢您提供的宝贵信息。

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

    与其他 TI-RTOS 驱动程序一样、我准备了用于 TI-RTOS 的 CAN 驱动程序作为起点(以 I2CTiva 为例)。  

    根据  以下论坛中讨论的 ToddMullanix 的解释: https://e2e.ti.com/support/microcontrollers/other/f/908/t/682902

    我在该 TI 资源中没有看到任何源代码。

    我决定在其他人需要时分享。 但愿这对您有所帮助。

    示例:每250ms 发送一个数据包, 并连续打印接收到的数据包。

    e2e.ti.com/.../can_5F00_drivers_5F00_ti_2D00_rtos.zip

    e2e.ti.com/.../2061.can_5F00_ti_2D00_rtos_5F00_example.zip