Tengo un dispositivo Slave en cuyo datasheet me ponen este diagrama de timming:
Y el datasheet del PIC32MX me pone este diagrama de modos:
Observando ambos, necesito que el clock esté siempre a nivel alto y que se ponga a cero cuando comience una transferencia, por lo tanto CKP = 1.
El flanco donde los datos tienen que ser leidos es en el de subida, por lo tanto deduzco que CKE = 1.
Por ultimo, el dato es sampleado a mitad del mismo por lo que deduzco que SMP = 1.
Pues bien. Con esta configuración, si yo envío un comando al slave, éste lo recibe y responde (lo veo en el osciloscopio).
Pero al leer el buffer de esta transferencia solo me lo da bien cada 15 intentos aproximados, a veces algo mas, a veces algo menos. Lo que hago es meter dentro de un while las siguientes acciones:
- Envío byte 0b11000000 (esto significaría para el slave "Dame tu status").
- Hago lectura para vaciar el buffer.
- Envío 0x00 para que el slave reciba sus 8 clock y así me envíe su respuesta.
- Leo la respuesta.
- Imprimo la respuesta en el terminal usart.
Fin del while.
La respuesta que espero recibir del slave sería 0x04.
Pues bien, la recibo bien una vez de cada 15 o 16 intentos, el resto de las veces recibo 0xFF
Ahora viene lo bueno. A prueba y error (me da coraje trabajar así pero es que ya no sabía por donde meterle mano), cambiando CKP,CKE Y SMT he conseguido una respuesta siempre valida en todos los intentos, es decir, que funcione a la perfección. Para eso he tenido que poner CKE = 1; CKP = 0; Y SMP = 1;
Así funciona perfecto.
Pero entonces NO es lo que figura en los diagramas o yo no lo estoy interpretando bien del todo..
Por eso lo pregunto. Me gustaría poder comprender por qué con al configuración que yo "CREO" correcta observando los diagramas NO funciona y sin embargo con otra obtenida a base de prueba y error he conseguido que funcione con una combinación que, volviendo a mirar los diagramas NO debería de funcionar.......
Ay dios, que sencillamente complejo es todo esto...