Part Number: TMS320F280039C
Other Parts Discussed in Thread: LAUNCHXL-F280039C, TCAN332, ISO1042
Tool/software:
Hi,
I have the problem that I cannot run CANFD at higher datarates than 3Mbps on my controller and a F280039C Eval Board or 4Mbps in between two F280039C Eval Boards with a very short cable (< 10cm) in both setups. I am using a CANFD example which I extended a little, so that I can choose the baudrate and trigger a message when I want. So everything works fine with 3Mbps, but my board already has a problem at 3Mbps and the two EVAL boards at 4Mbps. At 3Mbps I can also make the cable 1m long and I dont't face any issues in both setups. My own boards uses an isolated CANFD compatible transceiver, the ISO1042QDWVRQ1, so that is more or less the only difference, the firmware is the same on both boards.
About the Hardware:
CANFD Transceiver on my custom board (Note that I already removed the 10pF caps for testing):

Note that on the custom board, TX and RX of the transceiver are S50 impedance matched lines and only a few centimeter. The output of the driver is also only a few centimeter and close to 120Ohm differential and 60Ohm single end. Use of good design practice are guaranteed (continous GND plane, impedance matching etc,).
What I measured:
I measured the TX line on the EVAL board and the RX line on the other EVAL board / my custom board with an oscilloscope and it looks like the following for a 1 byte payload message (Not the measurements are not done with a spring probe):
EVAL to EVAL (working fine):


EVAL to Custom (Not working):

So from a signal point of view, I think it looks fine. In the end, it looks like there is no ACK from the receiving node.
About the firmware:
I used the MCAN_BitTimingCalculator.xls from TI to calculate the timings for different frequencies. Both controller use an external 10ppm tolerance 20Mhz crystal and running at 120MHz.
Registers:

CANFD Timing:
#ifdef USE_500KBAUDPS
//DIV3 -->500kBit (1Mbit/s data rate) --> Look at the timing calculator, put in 120Mhz, DIV3 etc. then look at Drierlib / Syscfg Inputs below in the .xlsx --> should output the values below!!!
bitTimes.nomRatePrescalar = 3U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 9U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 8U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 8U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 9U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 8U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 8U; // Data SJW
#endif
#ifdef USE_1MBAUDPS
//DIV1 --> 1MBaudps --> 2Mbit/s data rate
bitTimes.nomRatePrescalar = 4U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 11U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 10U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 10U; // Nominal SJW
bitTimes.dataRatePrescalar = 2U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 9U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 8U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 8U; // Data SJW
#endif
#ifdef USE_1_5MBAUDPS
//DIV1 --> 1.5MBaudps --> 3Mbit/s data rate
bitTimes.nomRatePrescalar = 3U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 10U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 7U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 7U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 10U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 7U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 7U; // Data SJW
#endif
#ifdef USE_2MBAUDPS
//DIV1 --> 2MBaudps --> 4Mbit/s data rate
bitTimes.nomRatePrescalar = 2U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 9U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 8U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 8U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 6U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 6U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 5U; // Data SJW
#endif
#ifdef USE_3MBAUDPS
//DIV1 --> 3MBaudps --> 3Mbit/s data rate
bitTimes.nomRatePrescalar = 3U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 5U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 2U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 2U; // Nominal SJW
bitTimes.dataRatePrescalar = 3U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 5U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 2U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 2U; // Data SJW
#endif
#ifdef USE_4MBAUDPS //Needs 2 termination resistors
//DIV1 --> 4MBaudps --> 4Mbit/s data rate
bitTimes.nomRatePrescalar = 1U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 7U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 5U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 5U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 7U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 5U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 5U; // Data SJW
#endif
#ifdef USE_5MBAUDPS //Needs 2 termination resistors
//DIV1 --> 5MBaudps --> 5Mbit/s data rate
bitTimes.nomRatePrescalar = 0U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 3U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 2U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 2U; // Nominal SJW
bitTimes.dataRatePrescalar = 0U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 3U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 2U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 2U; // Data SJW
#endif
Any idea, what could cause that? In the end, the EVAL boards should also be able to run at 5Mbps, but they dont. So I still think this is a firmware issue and not a hardware issue (the ISO1042QDWVRQ1 has more delay, so this might be the difference). When I try to send with >3Mbps from my board or > 4Mbps from the EVAL board, I dont get a CAN frame, just down and up again after a few 100 ns.














