Uso de pull-ups internos para I2C en PIC18F

Estoy trabajando con un PIC18F46J53 y funcionó bastante bien sin ningún problema. De repente, encontré un obstáculo en mi camino.

Usé pines RB4 y RB5 como pines de bus I 2 C para comunicarme con una EEPROM (24LC256). Y detuve las líneas de autobús usando 10k externos tanto en SDA como en SCL.

Cada vez que inicializo los pines RB4 y RB5 de TRISB como entradas, aparecerá un 3.2v sólido a través de ellos como bus I 2 C. Pero recientemente apareció un problema en mi placa: un pin, SCL, muestra ~ 3.2V mientras que SDA muestra 0.8V - I 2 C, luego ya no funcionó. Verifiqué la configuración de pines de E/S y cuando habilité los pull-ups internos en el PORTB, el voltaje en SDA aumentó a 2.0v y I 2 C funcionó bien con EEPROM.

De la hoja de datos:

RBPU: bit de habilitación de pull-up PORTB

1 = Todos los pull-ups de PORTB están deshabilitados
0 = Los pull-ups de PORTB están habilitados por valores individuales de pestillo de puerto

Para solucionar el problema, confío en que ambos pines SDA y SCL deben tener 2.8-3.2 V en el bus cuando se configuran como entrada. Pero parece estar funcionando con 2.0V en el pin SDA y 2.9V en SCL.

Me gustaría conocer sus aportes a este problema si ha enfrentado alguna dificultad como esta antes.

¿Dónde debo buscar para solucionar el problema? Está funcionando por ahora, pero confío en que me habría perdido algo en cualquier caso. ¿Cuándo y cómo se deben usar los pull-ups? He usado tanto externo como interno en este caso para que I 2 C funcione. ¿Cual es la mejor manera de hacerlo?

Respuestas (2)

No use pull-ups internos para I 2 C. Use resistencias externas.
En otras palabras, es un error de diseño cuando intenta usar pull-ups internos para I 2 C (prácticamente en cualquier microcontrolador).

La hoja de datos dice que la corriente pull-up interna es de 50 μA min y 400 μA max. Primero, mire la enorme variabilidad de la corriente pull-up. En segundo lugar, incluso 400 μA es demasiado débil para I 2 C. Incluso una resistencia de 2,5 kΩ con Vcc=3,3 V generaría una corriente de arranque de 1,3 mA.

Hilos relacionados:
¿Qué sucede si omito las resistencias pullup en las líneas I2C? El OP estaba usando pull-ups internos sin saberlo. Iluminando parcelas de osciloscopio en ese hilo.
¿Hay un valor de resistencia correcto para las resistencias pull-up I2C?

Gracias. He entendido lo que dijiste nick. Nunca antes usé pull up interno, pero ahora el pin sda muestra solo .8v cuando el pull up interno está deshabilitado, pero los pines SCL muestran 3.2 v. ¿No es ese comportamiento anómalo? Tengo de hecho usé resistencias pullup en mi nick de placa
@ Rookie91 Si ha usado pullups en su tablero, los pullups internos no deberían estar habilitados
@ScottSeidman Muchas gracias, scott, por tu tiempo. Lo comprobaré y te responderé.

No estoy seguro de estar analizando su pregunta correctamente, pero si funcionó con pull-ops internos pero no cuando los pull-ups estaban deshabilitados, y tiene resistencias externas de 1K, tendría que pensar que solo podría haber dos explicaciones:

  1. El pull-up SDA está roto: mal soldado, agrietado, rastro abierto, etc.

  2. Sus cambios de configuración afectaron inesperadamente algo más.

Si mide la corriente de arranque, debería poder distinguir cuál es. Le sugerimos que siempre apague los pull-ups internos para evitar la situación de 'casi funciona', 'casi no funciona'

Muchas gracias. Tendré que verificar si algo está roto y me pondré en contacto con usted. Pero, ¿cómo afectarán los bits de configuración al pullup? Me aclararán si obtengo información sobre eso :). Nuevamente, muchas gracias por su tiempo.