打印

高速

[复制链接]
3148|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
phctgu|  楼主 | 2011-4-2 18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 phctgu 于 2011-4-13 14:04 编辑

f f f
沙发
neaphy| | 2011-4-2 22:36 | 只看该作者
最有可能是波特率的问题,检查总线上的设备波特率是否一致

使用特权

评论回复
板凳
phctgu|  楼主 | 2011-4-6 11:05 | 只看该作者
2# neaphy


我用的是外部晶振 8M,没有倍频

  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;//时间段1为8个时间单位
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//时间段2为7个时间单位
  CAN_InitStructure.CAN_Prescaler = 2;  //(pclk1/((1+8+7)*9)) = 8Mhz/16/2 = 250Kbits设定了一个时间单位的长度9

  然后外部 收发器是 TJA1040(高速),这样设置应该没有问题啊

使用特权

评论回复
地板
airwill| | 2011-4-6 12:12 | 只看该作者
跟收发器的连接脚波形对比一下, 会不会焊接问题呢?

使用特权

评论回复
5
phctgu|  楼主 | 2011-4-6 15:17 | 只看该作者
4# airwill


因为 切换到 正常模式以后,从STM32到can收发器的引脚上,都没有信号输出,

没办法进行对比啊,CAN的收发器没有短路。

在网上 也到过 很多朋友也有过这样的疑惑,在LOOPBACK(环回)模式下OK,
但是在NORMAL(正常)模式就不行了。

这个大家 是什么原因造成的,这个难题困扰我好久了。

使用特权

评论回复
6
phctgu|  楼主 | 2011-4-6 15:19 | 只看该作者
2# neaphy

看了波特率的设置后,改成如下的设置,效果一样啊

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位
  CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;//时间段1为8个时间单位
  CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//时间段2为7个时间单位
  CAN_InitStructure.CAN_Prescaler = 5;  //(pclk1/((1+8+7)*9)) = 8Mhz/16/2 = 250Kbits设定了一个时间单位的长度9

使用特权

评论回复
7
neaphy| | 2011-4-6 23:07 | 只看该作者
你有几个CAN设备挂在总线上?
确保这些CAN设备的波特率都一致

开始发送的时候肯定有波形的,但是估计是发送错误就busoff了,波形一闪而过就没了,所以你测不到波形。把示波器设成单次触发应该可以抓到波形

使用特权

评论回复
8
phctgu|  楼主 | 2011-4-7 07:48 | 只看该作者
7# neaphy

我的CAN上 就两个设备啊,就是STM32做发送,TJA1040收发器 做接受。

TJA1040 的最高波特率可以到 1M 的,而且我的这两个设备距离很近的,在同一块电路板上面。

而且我 在STM32程序里面,CAN设置的是  10ms 发送一次,一直都是没有波形,观察它的状态位,显示的错误是   "显性位错".

这个问题困扰了很久   也只有朋友你能耐心的解答,谢谢了。今天去公司 我在仔细的测试下你说的现象。

使用特权

评论回复
9
neaphy| | 2011-4-7 13:40 | 只看该作者
你有很多概念还没搞清,至少先看下can协议吧
TJA1040是收发器,不是CAN设备CAN节点
CAN必须至少有两个节点才能通信,要不怎么应答?
用两块开发板试一下吧

使用特权

评论回复
10
phctgu|  楼主 | 2011-4-7 14:29 | 只看该作者
9# neaphy

好的 ,我马上去试一下。

我以前用 STM8 做CAN 通信的时候,只有一个节点的时候,是可以看到发送端有波形的哦。

另外,再用STM32做CAN 通信的时候,我用了一个专门的CAN 分析仪接收,这个分析仪也可以算是一个节点的,然后我看波形,也是没有变化。

使用特权

评论回复
11
phctgu|  楼主 | 2011-4-7 16:42 | 只看该作者
9# neaphy

大侠,不行啊。正常模式下,示波器始终没有波形显示啊。

