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/TM4C123GH6PGE:TM4C123GH6PGE CANMessageGet ()修复我的 ID 消息

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/583531/ccs-tm4c123gh6pge-tm4c123gh6pge-canmessageget-repair-my-id-message

器件型号:TM4C123GH6PGE

工具/软件:Code Composer Studio

这张图片是配置消息 CAN[5]。

中断后、我调用 :CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、0);

然后修复 ID 和长度,因为在 funion CANMessageGet 中:(到2和0)

ui16CmdMaskReg =(CAN_IF1CMSK _dataaa | CAN_IF1CMSK _DATAB |
CAN_IF1CMSK _控制| CAN_IF1CMSK _掩码|
CAN_IF1CMSK _ARB);

psMsgObject->ui32MsgID =(ui16ArbReg1 & CAN_IF1ARB2_ID_M)>> 2;

下一次:中断仍然出现并且 CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、0); 仍然调用

我不知道为什么,请帮我

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    恐怕我不确定我是否理解您的问题。 如果您告诉我:
    1.您设置邮箱6
    然后在接收到 CAN 消息时获取中断、
    3.在中断例程中,您使用"CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、0);"
    4.您退出中断例程,但会立即再次调用中断。

    那么问题是您没有清除中断、因为 CANMessageGet 函数的最后一个参数是布尔值、指示该函数是否应清除暂挂中断。 将该参数设置为"0"、即"false"。 若要清除暂挂中断、调用应如下所示:

    CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、1);

    为便于阅读、我建议您包含 并将函数调用为:

    CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、true);"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我向您展示步骤:
    1>初始:
    ------------------------------------------------------
    /*初始消息框信息*/
    对于(I = 0U;I < CAN_MsgBox_number;I++)

    CAN_DATA[I].CAN_Counter = 0U;
    CAN_DATA[I].CAN_Flag = 0U;
    if (CAN_ID[I].CANEnable!= disable)

    G_sCAN0Message[I].ui32MsgID = CAN_ID[I].CANMsgID;
    G_sCAN0Message[i].ui32MsgIDMask = 0U;
    G_sCAN0Message[I].pui8MsgData = CAN_DATA[I].CAN_Data;/*指针接收数据*
    G_sCAN0Message[I].ui32MsgLen = CAN_ID[I].CanLen;
    IF (CAN_ID[I].CanMode = MSG_OBJ_TYPE_RX)

    G_sCAN0Message[I].ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;//启用中断中的接收*
    CANMessageSet (CAN0_BASE、(I+1U)、&g_sCAN0Message[i]、(tMsgObjType) CAN_ID[I].CanMode);/* Setup Msg */

    else /* TX */

    G_sCAN0Message[I].ui32Flags = MSG_OBJ_TX_INT_ENABLE;/* MSG_OBJ_NO_FLAGS;*//*启用传输中断*/


    else /*禁用消息*/

    G_sCAN0Message[i].ui32MsgID = 0U;
    G_sCAN0Message[i].ui32MsgIDMask = 0U;
    G_sCAN0Message[i].ui32MsgLen = 0U;


    ------------------------------------------------------------------
    2>初始化成功。 中断发生
    空 CAN0_Interrupts_Handler (空)

    如果(ui32Status ==6U)/*检查原因是否为消息对象1~32。 *

    CANIntClear (CAN0_BASE、ui32Status);
    if ((tMsgObjType) CAN_ID[ui32Status-1].CanMode = MSG_OBJ_TYPE_RX)

    CAN_DATA[ui32Status-1].CAN_Flag = 1U;/*通知 Rx 数据*/



    3>在我的应用中:每10毫秒调用一次
    void CAN_Rx_Appication (void)/*每10ms 运行一次*/

    对于(i = 0;i < CAN_MsgBox_number;i ++)/* 0 ~ 31 */

    if (CAN_DATA[I].CAN_Flag == 1U)

    CANMessageGet (CAN0_BASE、(I+1)、&g_sCAN0Message[i]、0);




    调用后:CANMessageGet (CAN0_BASE、(i+1)、&g_sCAN0Message[i]、0);
    ->g_sCAN0Message[5]的设置被修改:ID = 2、Len = 0。  (我已在最重要的问题中添加)
    然后、我发送下一条消息0x03、中断仍然出现、CANMessageGet (CAN0_BASE、(I+1)、&g_sCAN0Message[i]、0); 回忆一下
    为什么???? (如果修改了 ID,为什么会出现中断?)

    您的问题4:我不禁用中断、因为消息始终从主器件发送

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

    我仍然不确定我是否理解您的问题。 如果这不能回答您的问题、请尝试重新措辞并再次询问。

    您可以将 CAN 邮箱6设置为接收消息 ID 0x0002、但您将 MsgIdMask = 0x0000、所有位都被屏蔽。 这意味着接收到的任何消息 ID 都将进入此邮箱。 在您的情况下、消息 ID 0x0003出现并存储在邮箱中。 CANMessageGet ()例程使用接收 ID (0x0003)和接收消息的长度(0)更新结构。 如果您希望在邮箱6中仅接收消息 ID 0x0002、则应设置 MsgIdMask = 0xFFFFFFFF、该 ID 的所有位都将被使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我向您展示我的项目:(我是从设备)

    主器件发送2消息(ID = 2 (1字节)、ID = 3 (8字节)->每隔1秒发送一次 OK。

    2.我是 Slaver,我配置:
    tCANMsgObject g_sCAN0Message[32];
    /* Init 消息1、ID = 3 */
    G_sCAN0Message[5]。ui32MsgID = 3;
    G_sCAN0Message[5]。ui32MsgIDMask =0;
    G_sCAN0Message[5].ui32MsgLen = 8;
    G_sCAN0Message[5].pui8MsgData = g_ui8CANData_3;/* g_ui8CANData_3[8]*
    G_sCAN0Message[5]。ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    CANMessageSet (CAN0_BASE、6、&g_sCAN0Message[5]、MSG_OBJ_TYPE_RX);
    /* Init 消息2、ID = 2 */
    G_sCAN0Message[8].ui32MsgID = 2;
    G_sCAN0Message[8].ui32MsgIDMask =0;
    G_sCAN0Message[8].ui32MsgLen = 1;
    G_sCAN0Message[8]。pui8MsgData =(uint8_t *) g_ui8CANData_2;// g_ui8CANData_2[1]*
    G_sCAN0Message[8].ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    CANMessageSet (CAN0_BASE、9、&g_sCAN0Message[8]、MSG_OBJ_TYPE_RX);

    在中断处理程序中:

    否则,如果(ui32Status ==6U)/*检查原因是否为消息对象1~32。 *

    CANIntClear (CAN0_BASE、ui32Status);
    flag_rx1 = 1;

    否则,如果(ui32Status ==9U)/*检查原因是否为消息对象1~32。 *

    CANIntClear (CAN0_BASE、ui32Status);
    flag_rx2 = 1;


    每个10ms 应用:

    如果(FLAG_rx1 = 1)

    CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、false);
    flag_rx1 = 0;

    否则、如果(FLAG_rx2 = 1)

    CANMessageGet (CAN0_BASE、9、&g_sCAN0Message[8]、false);
    flag_rx2 = 0;


    问题:
    -当第一个应用发生时:G_sCAN0Message[5]被修改,ID = 2,长度= 0 (让我们在第一个问题的图片中看到)
    - t flag_rx2 never = 1、(ui32Status = 9U)从不会出现

    我不知道为什么。 请帮我解决这个问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您必须更改:

    G_sCAN0Message[5]。ui32MsgIDMask =0; 

    更改为

    G_sCAN0Message[5].ui32MsgIDMask =0x00FFFFFF; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经更改了 g_sCAN0Message[5].ui32MsgIDMask =0x00FFFFFF;

    但是在接收第1个帧后,ID -> 2,屏蔽-> 0x000007FF,长度-> 0
    我不知道为什么
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob Crosby:

    我已经解决了这个问题。 此错误为:

    Driverlib 中的 TivaWare_C_Series-2.1.3.156 -> CAN.c -> CANIntClear (uint32_t ui32Base、uint32_t ui32IntClr)

    我修改了:HWREG (ui32Base + CAN_O_IF1CMSK)|= CAN_IF1CMSK _CLRINTPND;

    至 HWREG (ui32Base + CAN_O_IF1CMSK)= CAN_IF1CMSK _CLRINTPND;/* DaoHVN ->在论坛 e2e.ti.com 论坛中进行修复*
    当获取数据时:CANMessageGet (CAN0_BASE、6、&g_sCAN0Message[5]、true);

    非常感谢