OpenEdv-开源电子网

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

CAN发送数据问题

[复制链接]

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
发表于 2013-7-31 17:00:13 | 显示全部楼层 |阅读模式
请教原子哥,我用你的战舰版的例程做了两个板子的通讯,一开始可以正常发送和接收,但是通讯时间长了后就会出现发送不了的情况,仿真出的结果是无有效邮箱mbox=oxff。这是什么原因呢?谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-31 17:30:55 | 显示全部楼层
回复【楼主位】648342243:
---------------------------------
后来测试发现不是说时间长了就会,而是概率性的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-7-31 20:54:24 | 显示全部楼层
是不是数据没有及时处理?邮箱用完了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-2 09:40:11 | 显示全部楼层
回复【3楼】正点原子:
----------------------------
好像是这样,那要怎么解决?我是接收传感器的数据,一接收到数据就马上用CAN发送数据。但有时候还是会造成邮箱用完了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-2 10:18:27 | 显示全部楼层
回复【4楼】648342243:
---------------------------------
你等发送完,再发,应该就不会出现这个问题啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-2 10:20:06 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
但是当出现发送不了数据这种情况的时候,不是说一次发送不了,是一直发送不了,邮箱就一直是满的,必须复位才行
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-2 10:36:58 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
if(res=0)
{res=Can_Send_Msg(sendbuf,8);}
这样子写可以么?当发送成功,即RES=0的情况下再发
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-2 10:51:23 | 显示全部楼层
回复【7楼】648342243:
---------------------------------
可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-2 11:01:51 | 显示全部楼层
回复【7楼】648342243:
---------------------------------
实验证明这样写不行
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-2 11:12:37 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
加上适当的延时就可以发送数据了,不过会不会出错还要验证。想问下原子哥当判断到发送不成功,怎样设置可以把发送邮箱都清空的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-2 16:35:04 | 显示全部楼层
回复【10楼】648342243:
---------------------------------
你的总是有发送失败的情况?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-5 10:56:23 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
嗯嗯,是的。我是用SPI来读取传感器的数据的,会不会是读取数据太快,然后会导致发送会失败呢?还有就是可不可以判断出发送失败就马上清空邮箱呢?因为一旦发送失败后他就一直都不能发送成功了,就是一直没有有效的邮箱。我程序上是判断一旦发送失败就重新初始化can,不过这样程序运行速度就变得慢了。该怎么解决呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-5 22:17:32 | 显示全部楼层
回复【12楼】648342243:
---------------------------------
我们的例程没有加入出错处理,你得加上这个了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-6 10:06:26 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
嗯嗯,就是想请教下该怎么加?我现在的出错处理是重新初始化,可是这样处理好像不太好,有没有其他办法?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-8-6 10:21:42 | 显示全部楼层
判断错误标志位了.然后做处理,具体的可以去看下ST的数据手册了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-7
在线时间
7 小时
发表于 2013-8-7 14:01:02 | 显示全部楼层
最近我也遇到这个问题了,用的是105做2路CAN,这两路CAN都有这个发送的问题;
开始的时候挺好的,能正常收发,等数据量大的时候,就老发不出去,程序判断为无可用邮箱;两个CAN都是一样的现象,郁闷至极;求解?啊
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-7
在线时间
7 小时
发表于 2013-8-7 14:02:29 | 显示全部楼层
补充:两路CAN都重新映射了端口;

//////////////////////////////////////////////////////////////////////////////////
//CAN1初始化
//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;
//    其他,初始化失败;

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_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能PORTB时钟
                   
/**********  CAN1 TX IN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
    /**********  CAN1 RX IN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO 

/* Remap CAN1 GPIOs */
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); //CAN1 重映射 B8 ,PB9

/* CAN1 and CAN2 eriph clocks enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);   //使能CAN1时钟 
 CAN_DeInit(CAN1);
  //CAN单元设置
  CAN_InitStructure.CAN_TTCM=DISABLE;  //非时间触发通信模式  //
  CAN_InitStructure.CAN_ABOM=DISABLE;  //软件自动离线管理  //
   CAN_InitStructure.CAN_AWUM=DISABLE;  //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
   CAN_InitStructure.CAN_NART=DISABLE;  //报文自动传送 //
   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 

/* CAN1 filter init */
  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 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;
}   

//////////////////////////////////////////////////////////////////////////////////
//CAN2初始化
//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;
//    其他,初始化失败;


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 CAN2_RX1_INT_ENABLE 
    NVIC_InitTypeDef  NVIC_InitStructure;
#endif

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能PORTB时钟

/**********  CAN2 TX IN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
    /**********  CAN2 RX IN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO 

/* Remap CAN2 GPIOs */
GPIO_PinRemapConfig(GPIO_Remap_CAN2, ENABLE); //CAN2 重映射 B5 ,PB6

/* CAN2 eriph clocks enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);   //使能CAN2时钟 
 CAN_DeInit(CAN2);
  //CAN单元设置
  CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式  //
  CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理  //
   CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
   CAN_InitStructure.CAN_NART=DISABLE; //报文自动传送 //
   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(CAN2, &CAN_InitStructure);            // 初始化CAN2

/* CAN2 filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=15;   //过滤器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_FIFO1;//过滤器0关联到FIFO1
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
   CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

#if CAN2_RX1_INT_ENABLE

CAN_ITConfig(CAN2,CAN_IT_FMP1,ENABLE);//FIFO1消息挂号中断允许.     
  
   NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            // 次优先级为0
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-7
在线时间
7 小时
发表于 2013-8-7 14:04:12 | 显示全部楼层
哪位大神救救我吧
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-8-7 14:09:03 | 显示全部楼层
用1个变量计量可用发送缓冲区数,使用缓冲区减计数,发送完成中断中加计数。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-10-23
在线时间
22 小时
发表于 2018-7-6 00:22:40 | 显示全部楼层
648342243 发表于 2013-8-2 10:36
回复【5楼】正点原子:
---------------------------------
if(res=0)
{res=Can_Send_Msg(sendbuf,8);}
这样 ...

请问你是在哪加了延时呢?我也遇到同样问题,很诡异
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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