打印

高分求解:CAN总线接收数据到触发中断的时间?

[复制链接]
4720|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongjiajia|  楼主 | 2012-7-16 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做CAN实验,用的STM32107。
发现实验现象:如果每1ms发送一帧数据,CAN总线上会检测到1ms周期的脉冲,但是接收中断处确是大约每隔3.6ms才检测到一个脉冲。这是什么原因造成的呢?难道CAN收发器收到数据到STM32微控制器发出中断信号要大约2ms的时间吗,这也太慢了吧!
沙发
dongjiajia|  楼主 | 2012-7-16 09:57 | 只看该作者
有什么方法可以解决上面的问题:能让收发器收到数据后,触发中断???

使用特权

评论回复
板凳
airwill| | 2012-7-16 11:49 | 只看该作者
收发器收到数据后,触发中断是肯定的. 硬件自动会完成的, 而且是接收完整数据包后立即触发.
你的系统的问题跟接收的设置和软件有关.
由于CAN 的接收 FIFO 是三级深度.
有几种类型的接收中断:
当 FIFO 接收到一个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为’1’,那么就会产生一个中断请求。
当FIFO变满时(即第3个报文被存入),CAN_RFR寄存器的FULL位就被置’1’,并且如果CAN_IER寄存器的FFIE位为’1’,那么就会产生一个满中断请求。
在溢出的情况下,FOVR位被置’1’,并且如果CAN_IER寄存器的FOVIE位为’1’,那么就会产生
一个溢出中断请求。
另外还有报文过滤的因素, 就看你的接收及中断怎么设置了

使用特权

评论回复
地板
dongjiajia|  楼主 | 2012-7-16 14:55 | 只看该作者
我设置的是接收到一个报文后立即中断,滤波器设置是接收全部的数据!!!这应该不会影响接收中断的速率呀

使用特权

评论回复
5
figo20042005| | 2012-7-16 14:55 | 只看该作者
LS说的很精辟,你可以通过这些找下原因吧

使用特权

评论回复
6
dongjiajia|  楼主 | 2012-7-16 15:08 | 只看该作者
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //CAN中断设置
void CAN1_Config(void)
{
  /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  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_LoopBack;  //CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler = 4;//2
  CAN_Init(CAN1, &CAN_InitStructure);

/* CAN filter init */
  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=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//接受全部的数据
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//如果接受到数据就将数据放到FIFO0中
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
  

}

使用特权

评论回复
7
dongjiajia|  楼主 | 2012-7-16 15:15 | 只看该作者
void CAN1_RX0_IRQHandler(void)
{
      Timer3=TIM_GetCounter(TIM3);
      CAN_Receive(CAN1, CAN_FIFO0, &RxMessage1);
      STM_EVAL_LEDOn(LED3);
  if(GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_3)) // 查看PE3引脚的波形
    GPIO_ResetBits(GPIOE, GPIO_Pin_3);
  else
    GPIO_SetBits(GPIOE, GPIO_Pin_3);
}

使用特权

评论回复
8
dongjiajia|  楼主 | 2012-7-16 15:17 | 只看该作者
请大侠指点啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

66

帖子

0

粉丝