Skip to main content
AZayt.5
Associate II
May 22, 2019
Solved

SPC570 CAN outputs bad frame, independent of frame parameters

  • May 22, 2019
  • 6 replies
  • 2552 views

Hello,

I am currently trying to transmit CAN frames from my SPC570S-DISP board. The board is connected to a verified working CAN node that is expecting frames at 500 kbps. I am able to write to the CAN buffers and get the CAN core to transmit, but it transmits the same nonsensical frame regardless of the input parameters (data, ID, RTR, IDE, SRR, length).

To send these frames, I configure the CAN core to the timing settings I need, then I configure a TX and RX MB, then I write the data and ID to a TX MB, then I set the TX MB code to 0x0C to initiate a transmission. I then await for the TX MB code to return to 0x08, which never happens. I observe the following frame on my scope, repeated every 4 ms or so:

0690X000008wDBxQAM.png

The bit widths are as expected: multiples of 2 us. The first dominant section is 17 bits long, followed by repeated patterns of 25 bits recessive and 1 bit dominant. No matter what settings I put into the TX MB, the result is the same. What additional settings need to be set for the transmission to go through correctly? My source code follows:

#include "main.h"
 
int main(void) 
{
 
 // Clock init from SPC5Studio
 clock_init();
 
 // Pin D9: CAN 0 RX
 SIUL2.MSCR_MUX[512-512].R = 0x01; // Input mux to FlexCAN0-RX
 
 // Pin D10: CAN 0 TX
 SIUL2.MSCR_IO[PD10].R = IO_SSS(0x01); // Output mux from FlexCAN0-TX
 SIUL2.MSCR_IO[PD10].B.OERC = 0x03; // Set output strength to very strong
 SIUL2.MSCR_IO[PD10].B.ODC = 0x02; // Enable push-pull output
 
 // Init interrupt vector table (no interrupts are used in this program)
 INTC_IACKR = (uint32_t)_vectors;
 
 irq_disable();
 
 SPC5_FLEXCAN0_ENABLE_CLOCK();
 FLEXCAN_0.CTRL.B.CLK_SRC = 0x01; // Bus clock (40 MHz) straight from xtal
 for (int i = 0; i < 32; i++)
 {
 FLEXCAN_0.MB[i].MB_CS.R = 0; // Clear all message buffers
 }
 FLEXCAN_0.MCR.B.MDIS = 0x00; // Enable module
 FLEXCAN_0.MCR.B.SRX_DIS = 0x01; // Disable self-receive
 FLEXCAN_0.MCR.B.MAXMB = 0x1F; // 32 max message buffers 
 
 FLEXCAN_0.CTRL.B.PRESDIV = 0x03; // Clock prescaler
 FLEXCAN_0.CTRL.B.PROPSEG = 0x05; // Propagation segment
 FLEXCAN_0.CTRL.B.PSEG1 = 0x07; // Phase segment 1
 FLEXCAN_0.CTRL.B.PSEG2 = 0x04; // Phase segment 1
 FLEXCAN_0.CTRL.B.RJW = 0x01; // Resync jump width
 
 FLEXCAN_0.RXGMASK.R = 0x00000000; // Global mask: accept all frames
 
 FLEXCAN_0.MB[15].MB_CS.B.CODE = 0X04; // Enable a RX message buffer
 FLEXCAN_0.MB[14].MB_CS.B.CODE = 0x08; // Enable a TX message buffer
 
 FLEXCAN_0.MCR.B.HALT = 0x00; // Take out of freeze mode
 
 irq_enable();
 
 
 while(true)
 {
 irq_disable();
 FLEXCAN_0.MB[14].MB_CS.B.CODE = 0x08; // Deactivate message buffer, just in case
 FLEXCAN_0.MB[14].MB_ID.R = 0x02020202; // Set ID
 FLEXCAN_0.MB[14].MB_DATAH.R = 0x12345678; // Set data
 FLEXCAN_0.MB[14].MB_DATAL.R = 0x9ABCDEF0; // Set data
 FLEXCAN_0.MB[14].MB_CS.R = 0x0C680000; // SRR=1, IDE=1, LENGTH=8, start tx (CODE=C)
 irq_enable();
 while (FLEXCAN_0.MB[14].MB_CS.B.CODE != 0x08); // Await tx end
 }
}

When I use the example code provided with spc5studio, I observe the same results.

Thank you for your insight!

Anton

    This topic has been closed for replies.
    Best answer by AZayt.5

    I did get this issue fixed, it was a gpio/hardware issue. I needed to ensure that weak pullup was active for the SPC CAN TX/RX pins, that the push/pull output was enabled for TX, that the CAN bus was terminated, and that both the TX and the RX pins are linked.

    It looks like the CAN core relies on the CAN RX pin to mirror what the TX pin is saying in order to function correctly, so it's important that both directions signals are going correctly.

    6 replies

    Erwan YVIN
    ST Employee
    July 17, 2019

    Hello anton ,

    Did you solve your issue ?

    Best regards

    Erwan

    BEdel.1
    Associate
    February 21, 2020

    Hello Anton,

    were you able to solve this problem? I have a very similar problem. (https://community.st.com/s/question/0D50X0000C9dqh0SQA/spc570sdisp-board-flexcan-sends-bad-frames-independent-of-can-parameters)

    Best regards

    Ben

    AZayt.5
    AZayt.5Author
    Associate II
    February 24, 2020

    Yes, please see my post. Best of luck!

    AZayt.5
    AZayt.5AuthorBest answer
    Associate II
    February 24, 2020

    I did get this issue fixed, it was a gpio/hardware issue. I needed to ensure that weak pullup was active for the SPC CAN TX/RX pins, that the push/pull output was enabled for TX, that the CAN bus was terminated, and that both the TX and the RX pins are linked.

    It looks like the CAN core relies on the CAN RX pin to mirror what the TX pin is saying in order to function correctly, so it's important that both directions signals are going correctly.

    Erwan YVIN
    ST Employee
    February 26, 2020

    Hello Azayt ,

    Good news to see that you solve your issue

    is it this option ?

    0690X00000DXKF9QAP.png

    Best regards

    Erwan

    BEdel.1
    Associate
    February 26, 2020

    Hello Anton,

    thank you for your answer! I tried it with these settings but unfortunately it hasn't solved my issue yet:

    // Pin D9: CAN 0 RX
    SIUL2.MSCR_MUX[512 - 512].R = 0x01; // Input mux to FlexCAN0-RX
     
    SIUL2.MSCR_IO[57].B.IBE = 0x01;
    SIUL2.MSCR_IO[57].B.WPUE = 0x01;
     
    // Pin D10: CAN 0 TX
    SIUL2.MSCR_IO[58].R = 0x00000001UL; // Output mux from FlexCAN0-TX
    SIUL2.MSCR_IO[58].B.OERC = 0x03; // Set output strength to very strong
    SIUL2.MSCR_IO[58].B.ODC = 0x02; // Enable push-pull output
    SIUL2.MSCR_IO[58].B.WPUE = 0x01;

    But perhaps other parts of my setup don't fit.

    Best regards

    Ben

    SKim.19
    Associate
    December 30, 2020

    HI Azayt.5

    I'm trying to be setting the FlexCAN in spc570S...

    I have a question to be fixed about setting the flag CAN Frame Error.

    What is to be fixed about the CAN Frame Error of the SPC570S?

    Could you help me to do a set about CAN?

    It's so difficult for me.....

    Thank you.

    ps. I was checked your post about FlexCAN, but it's not doing.