Estoy trabajando en una biblioteca para STM32 para aprender el protocolo I2C (Software I2C, no hardware).
Conecto mi DS1307 (Sparkfun BOB-12708 ): ( Aquí está el esquema del módulo ):
- Eliminé la soldadura en el puente SJ2 para no usar las resistencias de extracción de módulo integrado 4.7K.
- Suministro de alimentación de 5v al módulo
- Mi placa STM32 ya tiene resistencias pullup de 4.7K a 3.3V
- Conecto el módulo SDA y SCL a mi STM32 3.3V GPIO con cables de 15 cm.
- Conecto mi osciloscopio de dos vías a SDA y SCL.
Puedo producir una buena señal SCL (100KHz) y SDA, excepto por la "CONDICIÓN DE INICIO" I2C, SDA tarda en caer, el borde descendente no es sencillo. Cuando aumente el tiempo en mi código, puedo obtener la dirección ACK del DS1307. Así que sospeché que los valores de las resistencias no serían apropiados.
Utilicé dos GPIO diferentes sin resistencias pullup y utilizo mis propias resistencias pullup 1K a 3.3V y esto funciona muy bien. La señal es buena. Puedo leer y escribir correctamente en el DS1307 y obtener la fecha / hora.
Así que desconecto mi osciloscopio, pero después de eso, no pude leer ni escribir en el dispositivo :(. La impedancia de mi osciloscopio es de 1M. Si dejo la resistencia de pullup de 1K a 3.3V Y pongo una resistencia de 1M a tierra este trabajo.
También trato con el convertidor de nivel lógico bidireccional (BOB-12009) y esto funciona bien, pero quiero usar DS1307 directamente sin convertidor.
- ¿Puede alguien ayudarme a comprender por qué necesito esta resistencia 1M?
- ¿Qué valor de resistencias pullup de 3.3V puedo usar para usar solo pullup?
Editar:
- La placa STM32 es una Olimex STM32F103STK
- La conexión a tierra se conecta entre STM32, DS1307 (y el osciloscopio cuando lo conecto)
Edit 2:
Mi cable tiene un conector de cable a tierra defectuoso, sustituyo el conector y ahora todo funciona bien con o sin osciloscopio y con resistencias pullup de 4.7K o 1K a 3.3V. Empíricamente, 2.2K parece ser una buena compensación entre los bordes de señal actuales y limpios.