OpenEdv-开源电子网

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

关于CAN的通信问题。。。

[复制链接]

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2013-12-20 19:55:19 | 显示全部楼层 |阅读模式
我的CAN通信程序用的是查询方式的,但是经过分析后这个发送程序可以正常,但是接收程序感觉数据丢在了过滤器里,不知道程序一直死在那个while(1)里。。。不知道哪位朋友可以解答下!!!
unsigned char CAN_MessageReceive(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanRxMsg RxMessage;
  /* 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; //禁止非自动重传模式   ENABLE
  CAN_InitStructure.CAN_RFLM=DISABLE; //禁止接收FIFO锁定模式    
  CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级   ENABLE    
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=5;
  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; //标识符需要比较(发送标识符为0x11,标准数据帧)
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
  CAN_FilterInit(&CAN_FilterInitStructure);
while(CAN_MessagePending(CAN1, CAN_FIFO0)==0);
  RxMessage.StdId=0x00;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);                     
  if (RxMessage.StdId!=0x11)
  {
    return 0;  
  }
  if (RxMessage.IDE!=CAN_ID_STD)
  {
    return 0;
  }
  if (RxMessage.DLC!=2)
  {
    return 0;  
  }
  if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
  {
    return 0;
  }             
  return 1; /* Test Passed */
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

336

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2013-12-11
在线时间
0 小时
发表于 2013-12-20 19:55:52 | 显示全部楼层
顶,顶,顶。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2013-12-20 21:06:39 | 显示全部楼层
我再顶!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-20 23:01:58 | 显示全部楼层
回复【楼主位】正点电子:
---------------------------------
你这代码结构就很有问题啊.
为什么要把CAN初始化的东西放到接收函数里面来?

典型的拉屎了才去挖茅坑.

先初始化can,再去执行接收.接收部分不要再去初始化can了!!
让你参考我们例程了,估计你可能没去看了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
 楼主| 发表于 2013-12-21 14:56:47 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------

                                    发送函数
void CAN_Configuration(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
                  /* 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; //禁止接收FIFO锁定模式
  CAN_InitStructure.CAN_TXFP=ENABLE; //禁止发送FIFO优先级
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; //已经折算好了
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
  CAN_InitStructure.CAN_Prescaler=24;
  CAN_Init(CAN1,&CAN_InitStructure);
}
unsigned char CAN_MessageSend(void)
{
  CanTxMsg TxMessage;
  u32 i = 0;
  u8 TransmitMailbox = 0;
  /* transmit */
  TxMessage.StdId=0xa3;                   /* 设置标准id  注意标准id的最高7位不能全是隐性(1)。共11位 0xa3*/
        TxMessage.ExtId=0x00;        
  TxMessage.RTR=CAN_RTR_DATA;//数据帧
  TxMessage.IDE=CAN_ID_STD;//标准帧格式
  TxMessage.DLC=2; //帧长度,单位:字节
  TxMessage.Data[0]=0xCA;//待传数据
  TxMessage.Data[1]=0xFE;                      
  /*数据发送*/
  TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1,TransmitMailbox) == CANTXFAILED) && (i != 0xFF)) //等待CAN总线传输数据成功
  {
    i++;
  }
  if(i==0xff)//发送超时,但发送不成功
  {
    return 0;
  }
  return 1; /* Test assed */
}                                  

/******************************接收函数**********************/
void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
}
unsigned char CAN_Configuration(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  /* 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; //禁止非自动重传模式   ENABLE
  CAN_InitStructure.CAN_RFLM=DISABLE; //禁止接收FIFO锁定模式    
  CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级   ENABLE    
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
  CAN_InitStructure.CAN_Prescaler=24;
  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; //((0x11<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//((0x11<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xFFFF;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;; //0x0000; //标识符需要比较(发送标识符为0x11,标准数据帧)
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;; //0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
  CAN_FilterInit(&CAN_FilterInitStructure);
        return 1; 
}
unsigned char CAN_MessageReceive(void)
{
        CanRxMsg RxMessage;         
        if(CAN_MessagePending(CAN1, CAN_FIFO0)==0)
                return 0; 
  RxMessage.StdId=0x00;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);                     
  if ((RxMessage.StdId!=0xa3) && (RxMessage.IDE!=CAN_ID_STD) && (RxMessage.DLC!=2))
  {
    return 0;  
  }
  if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
  {
    return 0;                  
  }                   
  return 1; /* Test assed */         
}


实在是找不出问题!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 19:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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