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

[复制链接]
5697|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 | 显示全部楼层
我设置的是接收到一个报文后立即中断,滤波器设置是接收全部的数据!!!这应该不会影响接收中断的速率呀
figo20042005 发表于 2012-7-16 14:55 | 显示全部楼层
LS说的很精辟,你可以通过这些找下原因吧
 楼主| 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);
  

}
 楼主| 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);
}
 楼主| dongjiajia 发表于 2012-7-16 15:17 | 显示全部楼层
请大侠指点啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

66

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部