Tengo un circuito simple donde bitbang I2C (SCL / SDA es GP5 / GP4) en una foto 12F629. Funciona perfectamente, todos los tiempos son correctos, no hay errores, etc. El esquema exacto es irrelevante porque deconstruí todo el circuito en bloques básicos y probé cada parte por separado para asegurar que el esclavo no tiene la culpa.
Tenga en cuenta que probé con diferentes chips y diferentes modelos y el problema persiste.
Ahora quiero conducir un pin aleatorio, digamos GP2 bajo. En el momento en que hago esto, la forma de onda I2C se vuelve loca. Aquí está la forma de onda después de bajar GP2 (SDA azul, SCL amarillo):
Después de algunos experimentos, aquí están mis conclusiones:
En I2C, los dispositivos solo pueden arrastrar o soltar SDA / SCL (en cuyo caso son arrastrados por las extensiones). Así que para designar ALTO configuramos el pin SDA o SCL en entrada y, por lo tanto, se libera y se eleva a + 5 V, y para designar BAJO, lo configuramos en salida y se maneja BAJO. Por supuesto, para que los niveles de SDA / SCL sean bajos al configurarlos para la salida, durante la inicialización del programa, estos dos pines se configuran primero en salida y se les asigna el valor BAJO, por lo que cada vez que cambian de entradas a salidas durante las comunicaciones i2c conducir automáticamente bajo.
Y la última parte es donde creo que se rompe todo.
Si después de algún punto, después de una comunicación i2c, conduzco un pin GPIO, por ejemplo. GP2 LOW o HIGH, esto afecta de alguna manera al valor GPIO de los OTROS pines gpio (es decir, SCL / SDA) que desordena todo. es decir. Los pines GPIO SDA / SCL se configuran en 1, por lo que cuando se cambian de entrada a salida durante las comunicaciones i2c, obtienen el valor 1 en lugar de 0 y, por lo tanto, en lugar de conducir el bus i2c BAJO, lo manejan en ALTO, lo que no está permitido . Y ahora la única manera de hacerlo funcionar de nuevo es: 1. Establezca la dirección SDA / SCL en TRISIO en SALIDA 2. Establezca el valor SDA / SCL en GPIO en 0 3. Vuelva a establecer la dirección SDA / SCL en la entrada para liberar el bus y dejar que se levante por los pullups.
Y ahora estamos listos para reanudar las comunicaciones. Hasta que saque otro GPIO alto o bajo, por supuesto, donde todo se atornilla nuevamente.
Ahora mi pregunta es esta: ¿Cómo se podría arreglar esto? ¿Podría ser esto un problema de lectura-modificación-escritura? Pensé que esto sería un problema común, estaba seguro de que habría mucha gente que utilizara i2c y un gpio pin a la vez y los interceptaría entre ellos, pero mis búsquedas no arrojaron resultados.
Tenga en cuenta que no hay nada conectado a la unidad de usuario que no sea el osciloscopio. Eliminé todo uno por uno para encontrar el problema y el problema aún persiste.