OpenEdv-开源电子网

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

Stm32f103CAN通信,发送多帧数据出错

[复制链接]

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2017-10-31
在线时间
42 小时
发表于 2018-2-26 14:36:08 | 显示全部楼层 |阅读模式
5金钱
描述问题:当发送三帧数据的时候,利用串口调试助手发现结果正确,如图1;但是当发送四帧数据时候,第四帧与前三帧之间添加延时,串口调试助手如图2.
图片1(串口结果,三帧):                       图片2(串口结果,四帧):
三帧.jpg

图2:四帧

图2:四帧


代码如下:
CAN配置:

tatic void CAN_NVIC_Configuration(void){
        NVIC_InitTypeDef NVIC_InitStructure;
       
        /* Enable CAN1 RX0 interrupt IRQ channel */
        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // Ö÷óÅÏè¼¶Îa1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;            // ′ÎóÅÏè¼¶Îa3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

/*
* oˉêyÃû£oCAN_GPIO_Config
* Ãèêö  £oCAN GPIO oíê±ÖóÅäÖÃ
* êäèë  £oÎT
* êä3ö  : ÎT
* μ÷óà £oÄú2¿μ÷óÃ
*/
static void CAN_GPIO_Config(void){
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                                                                                                                         
       
        /* CAN1 Periph clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
       
        /* Configure CAN pin: RX */                                                                                       // PA11
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;              // GPIO_Mode_IN_FLOATING          IPU                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        // éÏà-êäèë
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Configure CAN pin: TX */                                                                                       // PA12
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         // ¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void USER_CAN_Config(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;           // ê±¼ä′¥·¢í¨DŽûÖ1
        CAN_InitStructure.CAN_ABOM=ENABLE;                  // àëÏßíË3öêÇÔúÖD¶ÏÖÃλÇå0oóíË3ö
        CAN_InitStructure.CAN_AWUM=ENABLE;                  // ×Ô¶ˉ»½DÑģ꽣oó2¼t»½DÑ
        CAN_InitStructure.CAN_NART=DISABLE;                  // ½ûÖ1ÖØDÂ′«Ëí
        CAN_InitStructure.CAN_RFLM=DISABLE;                  // FIFOûóDËø¶¨£¬D±¨Îĸ2¸Ç¾é±¨ÎÄ
        CAN_InitStructure.CAN_TXFP=DISABLE;           // ·¢Ëí±¨ÎÄóÅÏè¼¶è·¶¨£o±êÖ¾·û;(IDÄ£ê½ó鱨ÎÄμÄID¾ö¶¨£¬¼′IDÖμÔ½D¡£¬óÅÏè¼¶Ô½¸ß.)
        CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;   // Õy3£Ä£ê½  CAN_Mode_Normal
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;        // 1tq¡¢BS1¡¢BS2μÄÖμ¸ú2¨ìØÂêóD1Ø
        CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;        // ¿éòÔéèÖÃ16¸öê±¼äμ¥λ £¬êμ¼êD′èëμÄÖμÎa5.
        CAN_InitStructure.CAN_BS2=CAN_BS2_5tq;        // ¿éòÔéèÖÃ8¸öê±¼äμ¥λ£¬êμ¼êD′èëμÄÖμÎa1.
        CAN_InitStructure.CAN_Prescaler=16;                                          // ·ÖÆμÏμêyÎa16 36/((1+3+5)*16)=250KHz£¬·¶Î§1μ½1024,D′3éê2Ã′¾íêÇê2Ã′£¬Ôú·a×°oˉêyàïÃæòѾ-¼õ1.
        CAN_Init(CAN1, &CAN_InitStructure);                                                // 3õê¼»ˉCAN1
       
        /* CAN filter init */
        CAN_FilterInitStructure.CAN_FilterNumber=1;                       //Ñ¡Ôñ1yÂËÆ÷1£¬éèÖÃÆäËû1yÂËÆ÷μÄê±oò£¬DèòaÖØDÂÅäÖã¬2»Äüê1óûòóï¾äà′ÅäÖöà¸ö1yÂËÆ÷
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;     //Æá±Îλģ꽣¨CAN_FilterMode_IdList ±êê¶·ûáD±íģ꽣©
        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=CAN_FIFO0;        //½óêÕμ½μÄêy¾Y′æμ½FIFO0£¬μ½ê±oòÖ±½ó¶á
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);
       
        /* CAN FIFO0 message pending interrupt enable */
        CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //ÖD¶Ïê1Äü£¬óêÏä0μıê־λ
}


