打印
[STM32F1]

多日未果!!!请教香主!!

[复制链接]
3051|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aoty|  楼主 | 2013-12-21 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
香主,我在调试CAN通信,但是调了多日依旧不知道哪里出了问题!请教下香主和坛里的高手!
                                    发送函数
void CAN_Configuration(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
                  /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);
  /* 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; //禁止接收FIFO锁定模式
  CAN_InitStructure.CAN_TXFP=ENABLE; //禁止发送FIFO优先级
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; //已经折算好了
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
  CAN_InitStructure.CAN_Prescaler=24;
  CAN_Init(CAN1,&CAN_InitStructure);
}
unsigned char CAN_MessageSend(void)
{
  CanTxMsg TxMessage;
  u32 i = 0;
  u8 TransmitMailbox = 0;
  /* transmit */
  TxMessage.StdId=0xa3;                   /* 设置标准id  注意标准id的最高7位不能全是隐性(1)。共11位 0xa3*/
        TxMessage.ExtId=0x00;       
  TxMessage.RTR=CAN_RTR_DATA;//数据帧
  TxMessage.IDE=CAN_ID_STD;//标准帧格式
  TxMessage.DLC=2; //帧长度,单位:字节
  TxMessage.Data[0]=0xCA;//待传数据
  TxMessage.Data[1]=0xFE;                     
  /*数据发送*/
  TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1,TransmitMailbox) == CANTXFAILED) && (i != 0xFF)) //等待CAN总线传输数据成功
  {
    i++;
  }
  if(i==0xff)//发送超时,但发送不成功
  {
    return 0;
  }
  return 1; /* Test Passed */
}                                 

/******************************接收函数**********************/
void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
}
unsigned char CAN_Configuration(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);
  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE; //禁止时间触发通讯模式  
  CAN_InitStructure.CAN_ABOM=DISABLE; //禁止自动离线模式
  CAN_InitStructure.CAN_AWUM=DISABLE; //禁止自动唤醒模式
  CAN_InitStructure.CAN_NART=DISABLE; //禁止非自动重传模式   ENABLE
  CAN_InitStructure.CAN_RFLM=DISABLE; //禁止接收FIFO锁定模式   
  CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级   ENABLE   
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
  CAN_InitStructure.CAN_Prescaler=24;
  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;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //((0x11<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//((0x11<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xFFFF;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;; //0x0000; //标识符需要比较(发送标识符为0x11,标准数据帧)
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;; //0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
  CAN_FilterInit(&CAN_FilterInitStructure);
        return 1;
}
unsigned char CAN_MessageReceive(void)
{
        CanRxMsg RxMessage;         
        if(CAN_MessagePending(CAN1, CAN_FIFO0)==0)
                return 0;
  RxMessage.StdId=0x00;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);                     
  if ((RxMessage.StdId!=0xa3) && (RxMessage.IDE!=CAN_ID_STD) && (RxMessage.DLC!=2))
  {
    return 0;  
  }
  if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
  {
    return 0;                  
  }                  
  return 1; /* Test Passed */         
}


实在是找不出问题!
沙发
aoty|  楼主 | 2013-12-21 14:14 | 只看该作者
我顶一下!希望大家可以看到!!!

使用特权

评论回复
板凳
aoty|  楼主 | 2013-12-21 15:24 | 只看该作者

使用特权

评论回复
地板
杨爱林林| | 2013-12-21 15:28 | 只看该作者
先用环回模式测一下,也就是自发自收
还有你这里
i = 0;
  while((CAN_TransmitStatus(CAN1,TransmitMailbox) == CANTXFAILED) && (i != 0xFF)) //等待CAN总线传输数据成功
  {
    i++;
  }
  if(i==0xff)//发送超时,但发送不成功
  {
    return 0;
  }这样  貌似没有超时功能吧

使用特权

评论回复
5
aoty|  楼主 | 2013-12-21 17:39 | 只看该作者
环回模式是没有问题的,这个我测试过了,还有就是你的回答我不太理解,可以说出哪里出问题了么?在线等!!!1960765649!!!万分感激!!!

使用特权

评论回复
6
ABHK| | 2013-12-21 20:29 | 只看该作者
帮楼主  顶起来  希望能够早点解决这个问题   应该不是很有难度吧   楼主

使用特权

评论回复
7
handlike| | 2013-12-22 00:27 | 只看该作者
实在是找不出问题!

楼主的提问实在让人费解。
提出问题,做了哪些工作,调试中哪里通不过交待一下嘛,从前到后一个“自己找不到问题”。到医院看病还要描述一下病情呢!

使用特权

评论回复
8
aoty|  楼主 | 2013-12-22 08:11 | 只看该作者
对不起,怪我!我要实现的两个板子之间的CAN通信,其次我的现象是发送应该是正常的(个人分析),那就剩下接受了?这是我的发送和接收函数,不知道哪里的配置出了问题!麻烦你给看看!!!

使用特权

评论回复
9
handlike| | 2013-12-22 15:56 | 只看该作者
CAN_InitStructure.CAN_Prescaler=24;


环回模式如果可以,你应该查一下上位机和下位机的波特率是否一致,也就是上、下位机的时间单元一致才可以。

使用特权

评论回复
10
aoty|  楼主 | 2013-12-22 16:04 | 只看该作者
handlike 发表于 2013-12-22 15:56
环回模式如果可以,你应该查一下上位机和下位机的波特率是否一致,也就是上、下位机的时间单元一致才可以 ...

