OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3883|回复: 3

CAN中断无法进入,请大神指点。。。在线等

[复制链接]

8

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-11-13
在线时间
17 小时
发表于 2016-1-13 13:36:57 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 Flymer 于 2016-1-13 15:42 编辑

我用的是STM32F103C8T6的MCU和SN65HVD230的CAN芯片,只用了一块电路板;中断都配置了,但是无法进去;清=请大神指点
程序GPIO口的配置
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);

        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);        
}

CAN的模式配置:
static void CAN_Mode_Config(void)
{
           CAN_InitTypeDef        CAN_InitStructure;                        
          CAN_DeInit(CAN1);
          CAN_StructInit(&CAN_InitStructure);
        
          CAN_InitStructure.CAN_TTCM=DISABLE;                        
    CAN_InitStructure.CAN_ABOM=DISABLE;                          
    CAN_InitStructure.CAN_AWUM=DISABLE;                           
    CAN_InitStructure.CAN_NART=DISABLE;                        
    CAN_InitStructure.CAN_RFLM=DISABLE;                          
    CAN_InitStructure.CAN_TXFP=DISABLE;                          
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;                  
    CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;               
    CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;                  
    CAN_InitStructure.CAN_Prescaler =4;                 
   CAN_Init(CAN1, &CAN_InitStructure);
}

CAN过滤器配置
static void CAN_Filter_Config(void)
{
          CAN_FilterInitTypeDef  CAN_FilterInitStructure;
          CAN_FilterInitStructure.CAN_FilterNumber=0;                                                
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;               
         CAN_FilterInitStructure.CAN_FilterIdHigh= (((u32)0x0001<<3)&0xFFFF0000)>>16;        //扩展ID,地址为0X0001;               
         CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x0001<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
         CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0xFFFF;               
         CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0xFFFF;                                
          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ;                                
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;               
          CAN_FilterInit(&CAN_FilterInitStructure);
        
        CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);  //CAN通讯中断使能
}

CAN通信报文设置
void CAN_SetMsg(void)
{                 
      TxMessage.StdId=0x00;                                                
      TxMessage.ExtId=0x0001;                                
       TxMessage.IDE=CAN_ID_EXT;                                       
       TxMessage.RTR=CAN_RTR_DATA;                                
       TxMessage.DLC=2;                                                        
        TxMessage.Data[0]=0x12;
        TxMessage.Data[1]=0x11;

}


void CAN_Config(void)
{
  CAN_GPIO_Config();
  CAN_Mode_Config();
  CAN_Filter_Config();   
}


main程序
CanTxMsg TxMessage;                          
CanRxMsg RxMessage;                        

void RCC_Configuration(void)  //时钟配置
{
        SystemInit();        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
                           |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                           |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
                                                               |RCC_APB2Periph_ADC1  | RCC_APB2Periph_AFIO
                           |RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE );

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
                           |RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2        
                           | RCC_APB1Periph_CAN1, ENABLE );
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

}
//中断控制使能
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
                 
/* Configure one bit for preemption priority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;         
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                          
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

int main(void)
{        
    RCC_Configuration();      NVIC_Configuration();  
    CAN_Config();
    CAN_SetMsg();                                       
    CAN_Transmit(CAN1, &TxMessage);  

        while (1)
        {
        }
}


中断服务函数
void USB_LP_CAN1_RX0_IRQnHandler(void)
{        
           CanRxMsg RxMessage;        
           RxMessage.StdId=0x00;
           RxMessage.ExtId=0x00;
          RxMessage.IDE=0;
          RxMessage.DLC=0;
          RxMessage.FMI=0;
          RxMessage.Data[0]=0x00;
          RxMessage.Data[1]=0x00;
     CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
        
           if((RxMessage.ExtId==0x0001)  &&           
             (RxMessage.IDE==CAN_ID_EXT)&&
             (RxMessage.DLC ==2 ))     
        {
            flag = 0;                                                                                 
        }
        else
        {
            flag = 0xff;                                          
        }

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2012-12-19
在线时间
16 小时
发表于 2016-1-13 19:18:01 | 显示全部楼层
看看原子的例程吧。我用库函数比较方便。而且也没有出现过问题。
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2014-9-22
在线时间
8 小时
发表于 2016-1-18 12:53:26 | 显示全部楼层
库的版本一定要3.5的吗?
回复

使用道具 举报

1

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
953
金钱
953
注册时间
2020-4-16
在线时间
81 小时
发表于 2020-4-16 20:49:54 | 显示全部楼层
同问同问
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 10:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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