cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4 DISCOVERY CAN bus controller problem

keyboqian
Associate
Posted on July 13, 2012 at 15:57

Hi all,

I am trying to get the CAN interface working on the STM32F4DISCOVERY board.

After calling the configuration functions from the peripheral library, when I tried to transmit message with just a oscilloscope connected to the TX and RX pins it does not work. I tried usng CAN_TransmitStatus() to see the status of the mailbox and it returned ''pending''. Then I tracked down the register in the CAN controller, the error flag is up and further more it says ''BIT DOMINANT error''... 

I don't know if I need to connect to a transceiver first and hook this board onto a CAN bus before I test it out? Or is it just something wrong with the configuration.

Here is the code I had for the configuration part:

---(I just used GPIOE pin0 to see if the program is running, nothing else)

 /* Enable GPIO clock */

  RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK|RCC_AHB1Periph_GPIOE, 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);

//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

//configure a pin for debug

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* CAN configuration ********************************************************/  

  /* 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 */

#ifdef  USE_CAN1

  CAN_FilterInitStructure.CAN_FilterNumber = 0;

#else /* USE_CAN2 */

  CAN_FilterInitStructure.CAN_FilterNumber = 14;

#endif  /* USE_CAN1 */

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

Any help is very appreciated. Thanks!

Keybo
36 REPLIES 36
evilrakshasa
Associate II
Posted on December 18, 2014 at 04:58

Ok thanks.

But am I missing something or making any mistake in terms of GPIO and CAN configuration in the code posted earlier?

Posted on December 18, 2014 at 05:36

But am I missing something or making any mistake in terms of GPIO and CAN configuration in the code posted earlier?

First example seems to be setting 450 kbaud, the second example seems to be 500 kbaud, but enables an interrupt with no service code.

There are working examples in the Standard Peripheral Library, and working board designs. If this is your first outing with CAN it might make sense to review some of these  and see how they work. CAN is further complicated by needing a receiving node to acknowledge transmission, and needing transceivers.
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
rm239955
Associate II
Posted on December 18, 2014 at 16:13

The original post was too long to process during our migration. Please click on the provided URL to read the original post. https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I6o3&d=%2Fa%2F0X0000000bvs%2FQZSFjnoKXfbFpYGmdKQwwO5oZN2TU9hobQRNLhpw1Qw&asPdf=false
Posted on December 18, 2014 at 16:28

I have used STM32 HAL Cube for programming.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
rm239955
Associate II
Posted on January 07, 2015 at 10:13

Why

Posted on January 07, 2015 at 12:43

Why

I choose not too? May be you can find/start a STM32F429I-DISCO + CAN + HAL thread to discuss this in, with people using/supporting said library?
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
evilrakshasa
Associate II
Posted on January 23, 2015 at 09:34

I have got my communication between the two CAN nodes working. I am able to transmit and receive CAN data.

First I transmit a particular data from node1, to which node2 responds. The response of node2 is received by node1 using the CAN receive interrupt. After this interrupt is processed node1 sends another data frame, to which node2 responds with two CAN frames(these are seen on a logic analyzer) but the CAN receive interrupt is not triggered again after the second transmission.

What could be the reason for this? I couldnt find if any flags have to be cleared after the first interrupt.

I don't think there should be an issue in timing for interrupts. But for your information, the time between the first transmit frame and first received frame is about 0.5ms, while that between the second transmit frame and second received frame is about 1.4ms.

Please help.

Thank you