消息关闭
    暂无新消息!

STm32的can通信问题

问题作者 : 一阵风2017-08-12发布
我用两块一样的板子进行CAN通信,但是一直接收不到,从keil的寄存器中观察发现发送时会出现填充错误stuff error,如果不发送的话会出现格式错误form error。请问该如何排查这些问题,怎么解决。
我尝试用回环模式的话,是可以正常收发的。
这是代码。求大神指教。
#include "CanTran.h"

CanTxMsg TxMessage;
CanRxMsg RxMessage;
u8 CAN_Recieve_Flag;
u8 count1 = 0;


/**
  * @brief  Configures the CAN, transmit and receive using interrupt.
  * @param  None
  * @retval : PASSED if the reception is well done, FAILED in other case
  */
void MyCAN_Init(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  GPIO_InitTypeDef  GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1 , ENABLE);

 
  /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  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);

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

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=ENABLE;   // 
  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 Speed = 200KHz
//  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
//  CAN_InitStructure.CAN_BS1=CAN_BS1_14tq;
//  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
//  CAN_InitStructure.CAN_Prescaler=10;
//  CAN_Init(CAN1, &CAN_InitStructure);
 //500k
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_4tq;
  CAN_InitStructure.CAN_Prescaler=4; //10;
  CAN_Init(CAN1, &CAN_InitStructure);




 

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;
  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 FIFO0 message pending interrupt enable */ 
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

}


void CAN_TransmitData(u32 StdId, uint8_t DLC_Num,uint8_t *Data)
{
  /* transmit 1 message */
  uint8_t i;
  TxMessage.StdId=StdId;   
TxMessage.ExtId = 0x0000;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.RTR=CAN_RTR_DATA;  
  TxMessage.DLC=DLC_Num;  
  for(i=0;i<DLC_Num;i++)
    TxMessage.Data[i]=Data[i];
  CAN_Transmit(CAN1, &TxMessage);
}

/**
  * @brief  This function handles USB Low Priority or CAN RX0 interrupts 
  *   requests.
  * @param  None
  * @retval : None
  */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  CAN_Recieve_Flag = 1;
}


void CanTran_task(void)
{
   if(CAN_Recieve_Flag==1)
   {
      CAN_Recieve_Flag = 0;
  switch(RxMessage.StdId)
  {
//    case 0x101:
// PowerSwitchState = RxMessage.Data[3];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[2]; 
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[1];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[0];
// UpKeyLed();
case 0x101:
//  SetLedStatue(RxMessage.Data[0],RxMessage.Data[1]);
 count1++;
 CAN_TransmitData(0x101,8,"master1");
 break;
case 2:
  if(RxMessage.Data[0]==1)
  {
  // SetJDQ_AC(RxMessage.Data[1]);
  }
  else  if(RxMessage.Data[0]==2)
  {
//   SetJDQ_Bat(RxMessage.Data[1]);
  }
break;
case 3:  // Èí¿ª¹Ø
// SoftOff = RxMessage.Data[0];
break;
  }

   }


}

11个回答

︿ 1
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。

楼主用的什么速率测试的?
︿ 1
以前玩过,大概需要注意几点:
1.是不是所有功能都开了
2.过滤有没有问题
3.我们用过一个can转usb不灵,换can转网络,调试通过
4.程序可以试试环回模式,如果自发自收没问题,程序大部分都是好的
︿ 0
你把一些东西禁止乐,尝试吧所有功能打开 试试环回模式!环回模式 自己发送 自己接收