野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21846|回复: 2

CAN实验买进不了中断

[复制链接]
发表于 2014-6-4 11:27:41 | 显示全部楼层 |阅读模式
can初始化部分
void CAN_Config(void)
{
  CAN_GPIO_Config();
  CAN_NVIC_Config();
  CAN_Mode_Config();
  CAN_Filter_Config();   
}
以下是对应的函数初始化
static void CAN_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   
   /*外设时钟设置*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
   /*IO设置*/
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
/* Configure CAN pin: RX */                        // PB8
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;              // 上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Configure CAN pin: TX */                        // PB9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
GPIO_Init(GPIOB, &GPIO_InitStructure);

}

static void CAN_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);               /*中断设置*/
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;    //CAN1 RX0中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     //抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      //子优先级为0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

static void CAN_Mode_Config(void)
{
    CAN_InitTypeDef        CAN_InitStructure;
   /************************CAN通信参数设置**********************************/
/*CAN寄存器初始化*/
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);

/*CAN单元初始化*/
CAN_InitStructure.CAN_TTCM=DISABLE;      //MCR-TTCM  关闭时间触发通信模式使能
    CAN_InitStructure.CAN_ABOM=DISABLE;      //MCR-ABOM  自动离线管理
    CAN_InitStructure.CAN_AWUM=DISABLE;      //MCR-AWUM  使用自动唤醒模式
    CAN_InitStructure.CAN_NART=DISABLE;      //MCR-NART  禁止报文自动重传   DISABLE-自动重传
    CAN_InitStructure.CAN_RFLM=DISABLE;      //MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文  
    CAN_InitStructure.CAN_TXFP=DISABLE;      //MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  //正常工作模式
    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;     //BTR-SJW 重新同步跳跃宽度 1个时间单元
    CAN_InitStructure.CAN_BS1=CAN_BS1_6tq;     //BTR-TS1 时间段1 占用了6个时间单元
    CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;     //BTR-TS1 时间段2 占用了3个时间单元
    CAN_InitStructure.CAN_Prescaler =4;     ////BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+6+3)/4=0.9Mbps
CAN_Init(CAN1, &CAN_InitStructure);
}

static void CAN_Filter_Config(void)
{
   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
/*CAN过滤器初始化*/
CAN_FilterInitStructure.CAN_FilterNumber=0;      //过滤器组0
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //工作在标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //过滤器位宽为单个32位。
/* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
//    CAN_FilterInitStructure.CAN_FilterIdHigh= (((u32)0x1314<<3)&0xFFFF0000)>>16;    //要过滤的ID高位
//    CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位
//    CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0xFFFF;   //过滤器高16位每位必须匹配
//    CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0xFFFF;   //过滤器低16位每位必须匹配
   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;        //过滤器标识号高16位
   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;        //过滤器标识号低16位
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;       //根据模式选择过滤器标识号或屏蔽号的高16位
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;       //根据模式选择过滤器标识号或屏蔽号的低16位
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ;    //过滤器被关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;   //使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);
/*CAN通信中断使能*/
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}


以下是中断函数
extern CanRxMsg RxMessage;
extern unsigned char RevCan;
extern unsigned char RevUart;
void USB_LP_CAN1_RX0_IRQHandler(void)   //CAN中断函数
{
//CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);   //从CAN1口缓冲器FIFO 0接收报文到 RxMessage
while(CAN_MessagePending(CAN1,CAN_FIFO0))
{
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);   //从CAN1口缓冲器FIFO 0接收报文到 RxMessage
    CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0 );
  RevCan = 1;
}
}
以上是Can有关的代码。但是我的can发射信号时20K,扩展帧 格式,需要将上面的差数该怎么改呢?现在的情况是我can中断函数进不去啊。。
回复

使用道具 举报

发表于 2014-6-4 11:30:20 | 显示全部楼层
看看你的报文是不是不符合接收机的滤波格式,被can外设自动滤波去掉了,就不会进入中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-4 11:55:17 | 显示全部楼层
子车梨祎 发表于 2014-6-4 11:30
看看你的报文是不是不符合接收机的滤波格式,被can外设自动滤波去掉了,就不会进入中断

CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;        //过滤器标识号高16位
   CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;        //过滤器标识号低16位
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;       //根据模式选择过滤器标识号或屏蔽号的高16位
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;       //根据模式选择过滤器标识号或屏蔽号的低16位
我的滤波器是这样设置的。应该是所有的帧都接受的。

回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-27 23:34 , Processed in 0.027066 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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