OpenEdv-开源电子网

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

请教CAN的自动重发功能应用

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-12-18
在线时间
5 小时
发表于 2014-4-29 10:36:07 | 显示全部楼层 |阅读模式
最近接手之前的研发工作,主要是对利用stm32f103的can与其他芯片的can进行通讯,交换数据。

我在调试过程中发现了一个问题,就是我发过去的数据,有一部分收到,有部分收不到,数据间隔1个到2个,

同事提醒我会不会是发送出错了。我想到CAN->MCR的4位NART设置


我can的设置里CAN->MCR的4位NART设置的是1,(can报文知发1次,不管发送结果如何都当成功)

要是要用0,(按CAN标准,CAN硬件发送报文失败时一直自动重发到发送成功)这功能还要其他设置吗?

调用其他函数?

请指教,谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-12-18
在线时间
5 小时
 楼主| 发表于 2014-4-29 11:11:37 | 显示全部楼层
void CAN_TX(void)
{
u32 id=0x400;  //id = 100 0000 0000
CAN->sTxMailBox[0].TIR=0; //清除之前的设置
id<<=21;   
CAN->sTxMailBox[0].TIR|=id;  
CAN->sTxMailBox[0].TDTR&=0xFFFFFFF0;
CAN->sTxMailBox[0].TDTR|=8; //设置字节长度DLC.
//待发送数据存入邮箱.
CAN->sTxMailBox[0].TDHR= (((u32)can4_tx22[7]<<24)|
 ((u32)can4_tx22[6]<<16)|
   ((u32)can4_tx22[5]<<8)|
 ((u32)can4_tx22[4]));
CAN->sTxMailBox[0].TDLR= (((u32)can4_tx22[3]<<24)|
 ((u32)can4_tx22[2]<<16)|
   ((u32)can4_tx22[1]<<8)|
 ((u32)can4_tx22[0]));
CAN->sTxMailBox[0].TIR|=1; //请求发送邮箱数据
}


u8 CAN_init(void)
{
u8  sjw,bs1,bs2;
u16 brp,i=0;
sjw = ( 3 -1);
bs1 = ( 6 -1);
bs2 = ( 5 -1);
brp = (36 -1);
CAN->MCR =0x0000; //退出睡眠模式(同时设置所有位为0)
CAN->MCR|=1; //请求CAN进入初始化模式
while((CAN->MSR&1)==0)
{
i++;
if(i>65535)return 1;//进入初始化模式失败
}
CAN->MCR|=0x00000011; //禁止报文自动传送
CAN->BTR =0x00000000;//清除原来的设置.
CAN->BTR|=sjw<<24; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位
CAN->BTR|=bs2<<20; //Tbs2=tbs2+1个时间单位
CAN->BTR|=bs1<<16; //Tbs1=tbs1+1个时间单位
CAN->BTR|=brp<<0;   //分频系数(Fdiv)为brp+1
//波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv)
CAN->MCR&=~(1<<0); //请求CAN退出初始化模式
while((CAN->MSR&1<<0)==1)
{
i++;
if(i>65535)return 2;//退出初始化模式失败
}
//过滤器初始化
CAN->FMR |=  0x00000001; //过滤器组工作在初始化模式
CAN->FA1R&=~(0x00000001<<0); //过滤器0不激活
CAN->FS1R|= (0x00000001<<0);  //过滤器0位宽为32位.
CAN->sFilterRegister[0].FR1=0X00800000;//32位ID
CAN->sFilterRegister[0].FR2=0XFFFFFFFF;//32位MASK
CAN->FM1R  &=~(0x00000001<<0); //过滤器0工作在标识符屏蔽位模式
CAN->FFA1R &=~(0x00000001<<0); //过滤器0关联到FIFO0
CAN->FA1R  |= (0x00000001<<0); //激活过滤器0
CAN->FMR   &=~(0x00000001); //过滤器组进入正常模式
return 0;

}
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-12-18
在线时间
5 小时
 楼主| 发表于 2014-4-29 11:39:36 | 显示全部楼层
如果我把can_tx()加一句while((CAN->TSR&(1<<26))==0) ;

变成
void CAN_TX(void)
{
u32 id=0x400;  //id = 100 0000 0000

while((CAN->TSR&(1<<26))==0) ;
CAN->sTxMailBox[0].TIR=0; //清除之前的设置
id<<=21;   
CAN->sTxMailBox[0].TIR|=id;  
CAN->sTxMailBox[0].TDTR&=0xFFFFFFF0;
CAN->sTxMailBox[0].TDTR|=8; //设置字节长度DLC.
//待发送数据存入邮箱.
CAN->sTxMailBox[0].TDHR= (((u32)can4_tx22[7]<<24)|
 ((u32)can4_tx22[6]<<16)|
   ((u32)can4_tx22[5]<<8)|
 ((u32)can4_tx22[4]));
CAN->sTxMailBox[0].TDLR= (((u32)can4_tx22[3]<<24)|
 ((u32)can4_tx22[2]<<16)|
   ((u32)can4_tx22[1]<<8)|
 ((u32)can4_tx22[0]));
CAN->sTxMailBox[0].TIR|=1; //请求发送邮箱数据
}


再把can->mcr 的txfp改为1
不知道可以不
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-12-18
在线时间
5 小时
 楼主| 发表于 2014-4-29 11:39:57 | 显示全部楼层
求高手帮个忙吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-29 14:51:39 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2020-7-23 08:49:46 | 显示全部楼层
帮顶!!
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-2-3
在线时间
11 小时
发表于 2020-11-9 10:58:29 | 显示全部楼层
能分析下,CAN发送丢帧问题,怎么解决的吗?发现判断邮箱空闲,再发没啥用
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 13:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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