OpenEdv-开源电子网

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

接收不同时间间隔的CAN数据,怎么办?

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2021-4-20
在线时间
0 小时
发表于 2016-12-26 00:16:06 | 显示全部楼层 |阅读模式
1金钱
CAN总线上有10ms,100ms,500ms,1000ms更新一次的不同ID的数据帧,发现一般方法去处理,1000ms的数据会丢失,有些数据会捕获,但是数据更新的速度也是超级慢,大约1分钟才会更新一次,这个怎么处理?请教各位大神帮忙
void CAN1_Mode_Init(void)
{

      GPIO_InitTypeDef GPIO_InitStructure;
      CAN_InitTypeDef        CAN_InitStructure;
      CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE
       NVIC_InitTypeDef  NVIC_InitStructure;
#endif

      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);                                                         

      RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

      GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);
      
      //CANµ¥ÔªÉèÖÃ
       CAN_InitStructure.CAN_TTCM=DISABLE;  
      CAN_InitStructure.CAN_ABOM=DISABLE;      
      CAN_InitStructure.CAN_AWUM=DISABLE;
      CAN_InitStructure.CAN_NART=ENABLE;   
      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_7tq;
      CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;
      CAN_InitStructure.CAN_Prescaler=6;
      CAN_Init(CAN1, &CAN_InitStructure);   
   
       CAN_FilterInitStructure.CAN_FilterNumber=0;      //
      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //
      CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//
      CAN_FilterInitStructure.CAN_FilterIdLow=0x0500;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//
      CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
       CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//
      CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //
      CAN_FilterInit(&CAN_FilterInitStructure);//
        
#if CAN1_RX0_INT_ENABLE
   
      CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
  
      NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
#endif
   
}   

            
void CAN1_RX0_IRQHandler(void)
{
      CanRxMsg RxMessage;
    int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
    for(i=0;i<8;i++)
    printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
}


#endif

u8 CAN1_Send_Msg(u8* msg,u8 len)
{   
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x00;     // ±ê×&#188;±ê&#202;&#182;·&#251;&#206;&#170;0
  TxMessage.ExtId=0x00;     // &#201;è&#214;&#195;&#192;&#169;&#213;&#185;±ê&#202;&#190;·&#251;&#163;¨29&#206;&#187;&#163;&#169;
  TxMessage.IDE=0;          // &#202;&#185;&#211;&#195;&#192;&#169;&#213;&#185;±ê&#202;&#182;·&#251;
  TxMessage.RTR=0;          // &#207;&#251;&#207;&#162;&#192;à&#208;&#205;&#206;&#170;&#202;&#253;&#190;&#221;&#214;&#161;&#163;&#172;&#210;&#187;&#214;&#161;8&#206;&#187;
  TxMessage.DLC=len;                             // ·&#162;&#203;&#205;&#193;&#189;&#214;&#161;&#208;&#197;&#207;&#162;
  for(i=0;i<len;i++)
  TxMessage.Data[i]=msg[i];                 // &#181;&#218;&#210;&#187;&#214;&#161;&#208;&#197;&#207;&#162;         
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;    //&#181;&#200;&#180;&#253;·&#162;&#203;&#205;&#189;á&#202;&#248;
  if(i>=0XFFF)return 1;
  return 0;        

}


u8 CAN1_Receive_Msg(void)
{                     
     u32 i;
    CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;        
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//   
       for(i=0;i<RxMessage.DLC;i++)
         {
               buf[i]=RxMessage.Data[i];
           }   
    return RxMessage.DLC;   
        
}

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

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-1-14
在线时间
5 小时
发表于 2017-1-14 08:39:36 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 13:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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