Bueno, lo explico asi por encima, porque el codigo esta mezclado con el codigo general y seria dificil entenderlo sin entender el codigo anterior xD
Lo primero es la placa 1, esta conectada al pc por rs232 (uart), esta es la que se encarga de comunicar el soft del PC con la placa deseada de CAN mediante CAN.
El soft envia a la placa1 que quiere poner en modo bootloader a la placa 2 (uctrl), la placa 2 configura el CAN para solo aceptar (filtros) mensajes dedicados al bootloader, los demas mensajes los ignora, yo en mi caso identifico los mensajes segun placas para que al recibir el mensaje "modo bootloader" esta lo compara con el numero de placa, si es esta la coloca en modo bootloader, si no lo ignora.
Una vez la placa2 esta en modo bootloader, envia un mensaje (can) a la placa 1 para decir que se ha configurao y que ha aceptado el modo bootloader. La placa1 lo envia al PC.
Ahora llega el momento de enviar datos, lo primero decir que el soft se encarga de leer el .hex y pasarlo a almacenarlo en la ram del PC.
*El pc envia primero la direccion (ADDR) de la memoria que quiere modificar en el PIC, tambien el tamaño del buffer. Luego la placa1 lo envia a la placa2 (can). La placa2 responde como que ha recibido bien la ADDR.
*Ahora el pc envia el buffer a la placa1, esta la envia a la placa2 (can).
*La placa2 confirma que le han llegado todos los datos.
*El pc envia un dato para la verificacion.
*La placa2 le envia todo el buffer a la placa1, y la placa1 al pc. El soft del pc se encarga de verificar los datos que reciben son iguales a los que tiene en su buffer. Si todo esta correcto manda un dato para escribir los datos en la flash.
*La placa2 escribe los datos, y compara los datos escritos con el buffer, si todo esta ok envia ok, si no envia error.
Tanto en la verificacion como en la comparacion de datos, si los datos estan mal se vuelve a ir al paso de enviar la direccion.
Y asi constantemente hasta que se llega al final del .hex, los datos se envian de 64 en 64bytes, ya que mi pic acepta la escritura de sectores por 64bytes (otros aceptan solo 32bytes o menos, mirar datasheet).
Una vez llega al final, el pc envia un comando para resetear la placa2, esta se resetea, y a su vez la placa1 sale del modo programacion y sigue haciendo su trabajo con normalidad.