OpenEdv-开源电子网

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

CAN 发送疑惑

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-3-29
在线时间
0 小时
发表于 2012-5-25 17:01:45 | 显示全部楼层 |阅读模式

用原子哥的板子,外接一个TJA1050的CAN收发芯片,但是遇到一些问题。这个消息有时候发送不出去(开始的时候基本发不出去),然后卡了很久,突然会在某一刻发出去了,之后就持续发了,哪位大虾指点一下!
#define CAN_Recv      GPIO_Pin_11
#define CAN_Send      GPIO_Pin_12
#define CAN_PORT      GPIOA
(1)基本配置都差不多:
void CAN_Normal_Config()
{
 //根据 CAN_InitStruct 中指定的参数初始化外设 CAN 的寄存器
 CAN_FilterInitTypeDef CAN_FilterInitStructure; //变量申明不允许出现在语句之后,不然会出现error: #268:declaration may not appear after executable statement in block 错误提示
 /* CAN cell init */
 CAN_InitTypeDef CAN_InitStructure;
 CAN_DeInit(CAN1);
   CAN_StructInit(&CAN_InitStructure);
 CAN_InitStructure.CAN_TTCM = DISABLE;  //使能或者失能时间触发通讯模式
 CAN_InitStructure.CAN_ABOM = DISABLE;  //使能或者失能自动离线管理
 CAN_InitStructure.CAN_AWUM = DISABLE;  //使能或者失能自动唤醒模式
 CAN_InitStructure.CAN_NART = DISABLE;  //使能或者失能非自动重传输模式
 CAN_InitStructure.CAN_RFLM = DISABLE;  //使能或者失能接收 FIFO 锁定模式
 CAN_InitStructure.CAN_TXFP = DISABLE;  //使能或者失能发送 FIFO 优先级
 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;   //硬件工作在正常模式
 CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;  //0x02  重新同步跳跃宽度 3 个时间单位
 CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;  //时间段 1 的时间单位数目 (时间段1(BS1):定义采样点的位置。)
 CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
 CAN_InitStructure.CAN_Prescaler = 5; // 波特率分频器 该位域定义了时间单元(tq)的时间长度 即BRP[9:0]
 CAN_Init(CAN1, &CAN_InitStructure);

    /* CAN filter init */

 CAN_FilterInitStructure.CAN_FilterNumber = 0;       //待初始化的过滤器,它的范围是 1 到 13
 CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //指定过滤器被设置为标识符屏蔽模式
 CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽
 CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)0x1f<<21)&0xffff0000)>>16;   //设定过滤器标识符
 CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)0x1f<<21)|CAN_ID_STD)&0xffff;   //
 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;  //设定过滤器屏蔽标识符或者过滤器标识符
 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;  //
 CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0; //过滤器 FIFO0 指向过滤器0
 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;  //使能过滤器
 CAN_FilterInit(&CAN_FilterInitStructure);

 CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);// FIFO0 消息挂号中断屏蔽 使能
}
(2)/*******************************************************
函数功能:CAN发送数据
*******************************************************/
int CAN_SendMessage(char* Message)
{
 CanTxMsg TxMessage;
 uint32_t i;
 uint8_t TransmitMailbox = 0;
 
   /* CAN cell init */
 CAN_InitTypeDef CAN_InitStructure;
 CAN_DeInit(CAN1);
   CAN_StructInit(&CAN_InitStructure);
 CAN_InitStructure.CAN_TTCM = DISABLE;  //使能或者失能时间触发通讯模式
 CAN_InitStructure.CAN_ABOM = DISABLE;  //使能或者失能自动离线管理
 CAN_InitStructure.CAN_AWUM = DISABLE;  //使能或者失能自动唤醒模式
 CAN_InitStructure.CAN_NART = DISABLE;  //使能或者失能非自动重传输模式
 CAN_InitStructure.CAN_RFLM = DISABLE;  //使能或者失能接收 FIFO 锁定模式
 CAN_InitStructure.CAN_TXFP = DISABLE;  //使能或者失能发送 FIFO 优先级
 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;   //硬件工作在正常模式
 CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;  //0x02  重新同步跳跃宽度 3 个时间单位
 CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;  //时间段 1 的时间单位数目 (时间段1(BS1):定义采样点的位置。)
 CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
 CAN_InitStructure.CAN_Prescaler = 5; // 波特率分频器 该位域定义了时间单元(tq)的时间长度 即BRP[9:0]
 CAN_Init(CAN1, &CAN_InitStructure);

 //CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);//  FIFO0 消息挂号中断屏蔽
 TxMessage.StdId = 0x1F;      //设定标准标识符
 TxMessage.ExtId = 0x00;      //设定扩展标识符
 TxMessage.IDE = CAN_ID_STD;     //设定消息标识符的类型为用标准标识符
 TxMessage.RTR = CAN_RTR_DATA;     //设定待传输消息的帧类型为数据帧
 TxMessage.DLC = 2;        //设定待传输消息的帧长度
 TxMessage.Data[0] = 0xAA;
 TxMessage.Data[1] = 0x55;
 CAN_Transmit(CAN1, &TxMessage);

 
 TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);  //开始一个消息的传输
 i = 0;
 while( CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK && i < 0xFFFFF) //CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK
 {
  ++i;
 }
 //CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE);     // Disable interrupt handling
 
 if(i==0xfffff)//发送超时,但发送不成功
   {
     return 1;
   }
 
 return 0;
}
(3)main
 if(CAN_SendMessage(NULL)== 0)
  {
   GPIO_ResetBits(GPIOD , GPIO_Pin_2);
   Delay(0xfffff);
   Delay(0x4ffff);
   Delay(0xfffff);
   Delay(0x4ffff);
 
   GPIO_SetBits(GPIOD , GPIO_Pin_2);
   Delay(0xfffff);
   Delay(0x4ffff);
   Delay(0xfffff);
   Delay(0x4ffff);
  }