使用特权

评论回复
12
phctgu|  楼主 | 2011-4-8 14:01 | 只看该作者
12# woshishiyanshj

我是用的STM32F 103做的,用的默认的IO口,设置差不多,只是PCLK1=8M,

难道是 PCLK1设置有问题吗。我先去试试。

void CAN_Configuration(void)   //CAN配置函数
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  /* CAN register init */
  CAN_DeInit(CAN1);
CAN_StructInit(CAN1,&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
  CAN_InitStructure.CAN_ABOM=DISABLE;//软件对CAN_MCR寄存器的  CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
  CAN_InitStructure.CAN_NART=ENABLE;//DISABLE; CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
  CAN_InitStructure.CAN_RFLM=DISABLE;//在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文
  CAN_InitStructure.CAN_TXFP=DISABLE;//发送FIFO优先级由报文的标识符来决定
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN硬件工作在正常模式
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位
  CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;//时间段1为8个时间单位
  CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//时间段2为7个时间单位
  CAN_InitStructure.CAN_Prescaler = 5;  //(pclk1/((1+8+7)*5)) = 8Mhz/16/5 = 100Kbits设定了一个时间单位的长度9
  CAN_Init(CAN1,&CAN_InitStructure);

  /* CAN filter init 过滤器初始化*/
  CAN_FilterInitStructure.CAN_FilterNumber=0;  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//给出了过滤器位宽1个32位过滤器
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器
  CAN_FilterInit(CAN1,&CAN_FilterInitStructure);

  CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//使能指定的CAN中断
}
-------------------------------------------------------------------------
TestStatus CAN_TxData(char data)
{
  CanTxMsg TxMessage;
  u32 i = 0;
  u8 TransmitMailbox = 0;
   TxMessage.StdId=0x00;// 设定标准标识符
  TxMessage.IDE=CAN_ID_STD;// 设定消息标识符的类型
  TxMessage.RTR=CAN_RTR_DATA;// 设定待传输消息的帧类型
   TxMessage.DLC= 1; //设定待传输消息的帧长度
  TxMessage.Data[0] = data;// 包含了待传输数据
  TransmitMailbox = CAN_Transmit(&TxMessage);//开始一个消息的传输
i = 0;
  while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK && (i !=0xFF))
  {
    i++;
  }
  return (TestStatus)ret;
}
}

使用特权

评论回复
13
phctgu|  楼主 | 2011-4-8 15:55 | 只看该作者
12# woshishiyanshj

有个疑惑,就是 如果波特率不对,或者IO口没开,那也应该
可以进发送中断的啊。

可是我正常模式下 进不了 发送中断。

这是什么原因啊

使用特权

评论回复
14
机器猫咪咪| | 2011-4-10 17:12 | 只看该作者
哦,路过。。。

两个CAN总线外部物理通信的实现例程以前买开发板时在ARMJISHU的神舟IV号STM32F107开发板的宣传上见到过,是需要用两根导线连接完成实验的,结果是在LCD上显示出来的,他们的论坛上可以下载到完整的源码,建议楼主去看看,幸许会有帮助吧

使用特权

评论回复
15
phctgu|  楼主 | 2011-4-10 20:58 | 只看该作者
15# woshishiyanshj

后来 我用了两快一模一样的板 调试,也是一样的效果啊。

如果没有ACK,那CANTX引脚 也应该会有波形啊,

我现在得出的结论是,CANTX都没有发送

使用特权

评论回复
16
bingochan| | 2017-10-10 17:23 | 只看该作者
我这边也有一样的情况,使用PA11和PA12引脚实现CAN通讯时接收不到报文,然后在收发器上有波形,出现这个问题的可能性是什么

使用特权

评论回复
17
bingochan| | 2017-10-10 17:24 | 只看该作者
请问楼主这类问题解决了吗?这个问题出现的原因是什么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

68

帖子

1

粉丝