Lamento desilusionarte Killejc, el SPI son 4 señales, y la version mas facil es 3 señales, no dos, pero como este equipo usa la lectura y la escritura tendria que usar tres señales como minimo.
https://es.wikipedia.org/wiki/Serial_Peripheral_Interface
El tema es a que es mas parecido ( la forma de señal, la comunicacion) , no la cantidad de señales a enviar. Y es ahí donde difiero.
Si, SPI son 4 las señales que vos decis ( CLK, MISO, MOSI, CS ), la version que le sigue serian únicamente 3 ( CLK, MISO, MOSI ), pero podes omitir una mas,en este caso vos nunca vas a enviar ningún dato al ADC, siempre vas a recibir, por lo tanto podes "omitir" el MOSI, quedandote MISO y CLK que es lo que necesitas, y sigo poder usandolo como SPI. Pero esto no es lo que afecta.
El problema viene en como obtener los datos, y acá es donde realmente considero que es mas parecido al SPI que el I2C.
Los datos son 24 pulsos de reloj en los cuales en cada pulso hay un dato, distinto de un I2C que tenes START, STOP, ACK, NACK luego de 8 bits estos 2 ultimos, y direcciones.
Si suponemos que el pulso en bajo es el START, el STOP jamas llegaria y los ACK/NACK estarian entre medios de los datos. Otro tema es que el que envia el START es el maestro, pero en tu ADC si lo consideras maestro (SDA ponerlo en bajo y mantener SCL en alto) el deberia ser quien da los pulsos de CLK, lo cual no es asi.
https://cdn.sparkfun.com/assets/6/4/7/1/e/51ae0000ce395f645d000000.pngSi yo envio un pulso de CLK, y tomo un bit de alli, y asi 24 veces, termina pareciendose mas a un SPI que un I2C, las variaciones estan que:
Y aca la propuesta de usar los 2 metodos:
SPI:
- Necesito detectar cuando el ADC termino de convertir ( que se pone a 0 la linea de datos ) para saber cuando leer.
- Uso el modulo SPI para leer 3 bytes (si una señal o un pin lo desperdicio )
- Necesito enviar de 1 a 3 ciclos mas para definir la ganancia de la proxima conversion. Luego de leer los datos obviamente.
I2C:
Imposible de usarlo. El que el esclavo te mantenga a 0 la linea de datos a 0 implica que hay algun problema. Suponiendo que esto no afecte. Y comienze la transferencia:
- El primer dato tengo que tomar y son 9 ciclos de reloj, tomar el dato y el valor del ACK
- El segundo dato lo tomo y el ACK/NACK, otros 9 ciclos de reloj.
- ¿Como haces para enviar unicamente entre 6 (para los 24 ) a 9 (para los 27) ciclos? Podria hacer los 6 siguientes por software. Y enviar los demas tambien por software.
Se observa que es mucho mas complejo de lo que seria usando el modulo como SPI.
PD: No hay tampoco definicion clara si la salida es open-drain o no. Pero lo que parece segun el esquema que faciilita, es una salida push-pull, el cual I2C es open-drain.
Por estas razones considere usar el SPI, obviamente se puede hacer por software como lo hizo. Y el problema que tiene es que esta leyendo cualquier cosa
y no esto jeje.