回环测试四帧数据代码:
void CAN_SdPl_One(uint16_t ID){
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
  uint8_t TransmitMailbox;
        uint8_t i,n;
       
        TxMessage.StdId=ID;                                     // ±ê×¼±êê¶·ûÎa0x0011,±íê¾μúò»×éμÄμúò»Ö¡êy¾Y£¬óÃμúò»¸öËÄλ±íê¾Ö¡êy£¬óÃμú¶t¸öËÄλ±íê¾×éêy¡£0000 0001 0001
        TxMessage.IDE=CAN_ID_STD;                         // ê1óñê×¼±êê¶·û
        TxMessage.RTR=CAN_RTR_DATA;                 // Ö¡ààDíÎaêy¾YÖ¡£¬ò»Ö¡8λ
        TxMessage.DLC=8;                                                         // ·¢Ëí8¸ö×Ö½úDÅÏ¢,êy¾Y3¤¶èÂ룬ָ¶¨′«êäÖ¡μÄ3¤¶è
//        for(i=0;i<8;i++){
//                TxMessage.Data=CAN_SendArray;
//        }
        TxMessage.Data[0]=0x11;
        TxMessage.Data[1]=0x12;
        TxMessage.Data[2]=0x13;
        TxMessage.Data[3]=0x14;
       
        TxMessage.Data[4]=0x15;
        TxMessage.Data[5]=0x16;
        TxMessage.Data[6]=0x17;
        TxMessage.Data[7]=0x18;
        TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);    //&#191;aê&#188;′&#171;ê&#228;ò&#187;&#184;&#246;&#207;&#251;&#207;¢£&#172; oˉêyóD&#184;&#246;·μ&#187;&#216;&#214;μ£&#172;·μ&#187;&#216;óê&#207;&#228;o&#197;0£&#172;1£&#172;2
        while((CAN_TransmitStatus(CAN1, TransmitMailbox)!= CANTXOK)&&(n!=0xFF)){   //í¨1y&#188;ì2éCANTXOKà′è·&#182;¨·¢&#203;íê&#199;·&#241;3é1|£&#172;CANTXPENDING£o&#207;&#251;&#207;¢ê&#199;·&#241;1òo&#197;£&#187;CANTXFAILED&#198;&#228;&#203;&#251;
                n++;  
        }
        n=0;
        while((CAN_MessagePending(CAN1,CAN_FIFO0)==0)&&(n!=0xFF)){
                n++;
        }
       
        RxMessage.StdId=0x00;       //éè&#182;¨±ê×&#188;±êê&#182;·&#251;
        RxMessage.IDE=CAN_ID_STD;   //ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        RxMessage.DLC=0;            //ó&#195;à′éè&#182;¨′y′&#171;ê&#228;μ&#196;&#214;&#161;3¤&#182;è
        for(i=0;i<8;i++){
                RxMessage.Data=0x00;
        }
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
       
        if(RxMessage.StdId == ID){
                for(i=0;i<RxMessage.DLC;i++){
                        printf(" %d",RxMessage.Data);
                }
                printf("  The first frame has sent and got!\n\n");
               
        }
       
       
}

