[技术问答] NUC970 CAN接收任意ID的数据

[复制链接]
 楼主| wzhzn 发表于 2021-3-25 14:30 | 显示全部楼层 |阅读模式
1、NUC970 裸机程序2、怎样配置CAN的寄存器,使CAN通信能够接收任意ID的数据包。
谢谢!
twjiang 发表于 2021-3-25 16:43 | 显示全部楼层
The Message Objects and Identifier Masks for acceptance filtering of received messaged in the Message RAM.

https://github.com/OpenNuvoton/NUC970_NonOS_BSP/tree/master/SampleCode/CAN

int32_t CAN_SetRxMsgObj(UINT32  uCAN, uint8_t u8MsgObj, uint8_t u8idType, uint32_t u32id, uint8_t u8singleOrFifoLast)
{
    UINT32 uOffset = uCAN * CAN_OFFSET;

    if((inpw(REG_CAN0_IF2_CREQ+uOffset) & CAN_IF_CREQ_BUSY_Msk) != 0)
    {
        return FALSE;
    }

    /* Command Setting */
    outpw((REG_CAN0_IF2_CMASK+uOffset), (CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_MASK_Msk | CAN_IF_CMASK_ARB_Msk |
                                         CAN_IF_CMASK_CONTROL_Msk | CAN_IF_CMASK_DATAA_Msk | CAN_IF_CMASK_DATAB_Msk));

    if (u8idType == CAN_STD_ID)   /* According STD/EXT ID format,Configure Mask and Arbitration register */
    {
        outpw((REG_CAN0_IF2_ARB1+uOffset), 0x0);
        outpw((REG_CAN0_IF2_ARB2+uOffset), (CAN_IF_ARB2_MSGVAL_Msk | (u32id & 0x7FF)<< 2)); /* Identifier Masks */       /*  参考 NUC970 Technical Reference Manual Page 824.  CAN_IFn_ARB2, Bit 15, 0 = The Message Object is ignored by the Message Handler
             当把第15位配置成0,将会忽略指定的消息对象,即所有的CAN消息对象将会被处理! */
    }
    else
    {
        outpw((REG_CAN0_IF2_ARB1+uOffset), (u32id & 0xFFFF));
        outpw((REG_CAN0_IF2_ARB2+uOffset), (CAN_IF_ARB2_MSGVAL_Msk | CAN_IF_ARB2_XTD_Msk | (u32id & 0x1FFF0000)>>16));
    }

    outpw((REG_CAN0_IF2_MCON+uOffset), (inpw(REG_CAN0_IF2_MCON+uOffset) | CAN_IF_MCON_UMASK_Msk | CAN_IF_MCON_RXIE_Msk));

    if(u8singleOrFifoLast)
    {
        outpw((REG_CAN0_IF2_MCON+uOffset), (inpw(REG_CAN0_IF2_MCON+uOffset) | CAN_IF_MCON_EOB_Msk));
    }
    else
    {
        outpw((REG_CAN0_IF2_MCON+uOffset), (inpw(REG_CAN0_IF2_MCON+uOffset) & ~CAN_IF_MCON_EOB_Msk));
    }

    outpw((REG_CAN0_IF2_DAT_A1+uOffset), 0x0);
    outpw((REG_CAN0_IF2_DAT_A2+uOffset), 0x0);
    outpw((REG_CAN0_IF2_DAT_B1+uOffset), 0x0);
    outpw((REG_CAN0_IF2_DAT_B2+uOffset), 0x0);

    outpw((REG_CAN0_IF2_CREQ+uOffset), (1 + u8MsgObj)); /* Message Object */

    return TRUE;
}
twjiang 发表于 2021-3-26 17:25 | 显示全部楼层

Reference: NUC970 Technical Reference Manual Page 822,  (CAN_IFn_MASK2), Msk[28:16] = 0 即可。
Msk[28:16] = 0 The corresponding bit in the identifier of the message object cannot inhibit the match in the acceptance filtering.


以下表述有误:
/*  参考 NUC970 Technical Reference Manual Page 824.  CAN_IFn_ARB2, Bit 15, 0 = The Message Object is ignored by the Message Handler
             当把第15位配置成0,将会忽略指定的消息对象,即所有的CAN消息对象将会被处理! */
laocuo1142 发表于 2021-12-15 15:54 | 显示全部楼层

我认为例程和底层的驱动均是基于标识符列表模式,没有屏蔽位模式。因英语水平所限,不知怎样设置成屏蔽位模式,请各位指教,谢谢!
flycamelaaa 发表于 2021-12-15 15:55 | 显示全部楼层
Reference: NUC970 Technical Reference Manual Page 822,  (CAN_IFn_MASK2), Msk[28:16] = 0 即可。

以下表述有误:
/*  参考 NUC970 Technical Reference Manual Page 824.  CAN_IFn_ARB2, Bit 15, 0 = The Message Object is ignored by the Message Handler
             当把第15位配置成0,将会忽略指定的消息对象,即所有的CAN消息对象将会被处理! */
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

12

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

4

主题

12

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部