OpenEdv-开源电子网

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

STM32 CAN通信问题

[复制链接]

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
发表于 2016-9-2 16:27:46 | 显示全部楼层 |阅读模式
30金钱
用的是F4的例程,发现发送脚不接入TJA1050的话就不会发送数据,如果在程序开始运行前接入的话就能正常发送,但是拔了就不行了,又要重新运行才行 这是为什么啊

最佳答案

查看完整内容[请看2#楼]

解决了 重新去看了一下MCR寄存器!把这段改为CAN_InitStructure.CAN_ABOM=ENABLE; //软件自动离线管理 就可以了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-2 16:27:47 | 显示全部楼层
解决了 重新去看了一下MCR寄存器!把这段改为CAN_InitStructure.CAN_ABOM=ENABLE;        //软件自动离线管理          就可以了
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-2 16:36:52 | 显示全部楼层
离线自恢复功能是否启用
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-2 16:51:31 | 显示全部楼层
365mcu 发表于 2016-9-2 16:36
离线自恢复功能是否启用

这个功能在哪?好像是没有 我用的F4的库函数例程测试的
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-2 16:56:52 | 显示全部楼层
a295055641 发表于 2016-9-2 16:51
这个功能在哪?好像是没有 我用的F4的库函数例程测试的

自恢复函数是哪个啊?求解
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-2 17:15:46 | 显示全部楼层
a295055641 发表于 2016-9-2 16:56
自恢复函数是哪个啊?求解

你CAN配置代码发上来
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-2 17:50:37 | 显示全部楼层
365mcu 发表于 2016-9-2 17:15
你CAN配置代码发上来

#include "can.h"
#include "delay.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//CAN驱动 代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/7
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////          

//CAN初始化
//tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq
//tbs2:时间段2的时间单元.   范围:CAN_BS2_1tq~CAN_BS2_8tq;
//tbs1:时间段1的时间单元.   范围:CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;
//Fpclk1的时钟在初始化的时候设置为42M,如果设置CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);
//则波特率为:42M/((6+7+1)*6)=500Kbps
//返回值:0,初始化OK;
//    其他,初始化失败;


u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

          GPIO_InitTypeDef GPIO_InitStructure;
          CAN_InitTypeDef        CAN_InitStructure;
          CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE
           NVIC_InitTypeDef  NVIC_InitStructure;
#endif
    //使能相关时钟
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟                                                                                                                    

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       
       
    //初始化GPIO
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
       
          //引脚复用映射配置
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1
          GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1
          
          //CAN单元设置
           CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   
          CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          
          CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
          CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送
          CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  
          CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定
          CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;         //模式设置
          CAN_InitStructure.CAN_SJW=tsjw;        //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
          CAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
          CAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
          CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1       
          CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
   
                //配置过滤器
          CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0001;////32位ID
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0001;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
               
#if CAN1_RX0_INT_ENABLE
       
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
  
          NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
#endif
        return 0;
}   

#if CAN1_RX0_INT_ENABLE        //使能RX0中断
//中断服务函数                            
void CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
        int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
        for(i=0;i<8;i++)
        printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data);
}
#endif

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)       
//len:数据长度(最大为8)                                     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//                 其他,失败;
u8 CAN1_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;         // 标准标识符为0
  TxMessage.ExtId=0x12;         // 设置扩展标示符(29位)
  TxMessage.IDE=CAN_Id_Standard;                  // 使用扩展标识符
  TxMessage.RTR=CAN_RTR_Data        ;                  // 消息类型为数据帧,一帧8位
  TxMessage.DLC=len;                                                         //         发送两帧信息
  for(i=0;i<len;i++)
  TxMessage.Data=msg;                                 // 第一帧信息         
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //等待发送结束
  if(i>=0XFFF)return 1;
        else
  return 0;               

}
//can口接收数据查询
//buf:数据缓存区;         
//返回值:0,无数据被收到;
//                 其他,接收的数据长度;
u8 CAN1_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //没有接收到数据,直接退出
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据       
    for(i=0;i<RxMessage.DLC;i++)
    buf=RxMessage.Data;  
        return RxMessage.DLC;       
}













回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-3 20:32:16 | 显示全部楼层
你是什么模式?回环?还是Normal
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-3 22:29:48 | 显示全部楼层
正点原子 发表于 2016-9-3 20:32
你是什么模式?回环?还是Normal

Normal
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-4 21:46:58 | 显示全部楼层
谁帮忙看看程序啊
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-4 21:58:59 | 显示全部楼层
365mcu 发表于 2016-9-2 17:15
你CAN配置代码发上来

离线自恢复功能怎么启用?
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-4 21:59:17 | 显示全部楼层
365mcu 发表于 2016-9-2 17:15
你CAN配置代码发上来

离线自恢复功能怎么启用?
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-4 22:00:31 | 显示全部楼层
正点原子 发表于 2016-9-3 20:32
你是什么模式?回环?还是Normal

原子哥 我配置串口的波特率会不会影响CAN的
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-5 09:25:50 | 显示全部楼层
a295055641 发表于 2016-9-4 21:59
离线自恢复功能怎么启用?

CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理   
改成ENABLE
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-5 09:47:12 | 显示全部楼层
365mcu 发表于 2016-9-5 09:25
CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理   
改成ENABLE

