When sending a CAN frame, you usually have to consider checking whether something else is already transmitting, and arbitration, which is where two devices start transmitting at the same time, and the one with the higher frame ID stops and tries later.
For those reasons, you don't know when the frame will be sent or whether it will need more than one attempt because of frames with a lower ID being transmitted. It is much easier to leave all of that to dedicated hardware, called a CAN engine, and only the ID and the data are sent to the CAN engine.