智能车制作

 找回密码
 注册

扫一扫,访问微社区

STM32论坛
查看: 2183|回复: 0
打印 上一主题 下一主题

stm32f4 can接收数据问题

[复制链接]

1

主题

30

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1014
威望
500
贡献
342
兑换币
317
注册时间
2013-9-6
在线时间
86 小时
毕业学校
江苏理工学院
跳转到指定楼层
1#
发表于 2016-1-20 14:31:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. int main(void)
  2. {
  3.         u8 buf[100];
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏ輶·Ö×é2
  5.         CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_6tq, CAN_BS1_7tq, 6, CAN_Mode_Normal);//CAN3õê¼»ˉÕy3£Ä£ê½,2¨ìØÂê500Kbps   
  6.         uart1_init(115200);            //′®¿ú3õê¼»ˉ2¨ìØÂêÎa115200
  7.         delay_init();                      //Ñóê±3õê¼»ˉ
  8.        
  9. //        FSMC_SRAM_Init();
  10. //        Memory_Init(EXSRAM); //3õê¼»ˉÄú2¿Äú′æ3Ø       
  11.        
  12.         uart1SendChars("yyy",3);
  13.        
  14.         while(1)
  15.         {
  16.                 u8 buf[100];
  17.                 memset(buf, 0, 100);
  18.                 CAN1_Receive_Msg(buf);
  19.         }


  20.        
  21. }
复制代码
  1. //CAN3õê¼»ˉ
  2. //tsjw:ÖØDÂí¬2½ìøԾ걼äμ¥Ôa. @ref CAN_synchronisation_jump_width   ·¶Î§:   CAN_SJW_1tq~ CAN_SJW_4tq
  3. //tbs2:ê±¼ä¶Î2μÄê±¼äμ¥Ôa.   @ref CAN_time_quantum_in_bit_segment_2 ·¶Î§:   CAN_BS2_1tq~CAN_BS2_8tq
  4. //tbs1:ê±¼ä¶Î1μÄê±¼äμ¥Ôa.   @refCAN_time_quantum_in_bit_segment_1  ·¶Î§:          CAN_BS1_1tq ~CAN_BS1_16tq
  5. //brp :2¨ìØÂê·ÖÆμÆ÷.·¶Î§:1~1024;(êμ¼êòa¼ó1,ò2¾íêÇ1~1024) tq=(brp)*tpclk1
  6. //2¨ìØÂê=Fpclk1/((tsjw+tbs1+tbs2+3)*brp);
  7. //mode: @ref CAN_operating_mode ·¶Î§£oCAN_Mode_Normal,ÆÕí¨Ä£ê½;CAN_Mode_LoopBack,»Ø»·Ä£ê½;
  8. //Fpclk1μÄê±ÖóÔú3õê¼»ˉμÄê±oòéèÖÃÎa36M,èç1ûéèÖÃCAN_Normal_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);
  9. //Ôò2¨ìØÂêÎa:42M/((1+6+7)*6)=500Kbps
  10. //·μ»ØÖμ:0,3õê¼»ˉOK;
  11. //    ÆäËû,3õê¼»ˉ꧰ü;
  12. u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
  13. {

  14.           GPIO_InitTypeDef       GPIO_InitStructure;
  15.           CAN_InitTypeDef        CAN_InitStructure;
  16.           CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  17.        
  18.                 #if CAN1_RX0_INT_ENABLE
  19.                                 NVIC_InitTypeDef       NVIC_InitStructure;
  20.                 #endif
  21.        
  22.     //ê1ÄüÏà1Øê±Öó
  23.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó                                                                                                                    

  24.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó       
  25.        
  26.     //3õê¼»ˉGPIO
  27.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
  28.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü
  29.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö
  30.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  31.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//éÏà-
  32.     GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉPA11,PA12
  33.        
  34.           //òy½Å¸′óÃó3éäÅäÖÃ
  35.           GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11¸′óÃÎaCAN1
  36.           GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12¸′óÃÎaCAN1
  37.           
  38.           //CANμ¥ÔaéèÖÃ
  39.            CAN_InitStructure.CAN_TTCM=DISABLE;        //·Çê±¼ä′¥·¢í¨DÅģ꽠  
  40.           CAN_InitStructure.CAN_ABOM=DISABLE;        //èí¼t×Ô¶ˉàëÏß1üàí          
  41.           CAN_InitStructure.CAN_AWUM=DISABLE;//ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)
  42.           CAN_InitStructure.CAN_NART=ENABLE;        //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí
  43.           CAN_InitStructure.CAN_RFLM=DISABLE;        //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ  
  44.           CAN_InitStructure.CAN_TXFP=DISABLE;        //óÅÏ輶ó鱨Îıê궷û¾ö¶¨
  45.           CAN_InitStructure.CAN_Mode= mode;         //Ä£ê½éèÖÃ
  46.           CAN_InitStructure.CAN_SJW=tsjw;        //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1tq~CAN_SJW_4tq
  47.           CAN_InitStructure.CAN_BS1=tbs1; //Tbs1·¶Î§CAN_BS1_1tq ~CAN_BS1_16tq
  48.           CAN_InitStructure.CAN_BS2=tbs2;//Tbs2·¶Î§CAN_BS2_1tq ~        CAN_BS2_8tq
  49.           CAN_InitStructure.CAN_Prescaler=brp;  //·ÖÆμÏμêy(Fdiv)Îabrp+1       
  50.           CAN_Init(CAN1, &CAN_InitStructure);   // 3õê¼»ˉCAN1
  51.                 //ÅäÖÃ1yÂËÆ÷
  52.           CAN_FilterInitStructure.CAN_FilterNumber=0;          //1yÂËÆ÷0
  53.           CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  54.           CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ
  55.           CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32λID
  56.           CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  57.           CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λMASK
  58.           CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  59.            CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1yÂËÆ÷01Øáaμ½FIFO0
  60.           CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î1yÂËÆ÷0
  61.           CAN_FilterInit(&CAN_FilterInitStructure);//ÂË2¨Æ÷3õê¼»ˉ
  62.                
  63. #if CAN1_RX0_INT_ENABLE
  64.        
  65.           CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.                    
  66.   
  67.           NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  68.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // Ö÷óÅÏ輶Îa1
  69.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // ′ÎóÅÏ輶Îa0
  70.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  71.           NVIC_Init(&NVIC_InitStructure);
  72. #endif
  73.         return 0;
  74. }