开始的现象是这个灯一直都不闪,我发送超时的时间已经设得很长了,但是它还是没反应,这可能是什么原因呢。
我用环回模式是正常的,但是用正常模式却一直有问题。 我也不知道是什么原因。

还有一个问题就是,TJA1050是5V供电的,直接把接收和发送引脚接到32的引脚上会不会不好。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-25 17:35:05 | 显示全部楼层
回复【楼主位】大地:
---------------------------------
正常模式,你接了2个CAN么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-3-29
在线时间
0 小时
 楼主| 发表于 2012-5-25 20:49:32 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
嗯,是用了两个CAN,一个板子只带有一个CAN,我就是用两个板子的,一个作为发送,一个作为接受,外接两个CAN收发模块。但是发送的时候不稳定,如果发出来了,另一个板子收到信号以后就往串口发送数据。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-25 22:49:16 | 显示全部楼层
回复【3楼】大地:
---------------------------------
这样啊.检查代码问题吧.
你是两个STM32+TJA1050?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-7-12
在线时间
0 小时
发表于 2012-5-26 11:11:37 | 显示全部楼层
我这个是直接对寄存器操作,接收和发送都是正常。硬件使用STM32F103和CTM8051T(周立功的CAN收发器)。希望对你有所帮助。

CAN通讯.rar

923.47 KB, 下载次数: 643

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-26 11:36:49 | 显示全部楼层
谢谢分享.
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-5-27
在线时间
0 小时
发表于 2012-5-27 22:45:11 | 显示全部楼层
最简单的测试方法 - 拿掉TJA1000, 短接CAN TX和RX,正常模式,然后在接收数据端监视发送数据是否正常。如果这个正常可以排除软件原因,有可能是终端匹配电阻或者TJA1050的问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-27 23:38:36 | 显示全部楼层
回复【7楼】fyu:
---------------------------------
这样短接貌似没法实现你要的效果哦(你这个可以理解自发自收吧?),我测试过,貌似不行啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-5-27
在线时间
0 小时
发表于 2012-5-28 19:47:34 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
LOOPBACK模式实际上并没有发送到TX端口上,在Datalink层就直接把数据回送了,达不到完全测试的目的.其实最标准的测试方法是在TX上用示波器看CAN信号,自己数信号,短接以后RX会补上应答位,理论上就是一个完整CAN消息,如果能得到你发送相同的数据就证明软件是没有问题的.没有示波器的情况下这种方法确认软件是否工作正常比较可靠.
至于发送失败可以看下错误寄存器,如果长时间保持128的话应该是终端匹配电阻的问题,128通常情况下是应答错误,即网络上其他CAN节点无法正确解析所以所有你发出的CAN Message都没有收到应答位.

另外在SendMessage里应该不需要初始化CAN模块,只要波特率和基本配置没有变化初始化一次应该就可以了.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-28 22:42:34 | 显示全部楼层
回复【9楼】fyu:
---------------------------------
谢谢指教.回头我研究一下再请教你.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-7-22
在线时间
0 小时
发表于 2012-7-22 09:33:18 | 显示全部楼层
回复【楼主位】大地:
---------------------------------
我也碰到了这个问题··接了收发器但是还是发不了数据~请问你解决问题了吗?
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2013-12-25 00:57:12 | 显示全部楼层
回复【9楼】fyu:
---------------------------------
你好!回复【楼主位】大地:
---------------------------------
楼主,你的问题解决了么?我想看看你的代码!可以贴出来看看么?
http://www.openedv.com/posts/list/25837.htm
回复 支持 反对

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2014-10-8
在线时间
0 小时
发表于 2014-10-15 20:25:15 | 显示全部楼层
回复【9楼】fyu:
---------------------------------
如果要有智能节点功能,是不是得在STM32和CAN总线驱动器之间夹一个CAN协议控制器
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
发表于 2014-10-15 22:55:11 | 显示全部楼层
建议检查一下你的5V供电,看看是不是真是5V
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 06:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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