Usando pull-ups internos para I2C en PIC18F

3

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

Utilicé 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 sólido 3.2v a través de ellos como I 2 C bus. Pero recientemente apareció un problema en mi tablero: un pin, SCL, muestra ~ 3.2V, mientras que SDA muestra 0.8V - I 2 C, entonces, ya no funcionó. Revisé de forma cruzada la configuración del pin de E / S y cuando habilité los pull-ups internos en el PORTB, el voltaje en SDA aumentó a 2.0v y 2 C funcionó bien con EEPROM.

  

De la hoja de datos:

     

RBPU: bit de habilitación de recuperación de PORTB

     

1 = Todas las extensiones de PORTB están deshabilitadas
  0 = Los pull-ups de PORTB están habilitados por valores de bloqueo de puerto individuales

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

Me gustaría conocer su opinión sobre este problema si ha contrarrestado alguna dificultad como esta anteriormente.

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

    
pregunta Rookie91

2 respuestas

5

No utilice dominadas internas para I 2 C. Utilice resistencias externas.
En otras palabras, es un error de diseño cuando intentas utilizar dominadas internas para I 2 C (prácticamente en cualquier microcontrolador).

La hoja de datos dice que la corriente de activación interna es de 50 μA mín y 400 μA máx. En primer lugar, observe la gran variabilidad de la corriente de 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.3V generaría una corriente de pull-up de 1.3mA.

Temas relacionados:
¿Qué sucede si omito las resistencias pullup en las líneas I2C? El OP estaba usando pull-ups internos sin saberlo. Los osciloscopios de iluminación trazan en ese hilo.
¿Hay un valor de resistencia correcto para las resistencias de pull-up I2C?

    
respondido por el Nick Alexeev
3

No estoy seguro de que estoy analizando tu pregunta correctamente, pero si funcionó con operaciones de extracción internas, pero no cuando se desactivaron las incorporaciones, y tienes 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, traza abierta, etc.

  2. Sus cambios de configuración afectaron inesperadamente a otra cosa.

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

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas