Is CAN bus communications enough to update firmware?
We currently have a system with 10 microcontrollers on a CAN bus, and you can update the firmware on any of them over it. It works like this:

The firmware on each MCU is made of two parts, the Bootloader and the Application. On power up, the Bootloader runs first. It checks a byte in the EEPROM which says whether or not a valid Application is loaded into the FLASH.

If an Application is loaded (EEPROM = 0x42) the Bootloader jumps straight to it, and the Application runs as normal

If no Application is loaded, the Bootloader waits for instructions on the CAN bus. There are several types of instruction which can come from the master: Set Address, Write data, Read data, Finish. And the Bootloader can reply with: Hello, Data, Finished writing.

The Master sends packets of data for the Bootloader to write into the FLASH (always making sure that it's not being asked to overwrite itself). Since writing takes a while, it sends a Finished Writing message when it's done writing each block. Having sent all of the Application, the Master then reads it all back again to make sure that it has all written correctly. Lastly, it sends a Finished message to the Bootloader. The Bootloader writes 0x42 into the EEPROM and jumps to the Application code.

Of course, the Application also needs to be Bootloader aware. There must be some way to tell the Application to write 0xFF into the EEPROM, then reset the MCU. This will cause it to switch back to the Bootloader and wait for instructions.