OpenEdv-开源电子网

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

如何操作STM32F105的从CAN

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-5-12
在线时间
0 小时
发表于 2014-5-12 10:09:25 | 显示全部楼层 |阅读模式
5金钱
 原子、各位同仁你们好: 本人页是接触ARM时间不长,现在我做的项目要求使用双CAN通信,主CAN、从CAN做冗余设计。主CAN可以操作相应的寄存器,那从CAN能操作相关的寄存器吗?求大家指教

最佳答案

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

[mw_shl_code=c,true]#include "can.h" #include "led.h" #include "delay.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板 //CAN驱动 代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/9/11 //版本:V1.0 //版权所有,盗版必究。 // ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2014-5-12 10:09:26 | 显示全部楼层
[mw_shl_code=c,true]#include "can.h" #include "led.h" #include "delay.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板 //CAN驱动 代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/9/11 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //CAN初始化 //tsjw:重新同步跳跃时间单元.范围:1~3; CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq //tbs2:时间段2的时间单元.范围:1~8; //tbs1:时间段1的时间单元.范围:1~16; CAN_BS1_1tq ~CAN_BS1_16tq //brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1 //注意以上参数任何一个都不能设为0,否则会乱. //波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp); //mode:0,普通模式;1,回环模式; //Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1); //则波特率为:36M/((1+8+7)*5)=450Kbps //返回值:0,初始化OK; // 其他,初始化失败; ///////////////////////////////////////////////////CAN1//////////////////////////////////////////////////// u8 CAN_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 CAN_RX0_INT_ENABLE NVIC_InitTypeDef NVIC_InitStructure; #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能PORTD时钟,使能功能复用时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO //GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE); //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= mode; //模式设置: mode:0,普通模式;1,回环模式; // //设置波特率 CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位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=0x0000;////32位ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 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 CAN_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 CAN_RX0_INT_ENABLE //使能RX0中断 //中断服务函数 void CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessage; int i=0; CAN_Receive(CAN1, 0, &RxMessage); Can_Send_Msg(RxMessage.Data,8); } #endif //can发送一组数据(固定格式:ID为0X12,标准帧,数据帧) //len:数据长度(最大为8) //msg:数据指针,最大为8个字节. //返回值:0,成功; // 其他,失败; u8 Can_Send_Msg(u8* msg,u8 len) { u8 mbox; u16 i=0; CanTxMsg TxMessage; TxMessage.StdId=0x12; // 标准标识符为0 TxMessage.ExtId=0x12; // 设置扩展标示符(29位) TxMessage.IDE=0; // 使用扩展标识符 TxMessage.RTR=0; // 消息类型为数据帧,一帧8位 TxMessage.DLC=len; // 发送两帧信息 for(i=0;i<8;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; return 0; } //can口接收数据查询 //buf:数据缓存区; //返回值:0,无数据被收到; // 其他,接收的数据长度; u8 Can_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<8;i++) buf=RxMessage.Data; return RxMessage.DLC; } ///////////////////////////////////////////////////CAN2//////////////////////////////////////////////////// u8 CAN2_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 CAN_RX2_INT_ENABLE NVIC_InitTypeDef NVIC_InitStructure; #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能PORTB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//使能CAN2时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO //GPIO_PinRemapConfig(GPIO_Remap_CAN2,ENABLE); //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; //模式设置: mode:0,普通模式;1,回环模式; // //设置波特率 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tq CAN_InitStructure.CAN_Prescaler=9; //分频系数(Fdiv)为brp+1 // CAN_Init(CAN2, &CAN_InitStructure); // 初始化CAN2 CAN_FilterInitStructure.CAN_FilterNumber=14; //过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 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 CAN_RX2_INT_ENABLE CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许. NVIC_InitStructure.NVIC_IRQChannel = CAN2_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 CAN_RX2_INT_ENABLE //使能RX2中断 //中断服务函数 void CAN2_RX0_IRQHandler(void) { CanRxMsg RxMessage; int i=0; CAN_Receive(CAN2, 0, &RxMessage); Can2_Send_Msg(RxMessage.Data,8); } #endif //can发送一组数据(固定格式:ID为0X12,标准帧,数据帧) //len:数据长度(最大为8) //msg:数据指针,最大为8个字节. //返回值:0,成功; // 其他,失败; u8 Can2_Send_Msg(u8* msg,u8 len) { u8 mbox; u16 i=0; CanTxMsg TxMessage; TxMessage.StdId=0x12; // 标准标识符为0 TxMessage.ExtId=0x12; // 设置扩展标示符(29位) TxMessage.IDE=0; // 使用扩展标识符 TxMessage.RTR=0; // 消息类型为数据帧,一帧8位 TxMessage.DLC=len; // 发送两帧信息 for(i=0;i<8;i++) TxMessage.Data=msg; // 第一帧信息 mbox= CAN_Transmit(CAN2, &TxMessage); i=0; while((CAN_TransmitStatus(CAN2, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束 if(i>=0XFFF)return 1; return 0; } //can口接收数据查询 //buf:数据缓存区; //返回值:0,无数据被收到; // 其他,接收的数据长度; u8 Can2_Receive_Msg(u8 *buf) { u32 i; CanRxMsg RxMessage; if( CAN_MessagePending(CAN2,CAN_FIFO0)==0)return 0; //没有接收到数据,直接退出 CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);//读取数据 for(i=0;i<8;i++) buf=RxMessage.Data; return RxMessage.DLC; } [/mw_shl_code]

