OpenEdv-开源电子网

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

原子哥的CAN例程(回环模式)里面的错误

[复制链接]

15

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2012-8-10
在线时间
2 小时
发表于 2012-9-12 08:53:40 | 显示全部楼层 |阅读模式
       原子哥提前发布的回环模式应该没有严格测试过,前一段时间我发现了中断收发不工作这个问题,发了贴问他,他也忙。。
后来仔细查了下问题是原子哥写中断函数的时候粗心了啊
用void USB_LP_CAN_RX0_IRQHandler(void)替换掉下面的

 void  USB_LP_CAN1_RX0_IRQHandler(void)
  
就可以了。
本来打算写个CAN各种模式的总结的(怎么算ID,怎么过滤等等),先搁着吧
学海无涯,回头是岸
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-12 10:05:51 | 显示全部楼层
回复【楼主位】徐家二少:
---------------------------------
这个不是哦,这个是因为stm32f10x.s和stm32f10x_hd.s的中断函数定义有些区别。
比如我们迷你版用的是前者,故名字得改为你说的void USB_LP_CAN_RX0_IRQHandler(void)。
但是我的代码是豪华版上面的,用的是后者,所以中断函数名就是:void  USB_LP_CAN1_RX0_IRQHandler(void)。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2012-5-26
在线时间
0 小时
发表于 2012-9-14 15:30:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,在Can_Tx_Msg函数中好像还有一个错误
if(ide==0) //标准帧 

id&=0x7ff;//取低11位stdid 
id<<=21; 
CAN->sTxMailBox[mbox].TIR&=~0XFFE00000;   
}else //扩展帧 

id&=0X1FFFFFFF;//取低32位extid 
id<<=3; 
//??这里错了吧,怎么是清零低三位??
CAN->sTxMailBox[mbox].TIR&=~0X00000007; 

就上面那一行好像错了吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-14 18:47:00 | 显示全部楼层
回复【3楼】cgsz1992:
---------------------------------
没错哦。你看看TIR寄存器的各位定义吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2012-5-26
在线时间
0 小时
发表于 2012-9-16 11:13:54 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
怎么清零的是TIR的低三位???不是清零前面的那些位吗???
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-16 11:41:36 | 显示全部楼层
回复【5楼】cgsz1992:
---------------------------------
确实有问题,谢谢提醒。现在改过来了:
//id:标准ID(11位)/扩展ID(11位+18位)     
//ide:0,标准帧;1,扩展帧
//rtr:0,数据帧;1,远程帧
//len:要发送的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节)
//*dat:数据指针.
//返回值:0~3,邮箱编号.0XFF,无有效邮箱.
u8 Can_Tx_Msg(u32 id,u8 ide,u8 rtr,u8 len,u8 *dat)
{    
u8 mbox;   
if(CAN->TSR&(1<<26))mbox=0; //邮箱0为空
else if(CAN->TSR&(1<<27))mbox=1; //邮箱1为空
else if(CAN->TSR&(1<<28))mbox=2; //邮箱2为空
else return 0XFF; //无空邮箱,无法发送 
CAN->sTxMailBox[mbox].TIR=0; //清除之前的设置
if(ide==0) //标准帧
{
id&=0x7ff;//取低11位stdid
id<<=21;   
}else //扩展帧
{
id&=0X1FFFFFFF;//取低32位extid
id<<=3;    
}
CAN->sTxMailBox[mbox].TIR|=id;  
CAN->sTxMailBox[mbox].TIR|=ide<<2;   
CAN->sTxMailBox[mbox].TIR|=rtr<<1;
len&=0X0F;//得到低四位
CAN->sTxMailBox[mbox].TDTR&=~(0X0000000F);
CAN->sTxMailBox[mbox].TDTR|=len;    //设置DLC.
//待发送数据存入邮箱.
CAN->sTxMailBox[mbox].TDHR=(((u32)dat[7]<<24)|
((u32)dat[6]<<16)|
  ((u32)dat[5]<<8)|
((u32)dat[4]));
CAN->sTxMailBox[mbox].TDLR=(((u32)dat[3]<<24)|
((u32)dat[2]<<16)|
  ((u32)dat[1]<<8)|
((u32)dat[0]));
CAN->sTxMailBox[mbox].TIR|=1<<0; //请求发送邮箱数据
return mbox;
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-6-25 19:46:17 | 显示全部楼层
有点迷糊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 18:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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