打印
[ARM7]

请教坛里的大神们一些CAN通信现象?

[复制链接]
1838|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aoty|  楼主 | 2014-1-17 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手柄板是F1的,主控板是F4的,然后我按下一个手柄的按键后,主控应该是接收到一个数据,但是它却接受到了多个数据(这几个数据相同而且应该是正确的)并且在接收这几个数据后,恢复按键不按的时候返回的数据(我自己写的success)。。。。
个人分析,CAN的配置是没有问题的!我觉得发送的问题比较大!
下面我把我的程序贴出来,希望大家给看看~~~
*****************手柄处理*************
                  static int E=0x7f,F=0x7f,G=0x01,H=0x01;
                int q=0x01;
                int p=0x80;//首位设为1
                A = DBUF[0];         //3 4
                B = DBUF[1];
                C = DBUF[5]&0xf1;                                                                                                                                  
                D = DBUF[6]|0x01;                 
                  if((A!=E)||(B!=F)||(C!=G)||(D!=H))   
                {       
                        delay_ms(500);
                        if((A!=E)||(B!=F)||(C!=G)||(D!=H))
                        {       
                                if((A==0x7f)&&(B==0x7f)&&(C==0x01)&&(D==0x01))   //默认  1001     
                                {
                                        data[0]=((p&0xffff)<<8)+(q&0xffff);       
                                        printf("%x\r\n",data[0]);
                                }
                                if(((A!=0x7f)||(B!=0x7f))&&((C==0x01)&&(D==0x01)))//方向键
                                {
                                        data[1]=(((A&0xffff)<<8)+(B&0xffff))|0x1001;       
                                        printf("%x\r\n",data[1]);
                                }
                                if(( C!=0x01)&&(D==0x01))   //1 2 3 4                  
                                {
                                        data[2]=((p&0xffff)<<8)+(C&0xffff);
                                        printf("%x\r\n",data[2]);
                                }
                                if(( D!=0x01))        //组合键
                                {  
                                   if((D==0x21)||(D==0x11))            //组合键1
                                   {                                                                                                                                                                                                                                                                                                                                                 
                                             if((A!=0x7f)||(B!=0x7f))        // 方向键                                                          
                                          {
                                                   data[3]=(((A&0xffff)<<8)+(((B&0x01)+D)&0xffff))|0x1001;
                                                 printf("%x\r\n",data[3]);
                                          }   
                                             if(C!=0x01)                            //组合键 +1 2 3 4                                                         
                                          {
                                                   data[4]=((p&0xffff)<<8)+((C+D)&0xffff);
                                                 printf("%x\r\n",data[4]);       
                                          }               
                                          if((D==0x02)||(D==0x03)||(D==0x05)||(D==0x09)) //功能键+ L 1 2    R 1 2
                                          {
                                                   data[5]=((p&0xffff)<<8)+(D&0xffff);
                                                 printf("%x\r\n",data[5]);
                                          }
                                   }                                                                                                                                                                                                                                                                                                                                                                                               
                                   else                                
                                   {
                                             data[6]=((p&0xffff)<<8)+(D&0xffff);         //L 1 2    R 1 2
                                          printf("%x\r\n",data[6]);         
                                   }
                                }
                        }
                }
                E = A;
                F = B;   
                G = C;
                H = D;

            TestTx = CAN_MessageSend();         
            if (TestTx == 1)   
            {
                        printf("success\r\n");
                    for(j=0;j<7;j++) //用于数组清零
                                data[j] = 0x00;
            }   

**************CAN的发送函数*************
unsigned int CAN_MessageSend(void)
{
  CAN_InitTypeDef  CAN_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  CanTxMsg TxMessage;
  u32 i = 0;
  u32 j = 0;

  u8 TransmitMailbox = 0;

   /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//只能工作在此速度下
  GPIO_Init(GPIOA, &GPIO_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=DISABLE; //禁止发送FIFO优先级
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //已经折算好了         1M
  CAN_InitStructure.CAN_BS2=CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler=4;
  CAN_Init(CAN1,&CAN_InitStructure);

  /* transmit */
  TxMessage.StdId = 0xa3;             //         0x321
  TxMessage.ExtId = 0x00;               //  0x01                               
  TxMessage.RTR=CAN_RTR_DATA;//数据帧
  TxMessage.IDE=CAN_ID_STD;//标准帧格式
  TxMessage.DLC=7; //帧长度,单位:字节

  for(i=0;i<7;i++)
        TxMessage.Data[i]= data[i];
               
  /*数据发送*/
  TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (i != 0xFF)) //等待CAN总线传输数据成功
  {
    i++;
  }
  if(i==0xFF)//发送超时,但发送不成功
  {
    return 0;
  }
  for(j=0;j<7;j++)//数组清零
        data[j] = 0x00;
  return 1; /* Test Passed */                  
}

相关帖子

沙发
阿南| | 2014-1-17 16:20 | 只看该作者
多收了数据,是否是当作你多次按下。可以加个延时来降低灵敏度

使用特权

