.
Guíate por las rutinas de la librería que te he indicado, o directamente usa esa rutina, y no te compliques la vida. Además el ejemplo del manual está mal calculado, en los foros del producto los propios creadores reconocen las erratas del manual, pero confirman que las rutinas funcionan.
Si buscas por internet, te volverás mico, porque cada persona lo interpreta como le da la gana, y lo calcula de las formas más variopintas, yo he leído algunos de esos post, y no entiendo ni PAPA de como lo están calculando. Más bien parece que cada uno lo acomoda a su gusto o para que el resultado cuadre con lo esperado aunque no tengan ni idea de porque lo hacen así (es lo que parece).
A ver, rutina 1 del cálculo del checksum, esta no tiene ningún misterio, suma los elementos 1 a 6 y el resultado lo multiplica por -1.
//calc checksum (1~6 byte)
uint16_t mp3_get_checksum (uint8_t *thebuf) {
uint16_t sum = 0;
for (int i=1; i<7; i++) {
sum += thebuf[i];
}
return -sum;
}
Rutina 2 (y 3), la madre del cordero, el byte 1 del checksum, lo sacan desplazando 8 bits a la derecha el cálculo anterior.
*thebuf = (uint8_t)(data>>8 );
Y el segundo byte es el mismo checksum calculado en la rutina anterior, sin ninguna otra alteración.
*(thebuf+1) = (uint8_t)data;
¿ Porque lo hacen así ?, ni puñetera idea, ni se explica así ni de ninguna manera en el manual (castaña de manual, pésimo, para hacer fuego en invierno).
//fill checksum to send_buf (7~8 byte)
void mp3_fill_checksum () {
uint16_t checksum = mp3_get_checksum (send_buf);
fill_uint16_bigend (send_buf+7, checksum);
}
//
static void fill_uint16_bigend (uint8_t *thebuf, uint16_t data) {
*thebuf = (uint8_t)(data>>8);
*(thebuf+1) = (uint8_t)data;
}
Yo tengo un lema en la vida, "TODO, absolutamente TODO (sin excepción), es MUY sencillo, cuando se explica correctamente y con intención de que sea entendido", de lo contrario o está mal documentado o mal explicado.
Esto del cálculo del checksum para este producto, es el típico ejemplo de como marear al usuario para que no entienda nada, no documentándolo, como dios manda, en el manual del producto. Resumiendo, usa esas rutinas en tu código y no te calientes la cabeza, meter eso en un PIC no tiene mayor complicación.