Actualmente estoy tratando de reutilizar algunos hw de un proyecto antiguo que tiene los CI correctos que necesito para un prototipo, pero el ingeniero que lo diseñó se fue, por lo que ahora estoy esencialmente en ingeniería inversa. ..
Estoy escribiendo código PIC24F desde cero, y puedo hacer funcionar el bus I2C (verificado con analizador lógico y de alcance) pero tengo un extraño comportamiento ACK / NACK de los otros circuitos integrados en la placa.
Tengo dispositivos en 0x68 y 0x40, y ambos ACK en una escritura de dirección inicial. Pensé que estaba ganando, hasta que probé otras direcciones ... y todas ACK también.
Si continúo intentando escribir en el bus después del primer ACK, todo lo que obtengo es NACK para los marcos de datos que escribo.
Mi pregunta es, ¿en qué situaciones se produciría esto? He estado depurando esto durante 2 días y un poco demacrado ahora.
Breve descripción de hw / sw -
- PIC24FJ256GB106
- DSP de Analog Devices
- Debería ser 400kHz I2C, con 2.2K pullups. Todos los voltajes de salida.
- Todos los trazados de inicio / parada / reinicio están bien. El autobús parece estar funcionando.
- La tasa de baudios en PIC parece estar bien. He recalculado de acuerdo a la hoja de datos.
- El rastreo del alcance analógico muestra 0v y 3.3v alcanzados, el analizador proporciona la lógica correcta para varias pruebas (utilizando el decodificador I2C)
- Utilizando Microchip PIC24 periph. biblioteca
- Direcciones de IC confirmadas, pero ninguna acepta marcos de datos, solo ACK inicial de la dirección del esclavo
Es bastante vago no proporcionar rastros, lo intentaré más adelante cuando vuelva a HW. Es exasperante ya que este HW definitivamente funciona y actualmente está en producción en serie, por lo que no puede ser un problema de hardware.
Editar: seguimiento agregado y hojas de datos vinculadas arriba
Seguimiento del alcance - (Rastreo analógico de SDA para referencia)
Parece que SDA está siendo liberado correctamente por el esclavo, pero estoy confundido en cuanto a lo que está bajando para ACK en otras direcciones. La traza del alcance muestra una escritura en 0x68 con 0x08 y luego 0x1C.
Recibo un ACK para la dirección, pero NACK para todos los demás, este es el mismo en todas las direcciones ...
Llamada de configuración de la biblioteca I2C -
c1 = (I2C_ON | I2C_GCALL_DIS | I2C_IDLE_STOP | I2C_IPMI_DIS | I2C_7BIT_ADD | I2C_SLW_DIS | I2C_STR_DIS);
c2 = 4.2; /* Baud rate */
OpenI2C2(c1,c2);
Todo lo demás se hace como muestra el ejemplo de Microchip en los documentos de xc16. Podría recurrir a portar un poco de i2c para asegurar que sus funciones no sean raras conmigo ... Sé que el viejo ingeniero usó algunas librerías de Renesas de otro proyecto, por eso lo estoy reescribiendo. p>