复制代码
  1. //can¿ú½óêÕêy¾Y2éÑˉ
  2. //buf:êy¾Y»o′æÇø;         
  3. //·μ»ØÖμ:0,ÎTêy¾Y±»êÕμ½;
  4. //                 ÆäËû,½óêÕμÄêy¾Y3¤¶è;
  5. u8 CAN1_Receive_Msg(u8 *buf)
  6. {                  
  7.         /*
  8.                 CanRxMsg RxMessage;
  9.                 if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //ûóD½óêÕμ½êy¾Y,Ö±½óíË3ö
  10.                
  11.                 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//¶áè¡êy¾Y       
  12.                 dataFuc(RxMessage);*/

  13.         u8 data[100];
  14.         u32 i,j;
  15.         CanRxMsg rx;
  16.         CanRxMsg RxMessage;
  17. //        CanRxMsg *msgs;
  18.         canmsgs_t msgs;
  19. //        msgs=(CanRxMsg*)Mem_malloc(EXSRAM,sizeof(CanRxMsg)*43);
  20. //         if (msgs == NULL)
  21. //   {
  22. //                        uart1SendChars("malloc error!",strlen("malloc error!"));
  23. //                 return 1;/* ?????????,????????? */
  24. //         }
  25.         memset(data, 0, 100);
  26.         for(i = 0;i<21;)
  27.         {
  28.                                        
  29.                         if( CAN_MessagePending(CAN1,CAN_FIFO0) == 3)
  30.                         {
  31.                        
  32.                                 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//¶áè¡êy¾Y
  33.                                
  34.                                 sprintf(data, "CAN_RF0R_FOVR0 = %d\r\n", (CAN1->RF0R &= CAN_RF0R_FOVR0)>>4);
  35.                                 uart1SendChars(data,strlen(data));
  36.                                
  37.                                 sprintf(data, "CAN_RF0R_FULL0=%d\r\n", (CAN1->RF0R &= CAN_RF0R_FULL0)>>3);
  38.                                 uart1SendChars(data,strlen(data));
  39.                                
  40.                                 sprintf(data, "CAN_RF0R_RFOM0 =%d\r\n", (CAN1->RF0R &= CAN_RF0R_RFOM0)>>5);
  41.                                 uart1SendChars(data,strlen(data));       
  42.                                
  43. //                        msgs[i] = RxMessage;                       
  44.                                 msgs.mmsg[i++] = RxMessage;
  45.                         }
  46.                        
  47. //                        delay_us(500);
  48.         }

  49. //        for(j=0;j<21;j++)
  50. //        {
  51. //                rx = msgs.mmsg[j];
  52. ////                rx = msgs[j];
  53. //                sprintf(data, "%02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", j,rx.Data[0],rx.Data[1],rx.Data[2],rx.Data[3],rx.Data[4],rx.Data[5],rx.Data[6],rx.Data[7]);
  54. //                uart1SendChars(data,strlen(data));
  55. //        }
  56.        
  57. //        Mem_free(EXSRAM,msgs);
  58. //        for(i=0;i<RxMessage.DLC;i++)
  59. //        buf[i]=RxMessage.Data[i];  
  60. //        sprintf(data, "%02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n",CAN_MessagePending(CAN1, CAN_FIFO0), buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);

  61. //        uart1SendChars(data,strlen(data));
  62.         return 0;
复制代码
上面三段代码是 主函数,can初始化,和can接收数据的程序,问题是:
传感器是以83帧数据为周期发送连续的can数据帧,我是连续读取21帧数据到can数据帧结构体数组中,通过串口发送到上位机,查看id是否一致。发现数据帧并不是传感器发送出来的,而是一些固定的未知数据帧。对于can的接收是FIFO0的三个接收邮箱,我怎么分别读取这三个邮箱的数据呢?我把接收到的的邮箱数打印出来观察一直都是现实三帧,也就是硬件每次读到了三帧数据到邮箱。传感器是每60ms发送83帧数据。
我弄了几天了,也没找到原因,望指点小弟一二?谢谢
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-7 21:12 , Processed in 0.074320 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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