cancel
Showing results for 
Search instead for 
Did you mean: 

CAN communicatino problem discovery f4

hadjrami
Associate II
Posted on December 09, 2013 at 20:45

Hello 

I have a problem with CAN transmission and reception I have tried to make it connecting the CANRX to the CANTX, but it doesn't work. I have found the same problem when trying to make connection with other board. All initialization are  successfully but transmission end with error code which refer to ''CAN cell did not provide an empty mailbox'' that I didn't understand it reason.

  #define CANx                       CAN1

  #define CAN_CLK                    RCC_APB1Periph_CAN1

  #define CAN_RX_PIN                 GPIO_Pin_0

  #define CAN_TX_PIN                 GPIO_Pin_1

  #define CAN_GPIO_PORT              GPIOD

  #define CAN_GPIO_CLK               RCC_AHB1Periph_GPIOD

  #define CAN_AF_PORT                GPIO_AF_CAN1

  #define CAN_RX_SOURCE              GPIO_PinSource0

  #define CAN_TX_SOURCE              GPIO_PinSource1 

void main ()

{

CAN_Configuration

();

while()

{

CAN_MessageTransmit()

;

}

}

void CAN_Configuration(void)

{  

  CAN_InitTypeDef CAN_InitStructure;

  CAN_FilterInitTypeDef CAN_FilterInitStructure;

  GPIO_InitTypeDef  GPIO_InitStructure;

  

  /* Enable GPIO clock */

  RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);

  /* Connect CAN pins to AF9 */

  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);

  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); 

  

  /* Configure CAN RX and TX pins */

  GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

  GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

  

  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure); 

  

  /* Enable CAN clock */

  RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

  

  /* CAN register init */

  CAN_DeInit(CANx);

  /* 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 Baudrate = 1 MBps (CAN clocked at 30 MHz) */

  CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;

  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;

  CAN_InitStructure.CAN_Prescaler = 2;

  CAN_Init(CANx, &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);

  

  /* Transmit Structure preparation */

  TxMessage.StdId = 0x321;

  TxMessage.ExtId = 0x01;

  TxMessage.RTR = CAN_RTR_DATA;

  TxMessage.IDE = CAN_ID_STD;

  TxMessage.DLC = 1;

  

  /* Enable FIFO 0 message pending Interrupt */

  CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);

}

 void CAN_MessageTransmit(void){

  TxMessage.StdId=0x11;

  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);

        CAN_Error_Code= CAN_GetLastErrorCode (CAN1);

  uint8_t i = 0;

  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF))

  {

    i++;

  }

  }   

void CAN1_RX0_IRQHandler(void)

{  

   

   if(CAN_GetITStatus(CAN1, CAN_IT_FMP0)!= RESET){ // A message is pending in the FIFO 0

 

   CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

   CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); }

}

Thank you in advance for your help.
2 REPLIES 2
Posted on December 09, 2013 at 22:27

C++? Do you see any interrupts? How about if you use the internal loopback mode?

In your board-to-board experiments do you use transceivers?
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
hadjrami
Associate II
Posted on December 10, 2013 at 12:00

I am using C code (

IAR

 Embedded 

Workbench

). no interrupt in normal mode but it works with loopback mode. In the board to board experiment I have attempted to communicate using the MCP 2551 and in an other test I tried a direct cross connection between TX and RX from both sides but it doesn't work in tests.