打印
[STM32F1]

【求助】can通讯丢帧,关于位同步调试方法求救

[复制链接]
982|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
matianwen123ac|  楼主 | 2016-9-4 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬,小弟目前在用stm32f103ze的芯片做can通讯,用周立功的USB—Can——e-u做接收端,500k波特率。但是我现在通过while循环,连续发ID为0x1314,0x1311的帧,帧间间隔为10ms(systick产生)。发现收到的can信号出现丢帧(通过时间标识鉴定),有时连着几个0x1314, 有时又相反;还有就是即使接收的信号按0x1314,0x1311顺序排列,但时间间隔不对(只有几十微秒)。我的can发送代码如下:
can单元初始化(关于波特率设置)
        /*CANµ¥Ôª³õʼ»¯*/
        CAN_InitStructure.CAN_TTCM=DISABLE;                           //MCR-TTCM  ¹Ø±Õʱ¼ä´¥·¢Í¨ÐÅģʽʹÄÜ
    CAN_InitStructure.CAN_ABOM=ENABLE;                           //MCR-ABOM  ×Ô¶¯ÀëÏß¹ÜÀí
    CAN_InitStructure.CAN_AWUM=ENABLE;                           //MCR-AWUM  Ê¹ÓÃ×Ô¶¯»½ÐÑģʽ
    CAN_InitStructure.CAN_NART=DISABLE;                           //MCR-NART  ½ûÖ¹±¨ÎÄ×Ô¶¯ÖØ´«          DISABLE-×Ô¶¯ÖØ´«
    CAN_InitStructure.CAN_RFLM=DISABLE;                           //MCR-RFLM  ½ÓÊÕFIFO Ëø¶¨Ä£Ê½  DISABLE-Òç³öʱб¨ÎĻḲ¸ÇÔ­Óб¨ÎÄ  
    CAN_InitStructure.CAN_TXFP=DISABLE;                           //MCR-TXFP  ·¢ËÍFIFOÓÅÏȼ¶ DISABLE-ÓÅÏȼ¶È¡¾öÓÚ±¨Îıêʾ·û
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  //Õý³£¹¤×÷ģʽ
    CAN_InitStructure.CAN_SJW=CAN_SJW_2tq;                   //BTR-SJW ÖØÐÂͬ²½ÌøÔ¾¿í¶È 2¸öʱ¼äµ¥Ôª
    CAN_InitStructure.CAN_BS1=CAN_BS1_11tq;                   //BTR-TS1 ʱ¼ä¶Î1 Õ¼ÓÃÁË5¸öʱ¼äµ¥Ôª
    CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;                   //BTR-TS1 ʱ¼ä¶Î2 Õ¼ÓÃÁË3¸öʱ¼äµ¥Ôª
    CAN_InitStructure.CAN_Prescaler =8;                   ////BTR-BRP ²¨ÌØÂÊ·ÖƵÆ÷  ¶¨ÒåÁËʱ¼äµ¥ÔªµÄʱ¼ä³¤¶È 36/(1+11+6)/4=0.5Mbps
        CAN_Init(CAN1, &CAN_InitStructure);
}

can发送函数
uint8_t CAN_SetMsg(uint32_t id,uint16_t data)
{          
        uint16_t i=0;
        uint8_t TxMailbox;
        // TxMessage.StdId=0x10;                                                 
  TxMessage.ExtId=id;                                         //ʹÓõÄÀ©Õ¹ID
  TxMessage.IDE=CAN_ID_EXT;                                         //À©Õ¹Ä£Ê½
  TxMessage.RTR=CAN_RTR_DATA;                                 //·¢Ë͵ÄÊÇÊý¾Ý
  TxMessage.DLC=2;                                                         //Êý¾Ý³¤¶ÈΪ1×Ö½Ú
  TxMessage.Data[0]=(data&0xff00)>>8; //È¡Êý¾Ý¸ß8λ·ÅÈëdata[0]
        TxMessage.Data[1]=(data&0xff);      //È¡Êý¾ÝµÍ8λ·ÅÈëdata[1]
        TxMailbox=CAN_Transmit(CAN1, &TxMessage);
  i=0;
        while((CAN_TransmitStatus(CAN1, TxMailbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //µÈ´ý·¢ËͽáÊø
        if(i>=0XFFF)return 1;
        delay_ms(10);
        return 0;       
       
       
}

main函数的连环发送
        while(1)
        {
                uint8_t state=0;
                /*ÉèÖÃҪͨ¹ýCAN·¢Ë͵ÄÐÅÏ¢*/
          state=CAN_SetMsg(0x1314,ADC_ConvertedValue);
                //LED1_ON;
                //delay_ms(10);
                state=CAN_SetMsg(0x1311,ADC_ConvertedValue);

}
求助各位,你们can通讯调试的时候碰到过这种问题吗?你们在这种发送多id的帧信号(程序一运行就开始以帧间隔为10ms发送)时是如何发送的啊?中断发送能解决这个问题吗?

沙发
xmshao| | 2016-9-5 08:13 | 只看该作者
可能是发生了传输出错而进行了多次重发,导致数据重发,进而间隔也可能不一样;

那个NART配置 是跟自动重发有关的;

你试试检查 TSR寄存器里的TXOK位来判断 再发送下一个MESSAGE,同时也可以配合下定时;

使用特权

评论回复
板凳
matianwen123ac|  楼主 | 2016-9-5 11:12 | 只看该作者
xmshao 发表于 2016-9-5 08:13
可能是发生了传输出错而进行了多次重发,导致数据重发,进而间隔也可能不一样;

那个NART配置 是跟自动重 ...

哦,这个我程序里面是禁止自动重发的,所以应该不是这个问题。还有一个可能是不是我硬线连接,一端我只是拿手扶着接触,接触不稳导致的。还有就是我将波特率设置为1sjw,5pbs1,3个pbs2。发现好一点,只在我导线连接和拔除的时候出现丢帧等现象。

使用特权

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

本版积分规则

19

主题

97

帖子

1

粉丝