Page 1 of 1

[SOLVED] CANBUS Issues.

Posted: Sat Nov 14, 2015 4:10 am
by gnif
Hi All,

I am attempting to connect to my vehicles can bus using a STM32F103RET6 via a MCP2551. I have a DSO attached to RX on the MCP2551 and I can verify that I am getting nice clean data from the ECU (See attached DSO screenshot), and I have verified that the RX bit is flipping on the CAN status register, but I never seem to get any data. I believe the issue is a baud rate calculation problem. I have verified on the DSO that the baud is 500kbps (shortest bit is 2us), and this agrees with public information on the car.

Here is my CANConfig struct.

Code: Select all

static const CANConfig cancfg = {
  .mcr     = CAN_MCR_ABOM   | CAN_MCR_AWUM   | CAN_MCR_TXFP,
  .btr     = CAN_BTR_BRP(4) | CAN_BTR_SJW(1) | CAN_BTR_TS1(12) | CAN_BTR_TS2(5) | CAN_BTR_SILM
};


The MCU is on a 8MHz HSE, 72MHz Clock, with a divisor of 2 on the perhiperal bus, so the clock is 36MHz.
From what I understand, the baud rate can be calculated like so:

Code: Select all

STM32_PCLK1  / (BRP * (SJW + TS1 + TS2) = bps

So using the above values:

Code: Select all

36,000,000  / (4 * (1 + 12 + 5) = 500,000


I am remapping the CAN1 to PB8 & 9 using the following code

Code: Select all

  /* configure CAN */
  AFIO->MAPR |= AFIO_MAPR_CAN_REMAP_REMAP2;                             /* Remap CAN to PB8 (RX) & PB9 (TX) */
  palSetPadMode(GPIOB, 8, PAL_MODE_INPUT);                              /* set PB8 to input PP */
  palSetPadMode(GPIOB, 9, PAL_MODE_STM32_ALTERNATE_PUSHPULL);           /* set PB9 to output alt PP */
  canSTM32SetFilters(0, 0, NULL);                                       /* dont filter anything */
  canStart(&CAND1, &cancfg);                                            /* start the pheriperal */
  chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, can_rx, NULL);


If anyone could provide any help on this it would be greatly appreciated.

CH1 = Output of transciever
CH2 = High Line

Re: CANBUS Issues.

Posted: Sat Nov 14, 2015 6:00 am
by gnif
I found the issue, it was indeed the baud rate...

The calculation is actually

Code: Select all

STM32_PCLK1  / ((BRP + 1) * (SJW + (TS1 + 1) + (TS2 + 1)) = bps


So the correct values for 500kbps would be:

Code: Select all

BRP = 5
SWJ = 1
TS1 = 5
TS2 = 4