OpenEdv-开源电子网

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

STM32 CAN,新手请各位帮助分析代码问题,不能正常通信

[复制链接]

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-3-25
在线时间
9 小时
发表于 2020-4-8 17:16:51 | 显示全部楼层 |阅读模式
1金钱
最近开始做can总线,例程测试没问题,在例程基础上封装了一个发送函数,但是发送不成功,循环发送一个26字节数组,代码如下,CAN_Transmit(CAN1,&TxMessage);返回值0,1,2,4,然后就一直是4.



int main(void)
{   
        SystemInit(); //éèÖÃÏμí3ê±ÖóÎa72M
//        KeyInit();          //°′¼ü1ü½Å3õê¼»ˉ
//        LED_GPIO_Config();//LED1ü½Å3õê¼»ˉ
        CAN_GPIO_Config();//CAN1ü½Å3õê¼»ˉ
        CAN_NVIC_Configuration(); //CANÖD¶Ï3õê¼»ˉ   
        CAN_INIT();//CA3õê¼»ˉNÄ£¿é       
        while(1)
    {
           can_tx(canbuf,26);
                 Delay(10000);
                       
          }
}


/*        CAN3õê¼»ˉ */
void CAN_INIT(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;  

  /* CAN register init */
  CAN_DeInit(CAN1);        //½«íaéèCANμÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
  CAN_StructInit(&CAN_InitStructure);//°ÑCAN_InitStructÖDμÄÿò»¸ö2Îêy°′è±ê¡Öμìîèë

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;//ûóDê1Äüê±¼ä′¥·¢Ä£ê½
  CAN_InitStructure.CAN_ABOM=DISABLE;//ûóDê1Äü×Ô¶ˉàëÏß1üàí
  CAN_InitStructure.CAN_AWUM=DISABLE;//ûóDê1Äü×Ô¶ˉ»½DÑÄ£ê½
  CAN_InitStructure.CAN_NART=DISABLE;//ûóDê1Äü·Ç×Ô¶ˉÖØ′«Ä£ê½
  CAN_InitStructure.CAN_RFLM=DISABLE;//ûóDê1Äü½óêÕFIFOËø¶¨Ä£ê½
  CAN_InitStructure.CAN_TXFP=DISABLE;//ûóDê1Äü·¢ËíFIFOóÅÏè¼¶
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CANéèÖÃÎaÕy3£Ä£ê½
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //ÖØDÂí¬2½ìøÔ¾¿í¶è1¸öê±¼äμ¥λ
  CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //ê±¼ä¶Î1Îa3¸öê±¼äμ¥λ
  CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //ê±¼ä¶Î2Îa2¸öê±¼äμ¥λ
  CAN_InitStructure.CAN_Prescaler=60;  //ê±¼äμ¥λ3¤¶èÎa60       
  CAN_Init(CAN1,&CAN_InitStructure);
                                      //2¨ìØÂêÎa£o72M/2/60(1+3+2)=0.1 ¼′100K

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;//Ö¸¶¨1yÂËÆ÷Îa1
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//Ö¸¶¨1yÂËÆ÷Îa±êê¶·ûÆá±ÎλÄ£ê½
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//1yÂËÆ÷λ¿íÎa32λ
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 1yÂËÆ÷±êê¶·ûμĸß16λÖμ
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//         1yÂËÆ÷±êê¶·ûμÄμí16λÖμ
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//1yÂËÆ÷Æá±Î±êê¶·ûμĸß16λÖμ
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//        1yÂËÆ÷Æá±Î±êê¶·ûμÄμí16λÖμ
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// é趨áËÖ¸Ïò1yÂËÆ÷μÄFIFOÎa0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// ê1Äü1yÂËÆ÷
  CAN_FilterInit(&CAN_FilterInitStructure);//        °′éÏÃæμÄ2Îêy3õê¼»ˉ1yÂËÆ÷

  /* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //ê1ÄüFIFO0ÏûÏ¢1òoÅÖD¶Ï

}  


void can_tx(u8* Databuf,u16 num)
{
        u16 times = 0;
        u8 res = 0;
        u8 i = 0;
        u16 j = 0;
        u8 flag = 0;
  CanTxMsg TxMessage;       

        times = num/8;
        res = num%8;

         
  TxMessage.StdId=0x00;        //±ê×¼±êê¶·ûÎa0x00
  TxMessage.ExtId=0x0000; //à©Õ1±êê¶·û0x0000
  TxMessage.IDE=CAN_ID_EXT;//ê1óÃà©Õ1±êê¶·û
  TxMessage.RTR=CAN_RTR_DATA;//Îaêy¾YÖ¡


  if(times > 0)
        {
                for (j = 0; j < times; j++)       
                {
                        TxMessage.DLC=8;        //        &#207;&#251;&#207;¢μ&#196;êy&#190;Y3¤&#182;è&#206;a8&#184;&#246;×&#214;&#189;ú
                        for (i = 0; i < 8; i++)
                        {
                                TxMessage.Data = Databuf[i+(8*j)];
                        }
                        flag=CAN_Transmit(CAN1,&TxMessage); //·¢&#203;íêy&#190;Y
                        Delay(100);
                }       
                if(res > 0)
                {
                        TxMessage.DLC=res;        //        &#207;&#251;&#207;¢μ&#196;êy&#190;Y3¤&#182;è&#206;ares&#184;&#246;×&#214;&#189;ú
                        for (i = 0; i < res; i++)
                        {
                                TxMessage.Data = Databuf[i+(8*j)+res];
                        }
                        CAN_Transmit(CAN1,&TxMessage); //·¢&#203;íêy&#190;Y
    }

  }
        else
        {
                TxMessage.DLC=res;        //        &#207;&#251;&#207;¢μ&#196;êy&#190;Y3¤&#182;è&#206;a8&#184;&#246;×&#214;&#189;ú
                for (i = 0; i < res; i++)
                {
                        TxMessage.Data = Databuf;
                }
                CAN_Transmit(CAN1,&TxMessage); //·¢&#203;íêy&#190;Y
  }
}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5140
金钱
5140
注册时间
2014-8-26
在线时间
1317 小时
发表于 2020-4-8 17:51:11 | 显示全部楼层
本帖最后由 login_FAE 于 2020-4-8 17:52 编辑

CAN_Transmit这个函数的返回值0,1,2表示用于发送的邮箱号
返回4说明没有用于发送的邮箱
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-3-25
在线时间
9 小时
 楼主| 发表于 2020-4-9 09:48:41 | 显示全部楼层
login_FAE 发表于 2020-4-8 17:51
CAN_Transmit这个函数的返回值0,1,2表示用于发送的邮箱号
返回4说明没有用于发送的邮箱

我代码有什么有问题吗?一组数据也收不到呢
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-3-25
在线时间
9 小时
 楼主| 发表于 2020-4-9 15:34:40 | 显示全部楼层
找不出问题,出现了一个更加奇怪的 现象,一个程序通信正常,稍微已做修改通讯不正常,然后改回原来的程序,依然不正常,明明是两个一样的程序
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-6-16
在线时间
5 小时
发表于 2020-4-9 22:20:45 | 显示全部楼层
我也遇到和你一样的问题,0,1,2代表的是发送数据使用的邮箱号,4是没有邮箱可以使用了,也就是0,1,2号邮箱都被占用了。所以如何释放这些被占用的邮箱就成为关键。原子哥的这个例程好像是有点问题。我也正在解决这个问题,希望多交流。
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-3-25
在线时间
9 小时
 楼主| 发表于 2020-4-17 14:10:30 | 显示全部楼层
李通 发表于 2020-4-9 22:20
我也遇到和你一样的问题,0,1,2代表的是发送数据使用的邮箱号,4是没有邮箱可以使用了,也就是0,1,2号 ...

例程没有问题,我用PB9 PB8就可以了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 11:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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