打印

STM32的CAN通信时,RX方没有接收到数据,TX端却显示数据发送

[复制链接]
7856|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
licky|  楼主 | 2009-5-9 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试CAN通信,发现出现一个问题,详细描述如下

为了调试方便,我把CAN总线上的节点简化到只有2个节点,一个收一个发。

(1)当接收端滤波器设置为全接收,则可以接收到发送端数据,发送端显示发送成功。

(2)当接收端滤波器设置了过滤条件,则接收不到发送端的数据,但是发送端却显示发送成功。

请路过的帮忙指点一下,问题出来什么地方呢?

谢了先。


初始化代码部分:

 // CAN cell init 
  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;  
  CAN_InitStructure.CAN_TXFP=DISABLE;   
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; 
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; 
  CAN_InitStructure.CAN_Prescaler=60;  
  CAN_Init(&CAN_InitStructure);
   
  // CAN filter init
  CAN_FilterInitStructure.CAN_FilterNumber=0;               
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; 
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;   
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;        
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;        
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FilterFIFO0;  
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
  CAN_FilterInit(&CAN_FilterInitStructure);
  

  CAN_ITConfig(CAN_IT_FMP0 | CAN_IT_FMP1, ENABLE);



我的发送程序部分:

   TransmitMailbox = CAN_Transmit(&TxMessage);  
   i = 0;
    while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFFFF))
    {
      i++;
    }
 
    if(i == 0xFFFF)  
    {
      return ERROR;
    }
    else            
    {
      return SUCCESS;
    }  


接收是在中断中执行的。

沙发
licky|  楼主 | 2009-5-9 15:06 | 只看该作者

CAN接收过滤器不设置,发送端也显示发送成功

继续进行测试,在初始化代码中,我即使把接收过滤器初始化部分去掉或者把14个接收过滤器都关闭掉,发送端也同样认为发送成功?

这是为什么了?

有路过的指导一下呀。

使用特权

评论回复
板凳
kgsz| | 2009-5-11 10:11 | 只看该作者

我的CAN 也遇到问题了

我的是前16帧数据,CAN 采样器采不到东西 ,后面的就能采到

使用特权

评论回复
地板
dotagnu| | 2009-5-11 11:30 | 只看该作者

我回答一下,不知对不

can 检测发送成功是检测应答位的,而应答位是由硬件自己完成的,即使你把滤波器全关了,只是滤除要接受的 can数据帧,不会影响到硬件对应答位的正确置位,所以利用发送成功只能检测硬件是否连接。
我新手,不知道说的对不?

使用特权

评论回复
5
wlq_9| | 2009-5-11 14:18 | 只看该作者

发送成功

不代表接收程序没问题.
只是发送方发送完数据以后,收到ACK了.这说明发送的数据没被破坏,而有接收方完整接收了信息.但是接收方是否正确接收数据到寄存器,接收方寄存器是否完全配置正确,是不能由这个保证的.

使用特权

评论回复
6
licky|  楼主 | 2009-5-13 00:26 | 只看该作者

CAN问题

同意4楼和5楼的看法,我接下来做实验的时候也发现是这样的,CAN接收端先把数据接收下来,给发送方一个ACK信号,然后才会与滤波器中设置的内容进行对比,如果是想要的数据,则保留到FIFO中,否则丢弃。

使用特权

评论回复
7
aoty| | 2013-12-22 08:57 | 只看该作者
licky 发表于 2009-5-9 15:06
继续进行测试,在初始化代码中,我即使把接收过滤器初始化部分去掉或者把14个接收过滤器都关闭掉,发送端也 ...

你的问题解决了么?我遇到了和你同样的问题!能否交流下!QQ:1960765649
不知道我的问题出在了哪里?指教下!!!

使用特权

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

本版积分规则

4

主题

15

帖子

0

粉丝