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:TM4C1294KC 中的 CAN 接收问题

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc

器件型号:TM4C1294KCPDT

大家好、  

来自 Delta Electronics 的问候!!  

 我们在 TM4C1294KC 微控制器中的 CAN 通信存在问题。  我们使用的是标准 CAN。  首先、我们将介绍连接、我们通过 CAN 总线连接了7个控制板、其中1-5是某种 PCB 设计、其余2个(6、7)是不同的 PCB 设计。  

节点7以    500kBit/s 的速度以3ms、10ms、16ms 的特定间隔向节点1-6发送数据   节点6接收到的数据很好、并且不会出现错误。 问题和主要关注点是节点1–5、该节点显示的误差没有预测。 在一轮测试中、它可能是显示错误 的第一个节点、而在另一轮测试中、它可能是出现错误的其他一些节点(1-5)。 不会同时检测到多个节点上的错误。 请注意、当数据从1-5个节点传输到节点7时、接收到的数据没有问题。 使用7->6或6->7的数据传输也没有问题。   

出于测试 目的 、我们减少 了节点数量、但由于重复出现相同的情形、因此不有用 。 我们 想知道软件方面可能会产生此问题的问题、还请分享您的观点、这将帮助我们进一步调试相同的问题。  

 

谢谢、此致、  

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

    您好!

     节点1-5与节点6-7上的 CAN 收发器是否相同?

     节点1-5是否运行与节点6-7相同的固件?

     你能做一个实验吗? 将节点1 PCB 替换为同类的节点6 PCB。 您是否会在节点1上看到一致的结果?

     我不确定这7个节点之间的距离。 也许另一个实验是将节点1与节点6交换。 原始节点1现在移动到节点6位置是否会产生一致的结果?  

     还要检查总线上是否有适当的端接电阻。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3844286 #3844286"] 节点1-5是否具有与节点6-7相同的 CAN 收发器?

    是的、收发器是相同的

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3844286 #3844286"] 节点1-5是否运行与节点6-7相同的固件?

    不完全相同、但 CAN 部件相同

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3844286 #3844286">同时检查总线上是否有正确的端接电阻。  [/报价]

    是的、这是正确的

    还有一些意见要分享  

    此时连接了两个节点。  我们面临两个问题:

    1.Tx 错误计数始终显示219作为值。 为什么该特定数字始终显示出来、可能的原因是什么?

    2.下一个是一个主板中的位填充错误,可能的原因包括尝试不同的位速率以及检查2个节点是否具有相同的消息 ID。 是否还有其他可能导致位填充错误的原因?

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

    您好!

     下面是一篇文章、我认为这篇文章有助于解释协议如何处理不同类型的错误。  如果发现错误、发现节点将发送错误标志、从而破坏总线通信。 其他节点将检测由错误标志引起的错误(如果尚未检测到原始错误),并采取适当的措施,即丢弃当前消息。  

    https://www.kvaser.com/about-can/the-can-protocol/can-error-handling/

    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3861151 #3861151"]1.Tx 错误计数始终显示219作为值。 为什么该特定数字始终显示出来?[/QUERT]的可能原因是什么?

    您能否读取 CANSTS (CAN 状态)寄存器的 LEC 域? 您遇到了什么错误?

    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3861151 #3861151"]2.Next 是一个主板中的位填充错误,可能的原因包括尝试不同的比特率以及检查2个节点是否具有相同的消息 ID。 是否有任何其他可能导致位填充错误的原因?[/quot]

    位填充错误是 由数据帧或远程帧中具有5个以上连续位的位序列引起的、被视为位填充错误。 错误帧故意违反了位填充规则、这反过来又确保了错误的数据或远程帧被销毁。 如果两个节点的比特率不同、那么一个节点很可能检测到具有位填充错误的消息。 例如、如果一个节点的位速率为1Mbps、而另一个节点的位速率为100kbps。 由100kbps 节点发送的一个显性位被1Mbps 节点解释为10 个连续的显性位。 这超出了5个相同值的最大位数、而没有按照协议的要求插入位填充。

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

    蔡国荣、

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3861431 #3861431"]CANSTS (CAN 状态)寄存器的 LEC 位域是否可以读取? 您遇到了什么错误?

    是的、我们读取它、得到0x01。

    初始开发阶段是使用7个板彼此连接、由于出现上述错误、我们将连接简化为一对一以进行调试。 目前的情况是,我们以500kbps 的速率连接了两个板。 通过 LEC 值 0x01,我们确认了它是一个位填充错误。 TEC 这次也显示219。 有哪些调试方法可以解决这些问题,请建议。

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

    您好!

     我不是 CAN 专家、但我有一些问题和建议。

    -两个节点是否都遇到了位填充错误? 您说其中一个使 TEC=219。 接收节点会怎么样? 它是否会遇到位填充错误? 接收节点中的 TEC 和 REC 是什么?

    -请注意,LEC 仅记录最后一个错误状态。 是否确定 TEC 仅因位填充错误而递增、而不是其他错误? 换言之、您是否也会遇到其他类型或错误、而恰好当您读取 TEC=219时、LEC 等于0x1。 是否有办法在第一次错误检测时停止传输?

     -当您说您遇到位填充错误时,它是立即发生还是一段时间后发生的? 如果一段时间后发现错误、需要多长时间?

    -您能否使用逻辑分析仪探测 CANTX 和 CANRX 信号? 您能否查看波形并判断 同一电平是否确实存在超过5个连续位?   

    -您能否在两个节点上运行 TivaWare CAN 示例。 将一个配置为 TX、将另一个配置为 RX。 您是否会遇到任何位填充错误? 相关示例可在中找到:

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_tx.c.

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_rx.c

    -保持一个节点运行您自己的传输代码。 使用另一个节点运行  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_rx.c example。 在本例中、您是否看到位填充错误?

    -保持一个节点运行您自己的接收代码。 使用另一个节点运行  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_tx.c example。 在本例中、您是否看到位填充错误?

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

    您好!

    感谢您提供的信息,我们正在跟进此信息。 完成后、我们将通知您。 此外、请查看最近出现的以下问题。

     我们希望在调试时通知您最近观察到的情况。

    API 取自  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\CAN\multi_Rx.c 示例代码。 以及 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\multiple_rx.c

    从第一个更改时的代码  

    sCANMessage.ui32MsgID = 0x200;
    sCANMessage.ui32MsgIDMask = 0x200;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | MSG_OBJ_FIFO;
    sCANMessage.ui32MsgLen = 8;

    sCANMessage.ui32MsgID = 0x200;
    sCANMessage.ui32MsgIDMask = 0x200;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sCANMessage.ui32MsgLen = 8;

    当过滤器被禁用时,我们能够  成功接收消息,但由于项目时间关键,并且禁用过滤器的中断 延迟会进一步增加,因此我们无法禁用过滤器。原因可能是什么。 有什么建议吗?

     ____________________________________________________________________________________________

    以下代码片段来自 Tiva 库 SDK:

    //
    //初始化消息对象以接收 ID 为0x1001的 CAN 消息。
    //必须将预期 ID 与掩码一起设置,以指示全部
    ID 中的//位必须匹配。
    //
    sCANMessage.ui32MsgID = 0x1001;


    sCANMessage.ui32MsgIDMask = 0xffffff;


    sCANMessage.ui32Flags =(MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |


    MSG_OBJ_EXDED_ID);


    sCANMessage.ui32MsgLen = 8;

    TivaWare 外设驱动程序库用户指南中提供了以下内容:

     

    ////配置接收对象。 //

    sMsgObjectRx.ui32MsgID = 0x400u;

    sMsgObjectRx.ui32MsgIDMask = 0x7f8u;

    sMsgObjectRx.ui32Flags = MSG_OBJ_USE_ID_FILTER;

    sMsgObjectRx.pui8MsgData = pui8BufferIn;

    CANMessageSet (CAN1_base、4U、sMsgObjectRx、MSG_OBJ_TYPE_RX);

    两个代码段都以不同的方式初始化结构的掩码(ui32MsgIDMask)成员。 这给理解同一结构的用法带来了很大的困难。请用一个更好的示例或说明来解释这个初始化部分、以便我们可以清楚地了解。

    谢谢、此致、

    Vijil

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

    您好!

    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3870558 #3870558"]

    API 取自  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\CAN\multi_Rx.c 示例代码。 以及 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\multiple_rx.c

    从第一个更改时的代码  

    sCANMessage.ui32MsgID = 0x200;
    sCANMessage.ui32MsgIDMask = 0x200;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | MSG_OBJ_FIFO;
    sCANMessage.ui32MsgLen = 8;

    [/报价]

    您是否修改了示例? 在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\CAN\multi_Rx.c 文件中、没有  MSG_OBJ_FIFO。 请返回到原始 TivaWare 安装并再次检查 multi_Rx.c 文件。 MSG_OBJ_FIFO 用于将消息对象设置为 FIFO、这不是 multi_Rx.c 示例的目的 您是否可以在某个时间点修改它并忘记它。 multi_Rx.c 实际上具有以下消息标志配置。 如果要使用 FIFO、则需要设置多个消息对象。  有关示例代码、请参阅外设驱动程序库用户指南中的第91页。  

    //
    //初始化消息对象以接收 ID 为0x1001的 CAN 消息。
    //必须将预期 ID 与掩码一起设置,以指示全部
    ID 中的//位必须匹配。
    //
    sCANMessage.ui32MsgID = 0x1001;
    sCANMessage.ui32MsgIDMask = 0xffffff;
    sCANMessage.ui32Flags =(MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
    MSG_OBJ_EXDED_ID);
    sCANMessage.ui32MsgLen = 8;

    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3870558 #3870558"]

    ////配置接收对象。 //

    sMsgObjectRx.ui32MsgID = 0x400u;

    sMsgObjectRx.ui32MsgIDMask = 0x7f8u;

    sMsgObjectRx.ui32Flags = MSG_OBJ_USE_ID_FILTER;

    sMsgObjectRx.pui8MsgData = pui8BufferIn;

    CANMessageSet (CAN1_base、4U、sMsgObjectRx、MSG_OBJ_TYPE_RX);

    两个代码段都以不同的方式初始化结构的掩码(ui32MsgIDMask)成员。 这给理解同一结构的用法带来了很大的困难。请用一个更好的示例或说明来解释这个初始化部分、以便我们可以清楚地了解。

    [/报价]

    0x7f8u 的掩码值只是一个示例。 您可以设置应用所需的任何掩码值。 不要让0x7f8u 让您感到困惑。 我同意0x7f8u 作为首次读取器的示例看起来并不直观。 如果要接受消息 ID 0x4000和0x4001、则将使用 ui32MsgIdMask=0xFFFE。 如果要接受消息 ID 0x4000、4001、0x4002和0x4003、则使用  ui32MsgIdMask=0xFFFC 等。  

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

    您好!

    > MSG_OBJ_FIFO 用于将消息对象设置为 FIFO、这不是 multi_Rx.c 示例的目的  

    我们有多个消息对象,因此我们使用相同的。

    >如果要接受消息 ID 0x4000和0x4001,则将使用 ui32MsgIdMask=0xFFFE。 如果要接受消息 ID 0x4000、4001、0x4002和0x4003、则使用 ui32MsgIdMask=0xFFFC 等。

    请说明如何为相应的消息 ID 生成0XFFFC 和0xFFFE。基于二进制的解释将更好。

    我们没有得到任何关于禁用过滤器时为什么我们收到邮件的说明、我们在前一封邮件中询问了这一点。

    谢谢、此致、

    Vijil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3871828 #3871828"]我们有多个消息对象,因此我们使用相同的.

    使用多个消息对象并不意味着您需要将它们配置为 FIFO。 除非您实际使用 FIFO 模式、否则请勿使用  MSG_OBJ_FIFO。 我建议您不要使用 FIFO 模式、因为无法保证顺序。  

    19.3.11.3从 FIFO 缓冲器读取
    当 CPU 通过写入某个报文对象的编号从 FIFO 缓冲区传输该报文对象的内容时
    CANIFnCRQ 寄存器应包含 CANIFnCMSK 寄存器中的 TXRQST 和 CLRINTPND 位
    应将 CANIFnMCTL 寄存器中的 NEWDAT 和 INTPEND 位置位、这样在之后才能将其清零
    主机 IRQ。 CANIFnMCTL 寄存器中这些位的值始终反映报文的状态
    位被清除之前的对象。 为了确保 FIFO 缓冲区的功能正确、CPU 应该
    从具有最低报文编号的报文对象开始读出报文对象。
    当从 FIFO 缓冲区中读取数据时、用户应该注意到接收到一个新的消息
    放置在具有最低报文编号的报文对象中、该编号对应于的 NEWDAT 位
    CANIFnMCTL 寄存器清零。 因此、接收报文在 FIFO 中的顺序不是这样
    得到保证。 第1367页的描绘出一组报文对象是如何串联的
    FIFO 缓冲区的数据可由 CPU 处理。

    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3871828 #3871828"]请说明如何为相应的消息 ID 生成0XFFFC 和0xFFFE。基于二进制的说明将更好。

    0xFFFC 和0xFFFE 只是我向您展示屏蔽如何工作的示例。 请看下面的两行。 如果 msgid 为0x400、MsgIDMask 为0xFFFE、则允许0x400和0x401进入报文对象。  

    sMsgObjectRx.ui32MsgID = 0x400;

    sMsgObjectRx.ui32MsgIDMask = 0xFFFE;

    如果设置   sMsgObjectRx.ui32MsgIDMask = 0xFFFF、则只接受0x400。  

    如果设置 sMsgObjectRx.ui32MsgIDMask = 0x400、则允许0x400、0x401、0x402、0x403 0x404...... 0x4FE、0x4FF 、屏蔽为零位的任何位都允许接受相应的 ID 位。  

    如果设置  sMsgObjectRx.ui32MsgIDMask = 0x0000、则允许 ID 的所有11位或29位(具体取决于您是否使用扩展 ID 格式)。  

    2.按照配置 A 中的说明对 CANIFnMSK1和 CANIFnMSK2寄存器进行编程
    发送报文对象"、以配置哪些位用于验收
    滤波。 请注意、要将这些位用于验收滤波、必须启用它们
    将 CANIFnMCTL 寄存器的 UMASK 位置位即可。
    3.在 CANIFnMSK2寄存器中、使用 MSK[12:0]位来指定29位中的哪一位
    11位报文标识符用于验收滤波。 请注意、使用了 MSK[12:0]
    对于29位报文标识符的[28:16]位;而 MSK[12:2]用于的[10:0]位
    11位消息标识符。 使用 MXTD 和 MDIR 位指定是否使用 XTD 和
    用于验收滤波的 DIR。 值0x00使能所有消息通过
    接受过滤。 另请注意、为了将这些位用于验收滤波、
    必须通过将 CANIFnMCTL 寄存器的 UMASK 位置位来启用这些寄存器

    [引用 userid="499571" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1039203/tm4c1294kcpdt-can-receiving-issue-in-tm4c1294kc/3871828 #3871828"]

    我们没有得到任何关于禁用过滤器时为什么我们收到邮件的说明、我们在前一封邮件中询问了这一点。

    [/报价]

    当您禁用滤波器时、不会使用掩码位。  

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

    您好!

    感谢您提供的信息。

    现在,我们要为多个按摩 ID 配置过滤器。 请阅读下面的代码段、其中我们尝试配置消息 ID 的8、9、10、11。 这是可以的吗?

    sCANMessage.ui32MsgID = 0x0008;
    sCANMessage.ui32MsgIDMask = 0xFF0;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sCANMessage.ui32MsgLen = 8;

    sCANMessage.ui32MsgID = 0x0009;
    sCANMessage.ui32MsgIDMask = 0xFF0;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sCANMessage.ui32MsgLen = 8;

    sCANMessage.ui32MsgID = 0x000A;
    sCANMessage.ui32MsgIDMask = 0xFF0;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sCANMessage.ui32MsgLen = 8;

    sCANMessage.ui32MsgID = 0x000B;
    sCANMessage.ui32MsgIDMask = 0xFF0;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sCANMessage.ui32MsgLen = 8;

    谢谢、此致、

    Vijil

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

    您好!

    您所需的一切尽在下面。 由于屏蔽为0xFFF0、它将接受0x8、0x9、0xA 和0xB。 您不必重复四次。 确保启用  MSG_OBJ_USE_ID_FILTER 标志。  

    sCANMessage.ui32MsgID = 0x0008;
    sCANMessage.ui32MsgIDMask = 0xFF0;
    sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER
    sCANMessage.ui32MsgLen = 8;

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

    您好!

    谢谢、滤波器问题已成功解决。

    但是、我们还需要了解另一件事。 当我们单独连接一个节点时,将 pcan 工具设置为每2秒发送一条消息。在第一条消息发送 传输错误计数器弹出并显示219,并且位填充错误也被报告。这是什么原因?

    这就是我初始化 CAN 的方式:


    CANInit (CAN0_BASE);
    CANBitRateSet (CAN0_BASE、g_ui32SysClock、CAN_BAUDRATE);
    CANEnable (CAN0_BASE);
    CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR);

    G_CAN_MsgObject[MSGOBJ_NUM_MSG_RX1]。ui32MsgID = MSGOBJ_ID_MSG_ID300_RX;
    G_CAN_MsgObject[MSGOBJ_NUM_MSG_RX1].ui32MsgIDMask = 0x000;
    G_CAN_MsgObject[MSGOBJ_NUM_MSG_RX1]。ui32Flags = MSG_OBJ_RX_INT_ENABLE;//中断使能
    G_CAN_MsgObject[MSGOBJ_NUM_MSG_RX1].ui32MsgLen = 8;
    G_CAN_MsgObject[MSGOBJ_NUM_MSG_RX1].pui8MsgData =(uint8_t *)&g_CAN_MsgID300_RX;
    CANMessageSet (CAN0_BASE、MSGOBJ_NUM_MSG_RX1、&g_CAN_MsgObject[MSGOBJ_NUM_MSG_RX1]、MSG_OBJ_TYPE_RX);

    IntEnable (INT_CAN0);

    这就是接待的方式:

    //! CAN 通信的 IRQ 功能。
    //!
    //! 中断
    //!
    //
    //
    空 CAN0_IRQHandler (空)

    uint32_t ui32Status、g_u32CANErrorCounter = 0;
    //找到中断的原因,如果它是状态中断,那么就找到它
    //通过读取状态寄存器来确认中断。
    ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);

    /**从寄存器中读取 TX 和 RX 错误计数并将其分配给单独的变量*/

    G_u32CANErrorCounter = HWREG (CAN_O_ERR);偏移地址0x00000008 // CAN 错误计数器
    G_u8TXEValue =(uint8_t)(g_u32CANErrorCounter & 0x000000ff);
    g_u8RXEValue =(uint8_t)((g_u32CANErrorCounter & 0x0000ff00)>>8);

    /**从寄存器(LEC 位域)中查找最后一个 CAN 错误*/

    G_u32CANErrorStatus =(uINT32_t)(HWREG (CAN_O_STS)和0x00000007);偏移地址0x00000004 // CAN 状态

    if (ui32Status!= CAN_INT_INTID_STATUS)

       if (ui32Status = 0x01)//报文对象 ID
       {

          //数据包处理。
       }

    谢谢、此致、

    Vijil。

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

    尊敬的 Vijil:

     我过去问过几个问题、您从未真正回答过我。 要解决您的问题、您能否回答这些问题。 我将重复这里的一些问题以及其他一些问题。  

    具体取决于您使用的晶体。 您能否将系统设置为 OSC 作为主时钟。 我想知道基于 OSC 与 PLL 的位时序是否有问题。 请参阅以下示例、将系统时钟设置为 OSC 时钟频率为25MHz。  

    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC)、25000000);

     -您编写 了 CANBitRateSet (CAN0_BASE、g_ui32SysClock、CAN_BAUDRATE)。  CAN_BAUDRATE 的值是多少? 这是否与 您的 pcan 工具相匹配?

    -您能否使用逻辑分析仪探测 CANTX 和 CANRX 信号? 您能否查看波形并判断 是否存在导致位填充错误的相同级别的超过5个连续位。  

    -对于实验、请勿使用 PSCAN 工具进行传输。 您能否在两个节点上运行 TivaWare CAN 示例? 将一个配置为 TX、将另一个配置为 RX。 您是否会遇到任何位填充错误? 相关示例可在中找到:

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_tx.c.

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_rx.c

    -保持一个节点运行您自己的传输代码。 使用另一个节点运行  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_rx.c example。 在本例中、您是否看到位填充错误?

    -保持一个节点运行您自己的接收代码。 使用另一个节点运行  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_tx.c example。 在本例中、您是否看到位填充错误?

    -保持一个节点运行 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\can\simple_rx.c 示例。 使用 PSCAN 工具发送消息。 在本例中、您是否看到位填充错误?