CAN总线代码(六)

void CAN1_Config_init(void) 
{ 
     CAN_InitTypeDef        CAN_InitStructure; 
     CAN_FilterInitTypeDef  CAN_FilterInitStructure; 
  
  	 CAN_DeInit(CAN1); 
  	 CAN_StructInit(&CAN_InitStructure); 
   	//36MHz 500Kbps 
     CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 
     CAN_InitStructure.CAN_ABOM=DISABLE;//软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测 
                                        //到128次11位连续的隐性位,就退出离线状态 
     CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒 
     CAN_InitStructure.CAN_NART=DISABLE;//CAN报文是否只发1次,不管发送的结果如何(成功/出错或仲裁丢失) 
     CAN_InitStructure.CAN_RFLM=DISABLE;//在接收到溢出时FIFO未被锁定,当接收到FIFO报文未被读出,下一个收到的报文会覆盖原有的报文 
     CAN_InitStructure.CAN_TXFP=DISABLE;//发送的FIFO优先级由报文的标识符来决定 
       

   //设置传输波特率   
     if(CAN1_BPS ==  0) //250kbps
     { 
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位 
        CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;//时间段1为12个时间单位 
        CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;//时间段2为3个时间单位 
        CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps                                          
     } 
     else if(CAN1_BPS == 1)//500kbps 
     { 
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位 
        CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//时间段1为5个时间单位 
        CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//时间段2为2个时间单位 
        CAN_InitStructure.CAN_Prescaler= 9; //36M/(1+5+2)/9 = 500kbps         
     } 
     else //1M
     { 
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位 
        CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;//时间段1为2个时间单位 
        CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;//时间段2为1个时间单位 
        CAN_InitStructure.CAN_Prescaler= 9; //36M(1+2+1)/9 = 1M           
     } 
     CAN_Init(CAN1,&CAN_InitStructure);  
                                          
//过滤器初始化
     CAN_FilterInitStructure.CAN_FilterNumber=0;  //指定了待初始化的过滤器0 
     CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定了过滤器将被初始化到的模式为标识符屏蔽位模式 
     CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;;//给出了过滤器位宽1个32位过滤器  
     CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个) 
     CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;;//用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个) 
     CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个) 
     CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个) 
     CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;;//设定了指向过滤器的FIFO0  
     CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器 
     CAN_FilterInit(&CAN_FilterInitStructure); 
  
}
void  CAN1_Com_init(void) 
{ 
      GPIO_InitTypeDef GPIO_InitStruct; 
      NVIC_InitTypeDef NVIC_InitStructure; 
       
   /* Enable CAN RX0 interrupt IRQ channel */ 
      NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; 
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
      NVIC_Init(&NVIC_InitStructure);
               
      NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn; 
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
      NVIC_Init(&NVIC_InitStructure);   
            
      NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn; 
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
      NVIC_Init(&NVIC_InitStructure);         
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 
      
      //Can Rx 
      GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_11; 
      GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
      GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_IPU; 
      GPIO_Init(GPIOA,&GPIO_InitStruct); 
      
      //Can Tx 
      GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_12; 
      GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
      GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_AF_PP; 
      GPIO_Init(GPIOA,&GPIO_InitStruct); 
      CAN1_Config_init();      
         
      CAN_ITConfig(CAN1,CAN_IT_FMP0 | CAN_IT_FF0 | CAN_IT_FOV0, ENABLE);  // fifo0中断 
      CAN_ITConfig(CAN1,CAN_IT_FMP1 | CAN_IT_FF1 | CAN_IT_FOV1, ENABLE);  // fifo1中断 
      CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);                // 发送中断 
      CAN_ITConfig(CAN1,CAN_IT_EWG | CAN_IT_EPV | CAN_IT_BOF | CAN_IT_LEC | CAN_IT_ERR | CAN_IT_WKU | CAN_IT_SLK, ENABLE);  // ERR中断   
      // CAN缓存初始化 
	  memset(CAN_msg_num,0,MAX_MAIL_NUM);    
} 
int CAN1_Tx_msg(CanTxMsg TxMessage) 
{ 
    u8 TransmitMailbox = 0;    
    TransmitMailbox = CAN_Transmit(CAN1,&TxMessage); 
    if(CAN_NO_MB == TransmitMailbox) 
    {        
        return 0;  //发送失败 
    } 
    else 
    {          
        CAN_msg_num[TransmitMailbox] = 1;         
    } 
    CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);      
    return 1; 
} 
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值