OK, thanks for that. I'll probably be using a much lower bit rate, around 100kbps.
CAN transceivers have a timeout function to prevent a malfunctioning node from clamping the bus. I guess that will be one downside of not using a transceiver, the one wire bus implementation can be clamped by a bad node.
The CAN hardware in your MCU should still have the capability to detect frame errors. There should be error counter registers in there somewhere named TEC and REC. When either of these increment to 127, your MCU will probably either generate an interrupt, or take a pre-configured action such as disabling the CAN peripheral. Someone should correct me if i'm wrong, since I have wondered this for a while myself, but I don't think the CAN transceiver is anything more than a simple differential transceiver. You could just as easily use CAN over RS485 transceivers as long as you have them on every node.
The CAN bus is a wired-OR.
Un-like RS485 and others you can have many transmitters active at same time.
To get to one active transmitter, Each transmitter monitors the bus. When what is being transmitted does not match what is received the transmitter stops sending.
This back-off leaves just one transmitter still transmitting well before the Data length code (DLC) field is being transmitted.
In addition the bus wired-OR gives
CAN data transmission uses a lossless bitwise arbitration method of contention resolution.
A Transmitted logic 0 wins the arbitration.
So a lower value Identifier wins over a higher value Identifier.
The transmitter with lower value Identifier, keeps transmitting.
The transmitter with higher value Identifier, stops transmitting.
https://en.wikipedia.org/wiki/CAN_busSo only transceivers with wired-OR bus will work properly.
C