Gracias por el código. Parece que estás en el camino correcto en su mayor parte.
Después de cada comando, estás esperando un ACK al mirar el bit I2C1STATbits.ACKSTAT para bajar. Sin embargo, este bit indica si se recibió un ACK o un NACK, y usted también debe saberlo.
Así que creo que es mejor usar la llamada IdleI2C1 () después de enviarla al sensor, por ejemplo:
MasterWriteI2C1(0xF5);
IdleI2C1();
(aquí es donde envía el comando de la Tabla 9). Luego puede verificar el bit ACKSTAT para ver si se recibió un ACK o NACK.
Después de enviar el comando, en el modo No Hold Msteer para este chip, debes poder detectar la respuesta NACK y hacer un bucle hasta que obtengas un ACK. Así que, en lugar de enviar solo los dos comandos de lectura con la dirección 0x81 mientras lo hace, debe hacer algo como esto:
while (1)
{
StartI2C1();
MasterWriteI2C1(0x81);
IdleI2C1();
if (I2C1STATbits.ACKSTAT == 0)
{
break;
}
}
Siempre y cuando obtengas un NACK (I2C1STAT bits.ACKSTAT == 1), entonces giras y lo intentas de nuevo. En su lugar, si obtienes un ACK, puedes leer los dos bytes de datos más la suma de comprobación como ya lo estás haciendo.
Es probable que desees agregar algún tipo de contador para que no realices un bucle para siempre en caso de que nunca recibas un ACK por alguna razón.