50.8.3.2 Transmission Handling
A mailbox is in Transmit mode once the CAN_MMRx.MOT field has been configured. Message ID and Message Acceptance mask must be set before Receive mode is enabled.
After Transmit mode is enabled, the MRDY flag in CAN_MSR is automatically set until the first command is sent. When the MRDY flag is set, the software application can prepare a message to be sent by writing to the CAN_MDx registers. The message is sent once the software asks for a transfer command setting the MTCR bit and the message data length in CAN_MCRx.
The MRDY flag remains at zero as long as the message has not been sent or aborted. It is important to note that no access to the mailbox data register is allowed while the MRDY flag is cleared. An interrupt is pending for the mailbox while the MRDY flag is set. This interrupt can be masked depending on the mailbox flag in the CAN_IMR global register.
It is also possible to send a remote frame setting the MRTR bit instead of setting the MDLC field. The answer to the remote frame is handled by another reception mailbox. In this case, the device acts as a consumer but with the help of two mailboxes. It is possible to handle the remote frame emission and the answer reception using only one mailbox configured in Consumer mode. See Remote Frame Handling.
Several messages can try to win the bus arbitration in the same time. The message with the highest priority is sent first. Several transfer request commands can be generated at the same time by setting CAN_TCR.MBx bits. The priority is set in the CAN_MMRx.PRIOR field. Priority 0 is the highest priority, priority 15 is the lowest priority. Thus it is possible to use a part of the message ID to set the PRIOR field. If two mailboxes have the same priority, the message of the mailbox with the lowest number is sent first. Thus if mailbox 0 and mailbox 5 have the same priority and have a message to send at the same time, then the message of the mailbox 0 is sent first.
Setting the CAN_MCRx.MACR bit aborts the transmission. Transmission for several mailboxes can be aborted by writing MBx fields in the Abord Command register (CAN_ACR). If the message is being sent when the abort command is set, then the application is notified by the MRDY bit set and not by CAN_MSRx.MABT. Otherwise, if the message has not been sent, then MRDY and MABT are set in CAN_MSR.
When the bus arbitration is lost by a mailbox message, the CAN controller tries to win the next bus arbitration with the same message if this one still has the highest priority. Messages to be sent are re-tried automatically until they win the bus arbitration. This feature can be disabled by setting the CAN_MR.DRPT bit. In this case if the message was not sent the first time it was transmitted to the CAN transceiver, it is automatically aborted. The MABT flag is set in CAN_MSRx until the next transfer command.
The following figure shows three MBx message attempts being made (MRDY of MBx set to 0).
The first MBx message is sent, the second is aborted and the last one is trying to be aborted but too late because it has already been transmitted to the CAN transceiver.