打印

请求香帮主关于CAN无法通讯的问题

[复制链接]
4307|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhujw2002|  楼主 | 2009-9-25 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前在一款终端上调试CAN通讯出现无**常通讯的问题(在用J-LINK调试的时候比较正常),重新上电10次大概只有一两次能够正常,但相同的程序用在另一款终端上CAN通讯很正常(相同的硬件,不同的PCB)。这个问题已经困扰好几天了,到现在还没有解决。实在没撤,还请各位高手帮忙分析下问题可能出在哪里!!!
STM32F103VE,CAN接收器采用CTM1050T(5V,与STM32直连,期间也试过用CTM8251AT,3.3V的,情况一样),CAN调试器采用CAN232MB,两端均接有120欧电阻。无**常通讯时各寄存器值如下:
MSR寄存器(低位在前)00 0C 00 00:RX--1    SAMP--1
TSR  08 00 00 82    TEER0--1
ESR:  57 00 F8 00   TEC--F8    LEC--5显性位错误  BOFF--1   EPVF--1   EWGF--1
                        IER:  02 00 00 00    FMPIE0--1
用示波器测量CANL CANH,看到的都是低电平(隐性位),没看到有显性位,用CAN232MB可以往总线上成功发送数据,在CAN_RX上也能检测到波形。
沙发
zhujw2002|  楼主 | 2009-9-25 15:02 | 只看该作者
以下为CAN初始化程序
void CAN_Configuration(void)
{
  GPIO_InitTypeDef         GPIO_InitStructure;
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  RCC_ClocksTypeDef RCC_ClocksStatus;

  
        //Configure CAN pin: RX
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  //Configure CAN pin: TX
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  
        RCC_GetClocksFreq(&RCC_ClocksStatus);
        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;
  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_13tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;
  CAN_InitStructure.CAN_Prescaler=RCC_ClocksStatus.PCLK1_Frequency/(16*250000);      //波特率计算,16M/(1+8+7)/4=250k
  if(!CAN_Init(CAN1, &CAN_InitStructure))
  {
          //CAN初始化失败
          Can_Structure.Init_Fail_Flag = true;
          return;
  }
  /*这里注意的是采用点的位置,也就时BS1,BS2的设置问题,是CANopen协议中推荐的设置。
  1Mbps速率下,采用点的位置在6tq位置处,BS1=5,BS2=2
  500kbps速率下,采用点的位置在8tq位置处,BS1=7,BS2=3
  250kbps速率下,采用点的位置在14tq位置处,BS1=13,BS2=2
  125k,100k,50k,20k,10k的采用点位置与250K相同。*/
  /* 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=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);*/
  
  //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=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

}

使用特权

评论回复
板凳
zhujw2002|  楼主 | 2009-9-25 15:04 | 只看该作者
void CAN_SendDataToMeter(void)
{
        static u8 Can_Send_FAIL_Cnt = 0x00;
        u16 i;
        CanTxMsg TxMessage;
        u8 TransmitMailbox = 0;

        if((Can_Send_FAIL_Cnt >= 30)&&(Can_Structure.Init_Fail_Flag))
        {
                Can_Send_FAIL_Cnt = 0x00;
                Can_Structure.Init_Fail_Flag = false;
                ON_CAN_PWR();
                CAN_Configuration();
                return;
               
        }
        //使用扩展ID发送
  TxMessage.StdId=0x00;
  TxMessage.ExtId=0x501;
  TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=8;
  MemoryCpy(TxMessage.Data, CAN_Send_DataBuff, 8);
  TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i < 0xFF))
  {
    i++;
  }

  if(i >= 0xFF)
          Can_Send_FAIL_Cnt ++;
        else
                Can_Send_FAIL_Cnt = 0x00;
}

使用特权

评论回复
地板
zhujw2002|  楼主 | 2009-9-28 16:02 | 只看该作者
问题已解决!!
GPIO_InitStructure.GPIO_Speed没有赋初值的缘故

使用特权

评论回复
5
511| | 2009-9-29 13:29 | 只看该作者
guanzhu,

使用特权

评论回复
6
有意思| | 2009-10-4 22:26 | 只看该作者
问题已解决!!
GPIO_InitStructure.GPIO_Speed没有赋初值的缘故
zhujw2002 发表于 2009-9-28 16:02


还是要靠自己,很久以来,都感觉在21ic上得不到真正的帮助
真正的雪中送炭式的帮助与解答!

问简单的被人鄙视,
有点深度的又很少有人回答,有多少牛人又有多少时间在这瞎灌水呢
哎,只好自己苦苦思寻,苦海无边啊!!!
没外国佬积极,

使用特权

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

本版积分规则

36

主题

75

帖子

0

粉丝