注册 登录
查看: 536|回复: 12

求助论坛的大神门指教,山外哥的底层使用疑问

[复制链接]
发表于 2014-12-12 12:27:42 | 显示全部楼层 |阅读模式
/*!
*  @brief      CAN 接收掩码配置
*  @param      CANn_e          CAN 模块号
*  @param      mb_num_e        缓冲区编号
*  @param      mask            掩码
*  @param      isIRMQ          是否选择独立掩码(0为全局掩码,其他为独立掩码)
*  @since      v5.0
*  Sample usage:      can_rxbuff_mask(CAN1,CAN_RX_MB,0x00FF,1);
*                              //CAN1 的CAN_RX_MB 缓冲区 配置掩码为 0x00FF
*/
void can_rxbuff_mask(CANn_e cann, mb_num_e nMB, uint32 mask,uint8 isIRMQ)
{
    uint8           bFreezeMode;
    CAN_MemMapPtr   canptr = CANN[cann];
    //进入冻结模式
    if(!(CAN_MCR_REG(canptr) & CAN_MCR_HALT_MASK))
    {
        CAN_MCR_REG(canptr)  |= (CAN_MCR_HALT_MASK);
        // 等待进入 进入冻结模式
        while(!(CAN_MCR_REG(canptr) & CAN_MCR_FRZACK_MASK));
        bFreezeMode = 0;
    }
    else
    {
        bFreezeMode = 1;
    }
    if(isIRMQ != 0)       //使用独立掩码
    {
        CAN_MCR_REG(canptr) |=  CAN_MCR_IRMQ_MASK;
        // 独立掩码
        CAN_RXIMR_REG(canptr, nMB) = mask;
    }
    else
    {
        CAN_MCR_REG(canptr) &=  ~CAN_MCR_IRMQ_MASK;
        // 14/15 是使用独立的
        if(nMB == MB_NUM_14)
        {
            CAN_RX14MASK_REG(canptr)  = mask;
        }
        else if (nMB == MB_NUM_15)
        {
            CAN_RX15MASK_REG(canptr)  = mask;
        }
        else
        {
            // 剩余的支持全局掩码
            CAN_RXMGMASK_REG(canptr)  = mask;
        }
    }
    // 恢复CAN 操作模式
    if(!bFreezeMode)
    {
        // De-assert Freeze Mode
        CAN_MCR_REG(canptr)  &= ~ (CAN_MCR_HALT_MASK);
        // Wait till exit of freeze mode
        while( CAN_MCR_REG(canptr)  & CAN_MCR_FRZACK_MASK);
        // Wait till ready
        while( CAN_MCR_REG(canptr) & CAN_MCR_NOTRDY_MASK);
    }
}

K60有没有像STM32那种点名模式的掩码?
上面是山外哥写的底层,我想知道那个掩码怎么用? 本机地址是0x0B,只想接收0x0A地址的数据,其他的全屏蔽,那么mask这个变量要怎么设置?目的地址在哪里设置的呢?
求大家来给指导一下,非常感谢
回复

使用道具 举报

发表于 2014-12-12 12:31:26 | 显示全部楼层
can 肯定是可以点名啊 !这个跟单片机无关。
mask 就是 0位表示可任意,1为表示必须一致。
回复 支持 反对

使用道具 举报

发表于 2014-12-12 12:31:47 | 显示全部楼层
mask  跟电脑网卡里配置的掩码是 一样的意思
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 12:34:31 | 显示全部楼层
仰逸致 发表于 1418358686
can 肯定是可以点名啊 !这个跟单片机无关。
mask 就是 0位表示可任意,1为表示必须一致。
这个我看芯片手册看到了,但是我一直的疑问是在哪里设置我想要的那个地址呢,STM32有一个标志符寄存器,一个屏蔽寄存器,两个对比,得出过滤后的ID地址,可是这个我只找到了屏蔽寄存器,没找到写标志符的寄存器啊
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-12 12:35:38 | 显示全部楼层
q515702604 发表于 1418358871
这个我看芯片手册看到了,但是我一直的疑问是在哪里设置我想要的那个地址呢,STM32有一个标志符寄存器,一个屏蔽寄存器,两个对比,得出过滤后的ID地址,可是这个我只找到了屏蔽寄存器,没找到写标志符的寄存器啊
你可以看我们的例程,有专门的函数接口配置接收ID的啊
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 12:36:07 | 显示全部楼层
仰逸致 发表于 2014-12-12 12:31
mask  跟电脑网卡里配置的掩码是 一样的意思