void CAN_SdPl_Two(uint16_t ID){
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
  uint8_t TransmitMailbox;
        uint8_t i,n;
       
        TxMessage.StdId=ID;                                     // ±ê×&#188;±êê&#182;·&#251;&#206;a0x0011,±íê&#190;μúò&#187;×éμ&#196;μúò&#187;&#214;&#161;êy&#190;Y£&#172;ó&#195;μúò&#187;&#184;&#246;&#203;&#196;&#206;&#187;±íê&#190;&#214;&#161;êy£&#172;ó&#195;μú&#182;t&#184;&#246;&#203;&#196;&#206;&#187;±íê&#190;×éêy&#161;£0000 0001 0001
        TxMessage.IDE=CAN_ID_STD;                         // ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        TxMessage.RTR=CAN_RTR_DATA;                 // &#214;&#161;ààDí&#206;aêy&#190;Y&#214;&#161;£&#172;ò&#187;&#214;&#161;8&#206;&#187;
        TxMessage.DLC=8;                                                         // ·¢&#203;í8&#184;&#246;×&#214;&#189;úD&#197;&#207;¢,êy&#190;Y3¤&#182;è&#194;&#235;£&#172;&#214;&#184;&#182;¨′&#171;ê&#228;&#214;&#161;μ&#196;3¤&#182;è
//        for(i=0;i<8;i++){
//                TxMessage.Data=CAN_SendArray;
//        }
        TxMessage.Data[0]=0x21;
        TxMessage.Data[1]=0x22;
        TxMessage.Data[2]=0x23;
        TxMessage.Data[3]=0x24;
       
        TxMessage.Data[4]=0x25;
        TxMessage.Data[5]=0x26;
        TxMessage.Data[6]=0x27;
        TxMessage.Data[7]=0x28;
        TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);    //&#191;aê&#188;′&#171;ê&#228;ò&#187;&#184;&#246;&#207;&#251;&#207;¢£&#172; oˉêyóD&#184;&#246;·μ&#187;&#216;&#214;μ£&#172;·μ&#187;&#216;óê&#207;&#228;o&#197;0£&#172;1£&#172;2
        while((CAN_TransmitStatus(CAN1, TransmitMailbox)!= CANTXOK)&&(n!=0xFF)){   //í¨1y&#188;ì2éCANTXOKà′è·&#182;¨·¢&#203;íê&#199;·&#241;3é1|£&#172;CANTXPENDING£o&#207;&#251;&#207;¢ê&#199;·&#241;1òo&#197;£&#187;CANTXFAILED&#198;&#228;&#203;&#251;
                n++;  
        }
        n=0;
        while((CAN_MessagePending(CAN1,CAN_FIFO0)==0)&&(n!=0xFF)){
                n++;
        }
       
        RxMessage.StdId=0x00;       //éè&#182;¨±ê×&#188;±êê&#182;·&#251;
        RxMessage.IDE=CAN_ID_STD;   //ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        RxMessage.DLC=0;            //ó&#195;à′éè&#182;¨′y′&#171;ê&#228;μ&#196;&#214;&#161;3¤&#182;è
        for(i=0;i<8;i++){
                RxMessage.Data=0x00;
        }
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
       
        if(RxMessage.StdId == ID){
                for(i=0;i<RxMessage.DLC;i++){
                        printf(" %d",RxMessage.Data);
                }
                printf("  The second frame has sent and got!\n\n");
        }

}

