Your code looks correct. The transfer also looks correct, the “garbage bytes” are the transfer-CRC. You need to add error handling to the TxPush function and then look into the part that offloads the CAN frames from the TX queue into the CAN driver.
If you’re using the stock CAN driver from ST, you need to be sure to avoid inner priority inversion: