You have to do it in the FW to send multiple frames. You'll need to use the first byte as a frame indicator. So technically you'll be sending 1 + 63 bytes, where the first byte is frame information and 63 bytes of data.
Create a data structure like this. This is just a reference so you can do it how you like.
enum
{
FIRST_FRAME,
MORE_FRAMES,
LAST_FRAME
};
typedef union
{
struct
{
uint8_t data[64];
}Bytes;
struct
{
unsigned firstFrameActive:2; // 0=firstFrame, 1=moreFrames, 2=lastFrame
unsigned frameSequenceNumber:6; // 0-63 frames
uint8_t data[63];
}Status;
}DataPacket_t;
Create the canData variable. Populate the data accordingly and just send the packet. This is just a reference showing how the sequence of frames would be sent. I'm not check HAL status here. You'll have to come up with you own packet stuffing using a forloop or whatever method and to be sure a frame has been sent before continuing with the rest of the packets.
DataPacket_t canData = {0};
// first packet
canData.Status.firstFrameActive = FIRST_FRAME;
canData.Status.frameSequenceNumber = 0;
canData.Status.data[0] = 0x01; // user will need to fill the rest of the array with data.
// update pTxHeader to send 64 bytes
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &pTxHeader, canData.Bytes.data);
// next packet
canData.Status.firstFrameActive = MORE_FRAMES;
canData.Status.frameSequenceNumber = 1;
canData.Status.data[0] = 0x01; // user will need to fill the rest of the array with data.
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &pTxHeader, canData.Bytes.data);
// last packet
canData.Status.firstFrameActive = LAST_FRAME;
canData.Status.frameSequenceNumber = 2;
canData.Status.data[0] = 0x01; // user will need to fill the rest of the array with data.
// update pTxHeader if less than 64 bytes
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &pTxHeader, canData.Bytes.data);