电脑网卡里的掩码?没了解过,能通俗的解释一下吗
回复 支持 反对

使用道具 举报

发表于 2014-12-12 12:38:38 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 12:40:55 | 显示全部楼层
山外メ雲ジ 发表于 2014-12-12 12:35
你可以看我们的例程,有专门的函数接口配置接收ID的啊


extern void    can_init        (CANn_e cann, CAN_BAUD_e band, CAN_mode_e mode,CAN_CLKSRC_e clksrc);    //CAN 初始化
extern void    can_tx          (CANn_e cann, mb_num_e nMB, CAN_USR_ID_t id, uint8 len, void *buff);    //CAN 发送数据
extern void    can_rx          (CANn_e cann, mb_num_e nMB, CAN_USR_ID_t *id, uint8 *len, void *buff);  //CAN 接收数据
extern void    can_rxbuff_enble(CANn_e cann, mb_num_e nMB, CAN_USR_ID_t id);                           //使能 CAN 接收缓冲区
extern void    can_rxbuff_mask (CANn_e cann, mb_num_e nMB, uint32 mask,uint8 isIRMQ);                  //CAN 接收掩码配置,选择
extern void    can_irq_en      (CANn_e cann, mb_num_e nMB);                                            //使能 CAN 缓冲区接收和发送中断
extern void    can_irq_dis     (CANn_e cann, mb_num_e nMB);                                            //禁止 CAN 缓冲区接收和发送中断
extern void    can_clear_flag  (CANn_e cann, mb_num_e nMB);                                            //清 CAN 缓冲区中断标志
extern uint32  can_get_flag    (CANn_e cann, mb_num_e nMB);                                            //获得 CAN 缓冲区中断标志
extern void    can_setband     (CANn_e cann, CAN_BAUD_e band);                                         //设置 CAN 的波特率

关于CAN的所有函数都在这里呢,没找到设置目的ID的函数?难道不在can.h里吗?
回复 支持 反对

使用道具 举报

发表于 2014-12-12 12:42:07 | 显示全部楼层
q515702604 发表于 1418359255
extern void    can_init        (CANn_e cann, CAN_BAUD_e band, CAN_mode_e mode,CAN_CLKSRC_e clksrc);    //CAN 初始化
extern void    can_tx          (CANn_e cann, mb_num_e nMB, CAN_USR_ID_t id, uint8 len, void *buff);    //CAN 发送数据
extern void    can_rx          (CANn_e cann, mb_num_e nMB, C ...
void    can_rxbuff_enble(CANn_e cann, mb_num_e nMB, CAN_USR_ID_t id);                           //使能 CAN 接收缓冲区
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 12:51:04 | 显示全部楼层
山外メ雲ジ 发表于 2014-12-12 12:42
void    can_rxbuff_enble(CANn_e cann, mb_num_e nMB, CAN_USR_ID_t id);                           //使 ...

在结点B例程中有  
CAN_USR_ID_t    can_my_id       = {0x85,0,0};               //本机ID
can_rxbuff_enble(CAN1,CAN_RX_MB,can_my_id);                 //使能接收缓冲区
这不是在使能缓冲区,写自己的地址到MB.ID中吗,也不是设置想要接收的ID地址啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 13:06:01 | 显示全部楼层
山外メ雲ジ 发表于 2014-12-12 12:42
void    can_rxbuff_enble(CANn_e cann, mb_num_e nMB, CAN_USR_ID_t id);                           //使 ...

山外哥,K60里有没有点名模式?我在芯片手册里没看到关于点名模式介绍,在底层中也没发现,求指导一下
回复 支持 反对

使用道具 举报

发表于 2014-12-12 13:33:35 | 显示全部楼层
q515702604 发表于 2014-12-12 13:06
山外哥,K60里有没有点名模式?我在芯片手册里没看到关于点名模式介绍,在底层中也没发现,求指导一下

掩码全部设为1(是全部位都是1),然后设定接收ID 不就可以了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 13:37:47 | 显示全部楼层
刚刚懵住了,非常感谢
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部