2 votos

¿Por qué mi escritura I2C recibe un NAK?

Estoy tratando de conectarme a un dispositivo existente, para el cual no tengo documentación. El dispositivo expone una I de 5v 2 C con varios IC's en el bus. He utilizado un analizador lógico para capturar el tráfico, y no entiendo por qué mis escrituras no son aceptadas.

Sistema de trabajo:

Unknown microcontroller  ==| connector |==+== PIC 12F509 with internal oscillator
                                          |== 24C16WI 2k EEPROM
                                          \== Logic analyzer

La primera comunicación con el dispositivo es enviar una petición de escritura a la dirección 0x49, pero cuando intento hacer lo mismo, no recibo respuesta. Hay evidentes diferencias de tiempo en mi petición frente a la suya, pero no estoy seguro de que sean significativas. La comunicación con el 24C16WI es exitosa, pero no puedo obtener respuesta del PIC.

Solicitud de trabajo (tasa de baudios 36kHz) ( Captura de Saleae ): I2C communication from working system

Mi solicitud (tasa de baudios 31kHz) ( Captura de Saleae ): My request

Suponiendo que la diferencia no dependa de una señal distinta de la I 2 C, ¿son significativas las diferencias de tiempo en la señal? Si son significativas, ¿cómo puedo generar la temporización requerida utilizando un Atmel SAMD21J18?

¿Qué me falta?

1voto

Link Puntos 148

Resumen: Sospecho que el nuevo I 2 C no se acerca lo suficiente al original, y al menos un I 2 La secuencia C se muestra en el "trazado de trabajo", que puede ser difícil de reproducir para usted.

Detalles:

Suponiendo que la diferencia no dependa de una señal distinta de la I 2 Líneas C [...]
¿Qué me falta?

Las capturas del analizador lógico son muy útiles, gracias. Junto con la otra información, creo que tenemos un buen "sospechoso".

Hay diferencias obvias de tiempo en mi solicitud frente a la de ellos, pero no estoy seguro de que sean significativas.

Apuesto a que las diferencias de tiempo son significativo, sobre todo porque:

La comunicación con el 24C16WI es exitosa

Así que usando su propia I 2 C Master, puede comunicarse con el estándar I 2 C (esa EEPROM). Como has dicho, el problema es intentar obtener una respuesta del PIC, y como has señalado en un comentario posterior, ese PIC no tiene un módulo I2C incorporado:

He leído la hoja de datos del dispositivo esclavo (PIC12F509) pero no he visto una implementación de hardware I2C. Sólo puedo suponer que están golpeando bits.

Sí, he visto otros dispositivos PIC (sin I 2 C) programado como I 2 C, que tenían importantes restricciones de tiempo en su I 2 Comportamiento C.

Observo que hay un mayor retraso en la secuencia de inicio

Exactamente. No he medido con el software Saleae, pero "a ojo" hay aproximadamente 0,8 ms de retardo entre la I 2 C y la primera conmutación de la señal SCL en el trabajando rastro, y no hay tal retraso en el fallando rastro.

Ese retraso no es típico I 2 C, pero sospecho que es necesario para que el firmware del PIC (desconocido) reconozca la I 2 C (por ejemplo, tal vez tenga que despertarse del sueño, utilizando la función "wake on change" del PIC GPIO, cuando la señal SDA cambia como parte de la I 2 C Condición de inicio).

Si yo estuviera en su situación, empezaría con una hipótesis que todo del original I 2 La sincronización de C es importante (no sólo la velocidad del reloj SCL, donde ya es similar a la velocidad original) y tratar de duplicar la sincronización original y el comportamiento completamente . Después de todo, esa secuencia original funciona :-)

Hay otras partes inusuales en el "trabajo" que 2 Transacción C:

  • En el byte de dirección, parece haber un pequeño retraso entre el reloj para el bit 8 y el reloj para el (9º) bit ACK/NACK. De nuevo, ese retardo (que no existe en tu traza "fallida") podría ser requerido por el firmware del PIC.

  • En el siguiente byte, veo sólo 8 pulsos de reloj y no los 9 pulsos esperados, lo que explica el comentario del software Saleae sobre "Missing ACK/NACK". De nuevo, este (anormal) I 2 C para que coincida con las expectativas del firmware del PIC, pero es probable que sea difícil o imposible de reproducir, utilizando la I 2 Código de controlador / biblioteca C, ya que esto normalmente generaría los 9 pulsos de reloj normales.

No estoy seguro de cómo producir eso con el controlador ASF I2C de Atmel.

No he utilizado ese controlador. Puedes investigar si puedes insertar un retardo después de enviar la I 2 C Condición de inicio, antes de enviar la dirección del dispositivo. Esto es independiente del pulso de reloj "Missing ACK/NACK" (que puede tiene que faltar!) cuando el Maestro transmitió el segundo byte en la "traza de trabajo".

Por lo tanto, es posible que no puedas utilizar ese controlador "tal cual", y en su lugar tengas que escribir tu propio código de bajo nivel ("controlador"), que te da más control. Si todo lo demás falla para darle la cantidad necesaria de control de temporización y pulso de reloj, puede que tenga que hacer un bit-bang en las señales SDA y SCL del Maestro para algunas o todas las señales I 2 Secuencias del protocolo C que necesitas.

0voto

Kevin White Puntos 5504

¿Por qué utiliza la dirección 0X49?

Encontré estos datos en el 24C16 lo que implica que la dirección base es 0x50. Ten cuidado con la representación de 7 u 8 bits de la dirección.

El tiempo de la "solicitud de trabajo" parece malo. Necesitas tener un tiempo de configuración por delante del flanco positivo del reloj.

Su solicitud está mejor formada pero tiene la dirección equivocada.

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X