Tengo una simple circuito donde no bitbang I2C (SCL/SDA es GP5/GP4) en un pic 12F629. Funciona perfectamente, todos los tiempos son correctos, no hay errores, etc. La exacta esquemático es irrelevante, porque yo la deconstrucción de todo el circuito de bloques básicos y probado cada parte por separado para asegurarse de que el esclavo no tiene la culpa.
Nota que he probado con diferentes chips y los diferentes modelos y el problema persiste.
Ahora me quiero llevar un pin aleatorio, decir GP2 baja. En el momento en que hago esto, el I2C de la forma de onda se vuelve loco. Aquí está la forma de onda después de tirar de la GP2 baja (SDA azul, SCL amarillo):
Después de algunos experimentos, aquí están mis conclusiones:
En I2C los dispositivos sólo son permitidos tire hacia abajo o de liberación de la SDA/SCL (en cuyo caso son sacados de pull-ups). Así, en orden a designar ALTA establecemos SCL SDA o pin de entrada y por lo tanto se libera y se detuvo a +5V, y para designar BAJA, se establece que la salida y es conducido BAJO. Por supuesto, para la unidad SDA/SCL baja cuando la configuración de la salida, durante la inicialización del programa tanto estos pines son el primer conjunto de salida y dado el valor BAJA, por lo que ahora cada vez que se activan a partir de las entradas en salidas durante el i2c de comunicaciones que se dirigen automáticamente de BAJA.
Y esa última parte es donde yo pienso que todo se rompe.
Si después de un cierto punto, después de una comunicación i2c, yo conduzco un pin GPIO por ejemplo. GP2 BAJA o ALTA, esto de alguna manera afecta el GPIO valor de los OTROS pines gpio (es decir, SCL/SDA), que se mete de todo. es decir. SDA/SCL pines GPIO se establece en 1, así que cuando se cambia de la entrada a la salida durante el i2c comms, que toma el valor 1 en lugar de 0 y por lo tanto en lugar de conducir el bus i2c BAJA que la unidad es ALTO, lo que no está permitido. Y ahora la única manera de hacer que funcione de nuevo es: 1. Conjunto de SDA/SCL dirección en TRISIO a la SALIDA 2. Conjunto de SDA/SCL valor en GPIO 0 3. Conjunto de SDA/SCL dirección de regreso a la entrada para liberar el bus y se deja tirado por la pullups.
Y ahora estamos listos para reanudar la comunicacón. Hasta que me tire otro GPIO de alta o de baja del curso donde todo es jodido de nuevo.
Ahora mi pregunta es esta: ¿Cómo se podría ir sobre la fijación de este? Este podría ser un leer-modificar-escribir problema? Pensé que esto sería un problema común, yo estaba seguro de que habría un montón de personas que utilizan i2c y un pin gpio a la vez y tienen ellos interefere el uno con el otro, pero mis búsquedas no devuelve resultados.
Mantenga en mente que no hay nada conectado a la uC, pero el osciloscopio. He quitado todo lo que uno por uno para encontrar el problema y el problema aún persiste.