AnsweredAssumed Answered

STM32F10x CanBus Recieve interrupt problem

Question asked by Mucit23 on Aug 16, 2014
Hi there!

I'm using STM32F103VeT6 and I'm trying to do can bus communication with LoopBack Mode.

This is my code.
/*******************************************************************************
* @file    can.c
* @author  Arectron
* @version V1.0.0
* @date    10/08/2014    
********************************************************************************/
/*-------------------------------Includes------------------------------------*/
 #include "STM32F10x.h"
 #include "CAN.h"
/* Private variables ---------------------------------------------------------*/
  //CanRxMsg RxMessage;
/* Private Functions ---------------------------------------------------------*/
 
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the nested vectored interrupt controller.
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
 
#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
 
  /* Enable CAN1 RX0 interrupt IRQ channel */
  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);
}
 
/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the CAN GPIO ports.
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* CAN Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
     
  /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);      
     
    GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
}
 
/*******************************************************************************
* Function Name  : CAN_init
* Description    : Configures the CAN
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
void Can_init(void)
{
  CAN_InitTypeDef CAN_InitStructure;
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 
     
  NVIC_Configuration();
  GPIO_Configuration();
     
  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_LoopBack;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=1;
  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;
  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_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
}
 
/*******************************************************************************
* Function Name  : CanSendMessage
* Description    : Can Write Date to CAN-BUS
* Input          : None
* Output         : None
* Return         : None
* Attention        : None
*******************************************************************************/
ErrorStatus CanSendMessage(uint32_t CanTxId, uint8_t CanTxBufSize, uint8_t* CanTxData)
{
  CanTxMsg TxMessage;
  uint8_t i=0,CanTxMailbox=0,TimeOut=0;
  /* transmit */
  TxMessage.StdId = CanTxId;  
  TxMessage.RTR = CAN_RTR_DATA;
  TxMessage.IDE = CAN_ID_STD; 
  TxMessage.DLC = CanTxBufSize;
    
  for(i=0;i<CanTxBufSize;i++)
    {
     TxMessage.Data[i]=CanTxData[i];
  }
     
    CanTxMailbox=CAN_Transmit(CAN1,&TxMessage);
     
  TimeOut = 0;
//  while((CAN_TransmitStatus(CAN1,CanTxMailbox) != CANTXOK))
//  {
//      TimeOut++;
//      if(TimeOut==255)return ERROR;
//  }
     
    return SUCCESS;
}
The above program works without Recieve interrupts. So I can send and receive data.  But when I interrupt active, the program doesn't work. 

This is interrupt rutine
void USB_LP_CAN_RX0_IRQHandler(void)
{
    CanRxMsg RxMessage;
     
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
 
        lcd_set_cursor(0,1);
    sprintf(dz,"ID=0x%X",RxMessage.StdId);
        lcd_print(dz);
    CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); 
}

What is the cause of the problem?

Regards


Outcomes