Tengo un comportamiento extraño con la biblioteca Wire de Energia, así que pensé que intentaría hacerlo yo mismo.
Estoy escribiendo mi propia implementación (bit-bang) si i2c y lo mantengo bastante simple. Por ahora, solo quiero detectar un dispositivo i2c en particular. Aquí está mi algoritmo básico.
- Comience el mensaje conduciendo SDA de alto a bajo, mientras que SCL se mantiene alto.
- Envíe la dirección de 7 bits un bit a la vez llevando el SDA a alto o bajo, mientras que SCL es bajo y luego cambie SCL a alto para que el dispositivo esclavo lea cada bit.
- Envía 1 bit de escritura o lectura.
- Recibe Ack del esclavo.
- Termine el mensaje llevando el SDA de bajo a alto, mientras que SCL se mantiene alto.
Sé que lo anterior puede estar un poco simplificado, pero solo quería poner las cosas en contexto. Tengo problemas con el paso 4 y conozco el momento concreto en el momento de liberar y recuperar el control de la línea SDA durante un Ack.
Entonces, después de que el último bit de lectura / escritura se haya configurado en SDA y el SCL esté en ALTO, necesito saber cuál es el orden de las operaciones para obtener un Ack del esclavo.
He intentado todas las combinaciones que se me ocurren, pero no parece funcionar correctamente. Parece que debería hacer lo siguiente:
setMode(SDA, INPUT); //Release the SDA line to the slave device
digitalWrite(SCL,LOW); //Pulse the SCL line
digitalWrite(SCL,HIGH);
int ack = digitalRead(SDA) == LOW; //Read from the SDA line
setMode(SDA, OUTPUT); //Seize control of the SDA line
La secuencia anterior no parece estar funcionando. Mi analizador digital no reconoce mis comunicaciones como debería.
Cualquier corrección en mis suposiciones o ajustes al código anterior sería de gran ayuda.
Para mayor aclaración:
Estoy usando un entorno de desarrollo llamado 'Energia'. Es una bifurcación de Arduino y se utiliza para "simplificar" el proceso de programación de los procesadores TI MSP430x. De todos modos, parece que no tiene ningún concepto de modo 'OpenCollector'.
Es Input, Output o Input_Pullup. Me pregunto si Input_Pullup no es su versión del modo OpenCollector. Intentaré eso. Aquí hay una interesante discusión de Input, Output, Input_Pullup: