I'm dealing with a board that no matter what I do I can't seem to make CAN work over 125 kbit/s. I'll give some detail about the board on the bottom, but I'm going to keep this question generic.
First of all, regarding hardware. From what I've gathered, there isn't any need for a pull-up resistor on the TX of CAN. Is that correct? It may perhaps be chip-specific, but wherever I see, it seems that the TX/RX lines are directly connected to the transceiver.
SYNC PROP PHASE1 PHASE2 BRP (prescaler) 125 kbit/s 1 1 3 3 32 250 kbit/s 1 1 3 3 16 500 kbit/s 1 1 3 3 8 1000 kbit/s 1 1 3 3 4
I've seen this from more than one source. Furthermore, the numbers fit to the formula in the datasheet of the microcontroller.
However, only the configuration for 125 kbit/s works for me. I'm using CANreal to monitor the messages.
I've tried different configurations for the CAN, for example with 16 time quanta instead of 8 as well as changing my microcontroller's clock to 16 MHz and using again different values. Regardless of all that, speeds higher than 125 kbit/s result in only errors and warnings in CANreal (which are taken from the CAN driver). Note that the same CAN board, driver and software works with 1 Mbit/s with some other hardware I have.
This all is made harder since, as soon as I put a probe from my oscillator on the TX line, it becomes a continuous 0-1 alteration like the following:
__------ __------ __------ __------ __------ / | / | / | / | / | / | / | / | / | / | / | / | / | / | / | | | | | | | | | | | | |_| |_| |_| |_| |
Which is not something I would be outputting by software. In fact, as soon as I remove the probe, the messages start arriving (again, only at 125 Mbit/s). So basically, I don't seem to be able to have any oscillator debugging available.
Back to my "first of all, regarding hardware", the shape of the signal suggests a pull-up resistor may be necessary, but I haven't seen the need for that in any datasheet I found. Furthermore, my microcontroller configures the pin when used as CAN, so I don't have control over making it push-pull (since it looks like it's open-drain). Not to mention the microcontroller doesn't even have a configuration to make the pin push-pull.
Is there any hidden parameter somewhere that should also be set? Is a pull-up resistor necessary after all? Why would the oscillator probe cause such a behavior?
Details from the board: