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

2019-08-17 05:36发布

       原子哥提前发布的回环模式应该没有严格测试过,前一段时间我发现了中断收发不工作这个问题,发了贴问他,他也忙。。
后来仔细查了下问题是原子哥写中断函数的时候粗心了啊
用void USB_LP_CAN_RX0_IRQHandler(void)替换掉下面的

 void  USB_LP_CAN1_RX0_IRQHandler(void)
  
就可以了。
本来打算写个CAN各种模式的总结的(怎么算ID,怎么过滤等等),先搁着吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-08-17 09:41
回复【楼主位】徐家二少:
---------------------------------
这个不是哦,这个是因为stm32f10x.s和stm32f10x_hd.s的中断函数定义有些区别。
比如我们迷你版用的是前者,故名字得改为你说的void USB_LP_CAN_RX0_IRQHandler(void)。
但是我的代码是豪华版上面的,用的是后者,所以中断函数名就是:void  USB_LP_CAN1_RX0_IRQHandler(void)。

cgsz1992
2楼-- · 2019-08-17 10:34
回复【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; 

就上面那一行好像错了吧
正点原子
3楼-- · 2019-08-17 13:51
 精彩回答 2  元偷偷看……
cgsz1992
4楼-- · 2019-08-17 17:00
回复【4楼】正点原子:
---------------------------------
怎么清零的是TIR的低三位???不是清零前面的那些位吗???
正点原子
5楼-- · 2019-08-17 17:50
回复【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;
}
SHIBO
6楼-- · 2019-08-17 21:36
有点迷糊

一周热门 更多>