谢谢了  我也是去看了一下这个寄存器然后明白了的!谢谢了 还有我把写的这个模块加入到了另外一个程序中发现环回模式能够正常运行,还未普通模式就不行了 , 能不能帮我分析一下大概会是什么问题
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-5 10:49:45 | 显示全部楼层
a295055641 发表于 2016-9-5 09:47
谢谢了  我也是去看了一下这个寄存器然后明白了的!谢谢了 还有我把写的这个模块加入到了另外一个程序中发 ...

把自己设置成最佳答案的人,我表示不能理解。。。不过我相信遇到问题你都能自己搞明白的。。。。。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-5 12:30:20 | 显示全部楼层
正点原子 发表于 2016-9-3 20:32
你是什么模式?回环?还是Normal

这种把自己答案设置成最佳答案的人,怎么破?
回复

使用道具 举报

0

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-3-17
在线时间
95 小时
发表于 2016-9-5 14:59:09 | 显示全部楼层
365mcu 发表于 2016-9-5 12:30
这种把自己答案设置成最佳答案的人,怎么破?

拿了答案不结帖的也大有人在
不要脸没办法
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-5 15:00:54 | 显示全部楼层
slsdz 发表于 2016-9-5 14:59
拿了答案不结帖的也大有人在
不要脸没办法

那就不会有人愿意帮忙回答问题啦,没人闲的蛋疼就想帮助别人吧。。。。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-5 15:01:17 | 显示全部楼层
slsdz 发表于 2016-9-5 14:59
拿了答案不结帖的也大有人在
不要脸没办法

一般原子会帮忙结贴的
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-6 10:44:17 | 显示全部楼层
365mcu 发表于 2016-9-5 10:49
把自己设置成最佳答案的人,我表示不能理解。。。不过我相信遇到问题你都能自己搞明白的。。。。。

我当时自己找到了问题,然后就设置了答案 然后才看见别人回答的,你不要用你的龌龊的想法来强加给别人,真是醉了,能不能心理健康一点,阳光一点
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-6 10:45:24 | 显示全部楼层
365mcu 发表于 2016-9-5 15:01
一般原子会帮忙结贴的

我把分全给你行么?怎么你这样的人都有,别把别人想的跟你一样不堪
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-6 10:48:28 | 显示全部楼层
slsdz 发表于 2016-9-5 14:59
拿了答案不结帖的也大有人在
不要脸没办法

你才不要脸 ,我是自己找到了问题的答案,然后想着可以快点结贴才把自己的设置成了最佳答案,然后后来才看到他回的我,你不会看时间?你是脑残?
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-6 10:53:58 | 显示全部楼层
365mcu 发表于 2016-9-5 10:49
把自己设置成最佳答案的人,我表示不能理解。。。不过我相信遇到问题你都能自己搞明白的。。。。。

还有我也很感谢你能来帮我解决问题,这个分我跟本就不会在意,你想要的话我全给你也行,请问这个分拿来有什么用?
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-6 10:56:07 | 显示全部楼层
a295055641 发表于 2016-9-6 10:45
我把分全给你行么?怎么你这样的人都有,别把别人想的跟你一样不堪

行啊,呵呵。。。我也没说什么啊,只是不能理解有错啊?不知道你怎么想的(不过我也无所谓你怎么想)。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-6 10:57:33 | 显示全部楼层
a295055641 发表于 2016-9-6 10:48
你才不要脸 ,我是自己找到了问题的答案,然后想着可以快点结贴才把自己的设置成了最佳答案,然后后来才 ...

人家没有说你哦。。。自己干嘛站队
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-6 10:59:42 | 显示全部楼层
a295055641 发表于 2016-9-6 10:53
还有我也很感谢你能来帮我解决问题,这个分我跟本就不会在意,你想要的话我全给你也行,请问这个分拿来有 ...

问问题啊,我也没用,没事论坛看看,帮帮新人。。。没所谓的年轻人,要淡定。。。
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-6 11:00:40 | 显示全部楼层
365mcu 发表于 2016-9-6 10:59
问问题啊,我也没用,没事论坛看看,帮帮新人。。。没所谓的年轻人,要淡定。。。

http://www.openedv.com/thread-83321-1-1.html    你来吧 我把该给你的分给你  就此结束这件事情,这样没意思
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-6 11:01:42 | 显示全部楼层
a295055641 发表于 2016-9-6 11:00
http://www.openedv.com/thread-83321-1-1.html    你来吧 我把该给你的分给你  就此结束这件事情,这样 ...

不是事件啦,你的分留着以后问问题用吧,没关系的。我上班忙呢。。。。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-6 11:05:25 | 显示全部楼层

犯不着吵架。


回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-9-6 11:06:44 | 显示全部楼层
365mcu 发表于 2016-9-6 11:01
不是事件啦,你的分留着以后问问题用吧,没关系的。我上班忙呢。。。。

好吧 是我有点激动了 , 只要是看着说我不要脸太刺眼了,瞬间就不开心了。我又不是故意的 ,当时还想的是自己找到了问题挺开心的!把自己的正确答案设置为最佳答案,根本就没想那么多。然后后来才看到你的回复我也没想那么多,今天一进来看到这样就有点不淡定了,后来想了想别人这么想也无可厚非,是我自己没做的好,如果当时看到你回复了就给你解释一下可能就不是这样了,再说一次 谢谢你来帮我解答问题
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-9-6 11:11:01 | 显示全部楼层
a295055641 发表于 2016-9-6 11:06
好吧 是我有点激动了 , 只要是看着说我不要脸太刺眼了,瞬间就不开心了。我又不是故意的 ,当时还想的是 ...

嗯,要冷静,搞程序一定要冷静。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 20:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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