void CAN_SdPl_Three(uint16_t ID){
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
  uint8_t TransmitMailbox;
        uint8_t i,n;
       
        TxMessage.StdId=ID;                                     // ±ê×&#188;±êê&#182;·&#251;&#206;a0x0011,±íê&#190;μúò&#187;×éμ&#196;μúò&#187;&#214;&#161;êy&#190;Y£&#172;ó&#195;μúò&#187;&#184;&#246;&#203;&#196;&#206;&#187;±íê&#190;&#214;&#161;êy£&#172;ó&#195;μú&#182;t&#184;&#246;&#203;&#196;&#206;&#187;±íê&#190;×éêy&#161;£0000 0001 0001
        TxMessage.IDE=CAN_ID_STD;                         // ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        TxMessage.RTR=CAN_RTR_DATA;                 // &#214;&#161;ààDí&#206;aêy&#190;Y&#214;&#161;£&#172;ò&#187;&#214;&#161;8&#206;&#187;
        TxMessage.DLC=8;                                                         // ·¢&#203;í8&#184;&#246;×&#214;&#189;úD&#197;&#207;¢,êy&#190;Y3¤&#182;è&#194;&#235;£&#172;&#214;&#184;&#182;¨′&#171;ê&#228;&#214;&#161;μ&#196;3¤&#182;è
//        for(i=0;i<8;i++){
//                TxMessage.Data=CAN_SendArray;
//        }
        TxMessage.Data[0]=0x31;
        TxMessage.Data[1]=0x32;
        TxMessage.Data[2]=0x33;
        TxMessage.Data[3]=0x34;
       
        TxMessage.Data[4]=0x35;
        TxMessage.Data[5]=0x36;
        TxMessage.Data[6]=0x37;
        TxMessage.Data[7]=0x38;
        TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);    //&#191;aê&#188;′&#171;ê&#228;ò&#187;&#184;&#246;&#207;&#251;&#207;¢£&#172; oˉêyóD&#184;&#246;·μ&#187;&#216;&#214;μ£&#172;·μ&#187;&#216;óê&#207;&#228;o&#197;0£&#172;1£&#172;2
        while((CAN_TransmitStatus(CAN1, TransmitMailbox)!= CANTXOK)&&(n!=0xFF)){   //í¨1y&#188;ì2éCANTXOKà′è·&#182;¨·¢&#203;íê&#199;·&#241;3é1|£&#172;CANTXPENDING£o&#207;&#251;&#207;¢ê&#199;·&#241;1òo&#197;£&#187;CANTXFAILED&#198;&#228;&#203;&#251;
                n++;  
        }
        n=0;
        while((CAN_MessagePending(CAN1,CAN_FIFO0)==0)&&(n!=0xFF)){
                n++;
        }
       
        RxMessage.StdId=0x00;       //éè&#182;¨±ê×&#188;±êê&#182;·&#251;
        RxMessage.IDE=CAN_ID_STD;   //ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        RxMessage.DLC=0;            //ó&#195;à′éè&#182;¨′y′&#171;ê&#228;μ&#196;&#214;&#161;3¤&#182;è
        for(i=0;i<8;i++){
                RxMessage.Data=0x00;
        }
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
       
        if(RxMessage.StdId == ID){
                for(i=0;i<RxMessage.DLC;i++){
                        printf(" %d",RxMessage.Data);
                }
                printf("  The thrid frame has sent and got!\n\n");
        }
       
}