回复

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2014-5-12 10:31:49 | 显示全部楼层
我研究了好长时间用寄存器实现105的CAN2,总是不行,没有耐心放弃了,但用库成功了,你要吗?
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-5-12
在线时间
0 小时
 楼主| 发表于 2014-5-12 11:21:06 | 显示全部楼层
回复【3楼】bxl131:
-------------------------------
CAN2可以操作主控制寄存器、主状态寄存器、发送状态寄存器、中断使能寄存器吗?
回复

使用道具 举报

69

主题

336

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2013-12-11
在线时间
0 小时
发表于 2014-5-12 18:51:43 | 显示全部楼层
回复【2楼】bxl131:
---------------------------------
可否加一下,1572823057,谢了
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2014-5-14
在线时间
56 小时
发表于 2014-6-23 09:41:12 | 显示全部楼层
回复【2楼】bxl131:
---------------------------------
您好,求把例程发来看看,邮箱:811323585@qq.com
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2014-5-14
在线时间
56 小时
发表于 2014-6-23 09:42:49 | 显示全部楼层
回复【3楼】bxl131:
---------------------------------
TxMessage.StdId=0x12;                  // 标准标识符为0
TxMessage.ExtId=0x12;              // 设置扩展标示符(
这两句话究竟什么意思呀?
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2014-6-24 21:12:52 | 显示全部楼层
回复【4楼】中核-404:
---------------------------------
这个按理来说应该可以的,不过我没找到在哪里操作。
回复

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2014-6-24 21:21:25 | 显示全部楼层
回复【6楼】玄子:
---------------------------------
已发送,请注意查收。
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2014-5-14
在线时间
56 小时
发表于 2014-6-24 23:04:35 | 显示全部楼层
回复【9楼】bxl131:
---------------------------------
邮件已收到,谢谢,我参考一下!
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-4-10
在线时间
10 小时
发表于 2015-4-10 11:48:45 | 显示全部楼层
回复【2楼】bxl131:
---------------------------------
您好,我现在正在调双路CAN,能把例程发给我吗?wayne_7711@hotmail.com 谢谢
回复

使用道具 举报

16

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-7-28
在线时间
2 小时
发表于 2015-7-16 17:08:31 | 显示全部楼层
回复【9楼】bxl131:
---------------------------------
求例程,10211913802QQ.COM
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-10-1
在线时间
2 小时
发表于 2016-3-17 20:58:12 | 显示全部楼层
bxl131 发表于 2014-5-12 10:31
我研究了好长时间用寄存器实现105的CAN2,总是不行,没有耐心放弃了,但用库成功了,你要吗?

你好,我正在学这个,调试了很久都没有成功can2的使用,可以发一份给我参考一下吗???谢谢了 337879827@qq.com
Remember,Nothing is impossible!!
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-10-25
在线时间
1 小时
发表于 2016-5-16 15:43:47 | 显示全部楼层
bxl131 发表于 2014-5-12 10:31
我研究了好长时间用寄存器实现105的CAN2,总是不行,没有耐心放弃了,但用库成功了,你要吗?

例程能不能给我发一份,谢谢了! 778395285@qq.com
回复

使用道具 举报

wdjz 该用户已被删除
发表于 2017-2-8 12:26:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2017-2-17 16:31:10 | 显示全部楼层
wdjz 发表于 2017-2-8 12:26
你好 能把例程发我一份吗谢谢

已发。另外可以在csdn下载。
http://download.csdn.net/download/bxl133/9063125
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2017-3-6
在线时间
48 小时
发表于 2017-4-1 15:48:49 | 显示全部楼层
bxl131 发表于 2014-6-24 21:21
回复【6楼】玄子:
---------------------------------
已发送,请注意查收。

同求例程,615790385@qq.com
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-4-8
在线时间
9 小时
发表于 2018-4-8 21:12:39 | 显示全部楼层
大神,请赐我一份例程,932789469@qq.com
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-4-8
在线时间
9 小时
发表于 2018-4-8 21:15:05 | 显示全部楼层
bxl131 发表于 2014-5-12 10:09
[mw_shl_code=c,true]#include "can.h"
#include "led.h"
#include "delay.h"

大神,能给我一份例程吗?932789469@qq.com
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-6-30
在线时间
19 小时
发表于 2020-9-1 13:54:45 | 显示全部楼层
bxl131 发表于 2014-5-12 10:31
我研究了好长时间用寄存器实现105的CAN2,总是不行,没有耐心放弃了,但用库成功了,你要吗?

麻烦发一下双can的程序 2690392191@qq.com 谢谢哦
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-5-29
在线时间
3 小时
发表于 2024-11-26 10:09:38 | 显示全部楼层
bxl131 发表于 2014-5-12 10:31
我研究了好长时间用寄存器实现105的CAN2,总是不行,没有耐心放弃了,但用库成功了,你要吗?

你好,能给我发一份105驱动双CAN的例程吗?谢谢。tianxiayiyu@163.com
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-1-19 02:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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