评论回复
板凳
aoty|  楼主 | 2014-1-17 16:25 | 只看该作者
阿南 发表于 2014-1-17 16:20
多收了数据,是否是当作你多次按下。可以加个延时来降低灵敏度

你指的情况应该是消抖的问题吧~
我用的是好手柄!这个我可以保证,不会出现按键抖动的情况~

使用特权

评论回复
地板
guangbiao| | 2014-1-17 16:54 | 只看该作者
查一下是否是由CAN的重发机制引起的。
在CAN的数据帧中有个位,是要目标地址的设备响应的。
你看看标准CAN协议,里面说得很明白的。。。

使用特权

评论回复
5
aoty|  楼主 | 2014-1-17 17:01 | 只看该作者
guangbiao 发表于 2014-1-17 16:54
查一下是否是由CAN的重发机制引起的。
在CAN的数据帧中有个位,是要目标地址的设备响应的。
你看看标准CAN ...

或许吧~但是我以前调试成功过。。。但是换作手柄发送就不行。。。
你指的的是这个么》?
  CAN_InitStructure.CAN_TTCM=DISABLE; //禁止时间触发通讯模式   MCR
  CAN_InitStructure.CAN_ABOM=DISABLE; //禁止自动离线模式
  CAN_InitStructure.CAN_AWUM=DISABLE; //禁止自动唤醒模式
  CAN_InitStructure.CAN_NART=DISABLE; //禁止非自动重传模式   ENABLE          //CAN_InitStructure.CAN_NART=ENABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE; //禁止接收FIFO锁定模式   
  CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级   ENABLE   发送FIFO优先级 0-优先级取决于报文标示符 1-优先级取决于发送请求的顺序  
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //BTR-SILM/LBKM   CAN正常模式

使用特权

评论回复
6
guangbiao| | 2014-1-17 17:23 | 只看该作者
CAN_InitStructure.CAN_NART=DISABLE; //禁止非自动重传模式   ENABLE          //CAN_InitStructure.CAN_NART=ENABLE;
禁止非自动重传模式-->是使能自动重传,还是关闭自动重传呢?
你那边有CAN分析仪没有,要是有就直接连上看结果。。。
要是没有,找找看有没有带有CAN分析功能的示波器。。。
都没有就有点苦逼了。。。

使用特权

评论回复
7
aoty|  楼主 | 2014-1-17 19:19 | 只看该作者
guangbiao 发表于 2014-1-17 17:23
CAN_InitStructure.CAN_NART=DISABLE; //禁止非自动重传模式   ENABLE          //CAN_InitStructure.CAN_ ...

禁止自动重传模式 (CAN_NART)我标错了。。。。sorry
如果要是enable 的话那就是自动重传了~(双重否定=肯定)
很多人都说让我用这个CAN分析仪试试,不知道这是一个软件还是一个工具呢?
示波器我有~但是我不太会用~我百度百度~或是你告我一下~

使用特权

评论回复
8
guangbiao| | 2014-1-18 10:04 | 只看该作者
CAN分析仪是个设备,在其配套的PC机软件上显示相关数据及操作。
示波器带CAN分析的不少,但没有CAN分析仪那么专业,像安捷伦的示波器,稍微好一点的都带有这样的功能。
这些资讯你百度一下,会了解得更多。。。

使用特权

评论回复
9
aoty|  楼主 | 2014-1-18 10:19 | 只看该作者
guangbiao 发表于 2014-1-18 10:04
CAN分析仪是个设备,在其配套的PC机软件上显示相关数据及操作。
示波器带CAN分析的不少,但没有CAN分析仪那 ...

哦~好吧~我换是一个学生。。。。呵呵~对不起,有点穷。。。我找找吧~学习下~

使用特权

评论回复
10
阿南| | 2014-1-18 14:21 | 只看该作者
不仅仅是捎斗问题,是指软件处理问题

使用特权

评论回复
11
aoty|  楼主 | 2014-1-18 15:16 | 只看该作者
阿南 发表于 2014-1-18 14:21
不仅仅是捎斗问题,是指软件处理问题

可以稍微具体点么?实在是很着急~

使用特权

评论回复
12
feilusia| | 2014-1-18 17:28 | 只看该作者
你仿真一下就清楚了。
将断点设在CAN发送数据那里,然后点单步发送看接收方的CAN接收到的数据对不对,对的话就是你按键模块问题。
估计是按键没消抖吧。

使用特权

评论回复
13
aoty|  楼主 | 2014-1-18 19:24 | 只看该作者
feilusia 发表于 2014-1-18 17:28
你仿真一下就清楚了。
将断点设在CAN发送数据那里,然后点单步发送看接收方的CAN接收到的数据对不对,对的 ...

呵呵~谢谢~不过我觉得按键抖动的可能性不大。。。按键抖动一般只是那些手柄不是很好的手柄。。。我的手柄质量杠杠的。。。呵呵~
我试试你说的吧~呵呵~
谢谢~膜拜下~

使用特权

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

本版积分规则

个人签名:很高兴注册21IC

31

主题

207

帖子

1

粉丝