void CAN_SdPl_Four(uint16_t ID){
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
  uint8_t TransmitMailbox;
        uint8_t i,n;
       
        TxMessage.StdId=ID;                                     // ±ê×&#188;±êê&#182;·&#251;&#206;a0x0011,±íê&#190;μúò&#187;×éμ&#196;μúò&#187;&#214;&#161;êy&#190;Y£&#172;ó&#195;μúò&#187;&#184;&#246;&#203;&#196;&#206;&#187;±íê&#190;&#214;&#161;êy£&#172;ó&#195;μú&#182;t&#184;&#246;&#203;&#196;&#206;&#187;±íê&#190;×éêy&#161;£0000 0001 0001
        TxMessage.IDE=CAN_ID_STD;                         // ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        TxMessage.RTR=CAN_RTR_DATA;                 // &#214;&#161;ààDí&#206;aêy&#190;Y&#214;&#161;£&#172;ò&#187;&#214;&#161;8&#206;&#187;
        TxMessage.DLC=8;                                                         // ·¢&#203;í8&#184;&#246;×&#214;&#189;úD&#197;&#207;¢,êy&#190;Y3¤&#182;è&#194;&#235;£&#172;&#214;&#184;&#182;¨′&#171;ê&#228;&#214;&#161;μ&#196;3¤&#182;è
//        for(i=0;i<8;i++){
//                TxMessage.Data=CAN_SendArray;
//        }
        TxMessage.Data[0]=0x41;
        TxMessage.Data[1]=0x42;
        TxMessage.Data[2]=0x43;
        TxMessage.Data[3]=0x44;
       
        TxMessage.Data[4]=0x45;
        TxMessage.Data[5]=0x46;
        TxMessage.Data[6]=0x47;
        TxMessage.Data[7]=0x48;
        TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);    //&#191;aê&#188;′&#171;ê&#228;ò&#187;&#184;&#246;&#207;&#251;&#207;¢£&#172; oˉêyóD&#184;&#246;·μ&#187;&#216;&#214;μ£&#172;·μ&#187;&#216;óê&#207;&#228;o&#197;0£&#172;1£&#172;2
        while((CAN_TransmitStatus(CAN1, TransmitMailbox)!= CANTXOK)&&(n!=0xFF)){   //í¨1y&#188;ì2éCANTXOKà′è·&#182;¨·¢&#203;íê&#199;·&#241;3é1|£&#172;CANTXPENDING£o&#207;&#251;&#207;¢ê&#199;·&#241;1òo&#197;£&#187;CANTXFAILED&#198;&#228;&#203;&#251;
                n++;  
        }
        n=0;
        while((CAN_MessagePending(CAN1,CAN_FIFO0)==0)&&(n!=0xFF)){
                n++;
        }
       
        RxMessage.StdId=0x00;       //éè&#182;¨±ê×&#188;±êê&#182;·&#251;
        RxMessage.IDE=CAN_ID_STD;   //ê1ó&#195;±ê×&#188;±êê&#182;·&#251;
        RxMessage.DLC=0;            //ó&#195;à′éè&#182;¨′y′&#171;ê&#228;μ&#196;&#214;&#161;3¤&#182;è
        for(i=0;i<8;i++){
                RxMessage.Data=0x00;
        }
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
       
        if(RxMessage.StdId == ID){
                for(i=0;i<RxMessage.DLC;i++){
                        printf(" %d",RxMessage.Data);
                }
                printf("  The forth frame has sent and got!\n\n");
        }

}


写入三帧数据代码:
void CAN_SdPl_Temp(void){
        CAN_SdPl_One(0x0011);

        CAN_SdPl_Two(0x0012);
       
        CAN_SdPl_Three(0x0013);

}

写入四帧数据代码:
void CAN_SdPl_Temp(void){
        CAN_SdPl_One(0x0011);

        CAN_SdPl_Two(0x0012);
       
        CAN_SdPl_Three(0x0013);
        Delay_ms(100);
        CAN_SdPl_Four(0x0014);
       
}



主函数:
  while(1){
    if(FLAGS0_CANSdTp){
        CAN_SdPl_Temp();
        FLAGS0_CANSdTp = FALSE;

    }
}







问题出现了很久,一直没有解决多出来,求各位大佬帮忙解答!

敬往事一杯酒,再爱也不回头
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5140
金钱
5140
注册时间
2014-8-26
在线时间
1317 小时
发表于 2018-2-26 15:31:29 | 显示全部楼层
回复

使用道具 举报

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2017-10-31
在线时间
42 小时
 楼主| 发表于 2018-2-26 16:26:41 | 显示全部楼层
谢谢帮顶,来人啊,
敬往事一杯酒,再爱也不回头
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-2-27 01:21:28 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-2-27 21:31:39 | 显示全部楼层
看不懂啊!你用中断试试?
回复

使用道具 举报

0

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2018-3-20
在线时间
75 小时
发表于 2019-1-21 09:49:48 | 显示全部楼层
帮顶                 
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-5-29
在线时间
22 小时
发表于 2020-8-7 16:01:35 | 显示全部楼层
看不懂,帮顶
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-12-28
在线时间
4 小时
发表于 2020-12-30 19:54:54 | 显示全部楼层
看不懂,帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 10:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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