是!这些东西我们都注意到了!但是现象还是出不来,要是不介意的话可以看一吓我的程序么?我给你发过去!你把你的邮箱号发给我!!!

使用特权

评论回复
11
ABHK| | 2013-12-22 17:32 | 只看该作者
帮你呼叫版主   希望香主能够出手相救

使用特权

评论回复
12
ABHK| | 2013-12-22 17:32 | 只看该作者
都是技术小菜鸟   香主   出手   一个顶俩     高手和菜鸟的区别

使用特权

评论回复
13
aoty|  楼主 | 2013-12-22 17:44 | 只看该作者
这么多人讨论,香主也不回复。。。。好伤心。。。。再次呼叫香主!!![em:9:][em:9:][em:9:][em:9:][em:9:][em:9:]

使用特权

评论回复
14
jt4117| | 2013-12-22 22:10 | 只看该作者
你这种丢出一堆程序给人找错。 其实别人很难查问题的。 谁有那那多时间看呢。
主要还是自己找原因。 别人只能给你指点一下思路。  
我建议你还是仔细检查一下硬件是否无问题。  还有就是要用工具啊。 示波器看各个部分的信号,是否正确。

使用特权

评论回复
15
杨爱林林| | 2013-12-23 08:18 | 只看该作者
aoty 发表于 2013-12-21 17:39
环回模式是没有问题的,这个我测试过了,还有就是你的回答我不太理解,可以说出哪里出问题了么?在线等!! ...

不点回复一直没看到帖子提醒。。。
你这个超时,不成功就一直i++;如果不成功的话,不会判断跳出while的,也就不会执行这句:if(i==0xff)//发送超时,但发送不成功

环回模式成功,说明配置上面没问题,检查检查硬件电路呗,还有那个终端电阻,多少来着

使用特权

评论回复
16
aoty|  楼主 | 2013-12-23 10:06 | 只看该作者
杨爱林林 发表于 2013-12-23 08:18
不点回复一直没看到帖子提醒。。。
你这个超时,不成功就一直i++;如果不成功的话,不会判断跳出while的 ...

没有注意到这个问题!!!sorry!!!但是我们在程序里加了一个
TestTx = CAN_MessageSend();
    if (TestTx == 1)
    {
       GPIO_SetBits(GPIOB,GPIO_Pin_12);
       Delay();   // LED1闪烁一次,发送一个字符
       GPIO_ResetBits(GPIOB,GPIO_Pin_12);
       Delay();
    }   
如果要是发送成功的话就会LED就会闪烁!我们的确看到了这个现象!不过至于你说的问题,因为当时我们写的时候也是看着别人的写的,不过我觉得这段程序还是可以生效的,不过是我一直的自加,如果我成功了。退出来就会紧接着检测,这样不也会生效么???
硬件方面我们的确也不敢肯定,我们实现的是两个板子之间的CAN通信,但是在两个CAN口之间只是接了两根线(H,L)。。。。不对么?120欧姆终端电阻的话,我看了下资料是说用于远距离传输的时候增强EMC,这么短的距离,是没有必要的!!!
要不我发给你我的程序,你给看看,okay?
香主也一直不回复我。。。1960765649~~~~

使用特权

评论回复
17
aoty|  楼主 | 2013-12-23 10:10 | 只看该作者
jt4117 发表于 2013-12-22 22:10
你这种丢出一堆程序给人找错。 其实别人很难查问题的。 谁有那那多时间看呢。
主要还是自己找原因。 别人 ...

示波器倒是用过,我还是不太会使用那个,我只是在PA11 PA12用示波器看了下波形~不知道对不对?
那个频率我也自己计算了下,也不知道对不对。。。貌似最后算出来的和程序不一样、。。。

使用特权

评论回复
18
杨爱林林| | 2013-12-23 10:22 | 只看该作者
你现在指的灯闪烁,也是环回模式测的吧。。
不知道你有没有 can监视器 这样借助上位机,可以帮助调试
你那个超时,如果一直发送不成功,就会一直i++,不会跳出while的,然后就死了,没有超时功能

你的接收中断有没有开,借助接收中断仿真一下,看能否进入中断,如果能,看标识符什么的对不对。
应该不是软件问题。。
再检查一下硬件,虽然can也是差分信号,要不你,两块板子共地试试。
canh-canh
canl-canl
gnd-gnd

使用特权

评论回复
19
grant_jx| | 2013-12-23 11:07 | 只看该作者
最不愿意看的就是这种一段代码上来,什么分析问题的过程也没有,要别人帮助的。不是不想帮你,而是一些问题,如果你自己都说不清楚,给你建议也是瞎建议。

按照你说明的,内部回环可行,查下外部接线,留上楼上也说了,CAN BUS的2个端点要加120欧终端电阻。
如果确认硬件没问题,还是不能通讯,查询下发送不出去时CAN BUS的错误状态寄存器看看,里面提示什么?

使用特权

评论回复
20
aoty|  楼主 | 2013-12-23 19:59 | 只看该作者
杨爱林林 发表于 2013-12-21 15:28
先用环回模式测一下,也就是自发自收
还有你这里
i = 0;

你应该再仔细看看我的那段程序,在while()里还有i!=0xff的。。。这样不就有了超时功能了么?
那我我试试这个CAN监视器吧。。。
至于共地也是用于远距离传输。。。。不过我可以试试!!
哎,这么多天了,再搞不出来,估计就得跪了。。

使用特权

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

本版积分规则

31

主题

207

帖子

1

粉丝