The workaround I have tested is number 1 : Request a new transmission only when CAN is not in the Receiver state.
To avoid activating the transmission request in the critical time window between the sample points of the second
and third bit of intermission, the application software can
evaluate the Rx interrupt flags, such as IR.DRX, IR.RF0N, and IR.RF1N, which are set at the last bit of End-of-Frame (EoF).
The last bit of EoF is followed by three bits of intermission, or Inter-Frame-Space (IFS).
Therefore the critical time window has safely terminated three bit times after the Rx interrupt.
The basis of the workaround I have constructed is to transmit messages immediately after the danger interval
has passed or when the CAN is safely idle. The danger interval is identified by using the CAN receive interrupt handler
coupled with a time interval, generated using TC0, equivalent to at least 3 bit periods.
Messages which the node needs to process might be received into FIFO-0, for example. The interrupt CAN_IE_RF0NE
is enabled to detect the end of such messages.
Messages which the node would normally ignore are dumped into FIFO-1 so as to generate interrupts at the end
of each bus message. Interrupt CAN_IE_RF1NE is enabled to detect the end of such messages.
Upon detecting either of the above interrupts, TC0 is started to generate a short time interval equivalent
to at least CAN-bus 3-bit periods and at the end of this interval, TC0 overflow interrupt is triggered, and
if the code has a transmission pending, the transmission request flag is set immediately.
The undesirable aspects of this workaround are :
1) The simplicity and elegance of setting TXBAR whenever a message transmission is needed is thrown out of the window.
2) It is necessary to receive all CAN messages from the bus in order to trigger a CAN interrupt at the
end of each message. There is some overhead associated with this.
3) One of the FIFOs must be dedicated to receiving the messages that do not need to be processed but
must be received in order to trigger interrupts at the end of every message. Although, this is not essential
if transmitted messages are scheduled at the same rate as received messages that are processed, in which case
interrupts triggered after each message to be processed may suffice .
4) An additional timer may need to be configured/ operated to time the delay until after the critical
danger time between messages.
The full source code for this workaround example is attached in a zip, hope this helps anyone else who needs
to create a workaround.