Strange I2C Behavior

3

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>     

pregunta njt

1 respuesta

2

A mí me parece que estás diciendo los términos que necesitas para ser AND. I2C_ON es 0xFFFF, por lo que el registro será de todos 1.

Eche un vistazo al archivo i2c.h para PIC24:

#define I2C_ON                      0xFFFF /*I2C module enabled */

No importa qué otra cosa coloque en la palabra de configuración, todas van a ser 1. Muchas de las configuraciones que necesita (cancelación general, dirección de 7 bits, etc.) necesitan que sus bits correspondientes sean cero.

Así es como inicio el periférico I2C en un dsPIC33 (esencialmente el mismo periférico y la misma biblioteca de llamadas):

OpenI2C1(I2C1_ON & I2C1_IDLE_CON & I2C1_7BIT_ADD & I2C1_STR_EN & I2C1_SLW_DIS & I2C1_GCALL_DIS & I2C1_SM_EN & I2C1_IPMI_DIS, clk);

También tenga en cuenta que el argumento del reloj debe estar sin signo int, no 4.2 :)

(En caso de duda, no utilice la llamada de la biblioteca y configure manualmente los bits SFR.)

    
respondido por el Adam Lawrence

Lea otras preguntas en las etiquetas