PIC32 I2C no funciona como se esperaba

5

Tengo problemas para que I2C se ejecute con un PIC32MX795F512L. No reconocía que el byte de dirección se enviaba, así que puse un analizador lógico en SDA y SCL y obtuve el rastreo que se muestra a continuación:

LasdosexcursionesenlalíneaSCLsonlasúnicasqueocurren.Asíquenoentiendoporquésolohaydos,enlugardeunoporbitmáslascondicionesdeinicioyfinalización.Obviamente,estaeslarazónporlaquenuncaveoningúnreconocimiento.

Además,SCLestábajotodoeltiempoantesdequecomienceestasecuencia,yesperabaquefueraaltayluegobajaraconSDAaltaparaindicarunacondicióndeinicio.HecomprobadoquetengopullupstantoenSCLcomoenSDA.

Elcódigoqueestoyusandoestásacadode código de ejemplo I2C de Microchip . Aquí está la parte relevante:

   // Start the transfer to write data to the EEPROM
    if( !StartTransfer(FALSE) )
    {
        while(1);
    }

    // Transmit all data
    Index = 0;
    while( Success && (Index < DataSz) )
    {
        // Transmit a byte
        if (TransmitOneByte(i2cData[Index]))
        {
            // Advance to the next byte
            Index++;

            // Verify that the byte was acknowledged
            if(!I2CByteWasAcknowledged(EEPROM_I2C_BUS))
            {
                DBPRINTF("Error: Sent byte was not acknowledged\n");
                Success = FALSE;
            }
            else
            {
                Success = TRUE; 
            }
        }
        else
        {
            Success = FALSE;
        }
    }

    // End the transfer (hang here if an error occured)
    StopTransfer();
    if(!Success)
    {
        while(1);
    }

Llega a la llamada I2CByteWasAcknowledged y falla. ¿Alguien tiene algún indicador sobre cómo obtener I2C en un PIC32 para que funcione con el código de la Biblioteca Periférica?

    
pregunta tcrosley

2 respuestas

1

El problema resultó ser un conector defectuoso en el analizador lógico. Es un LA de 34 canales, pero solíamos usar los primeros canales una y otra vez. Aparentemente, el conector hembra para la línea SCL, que acepta un pin como los de los encabezados de 0.1 ", se había vuelto inestable. Debería haberme dado cuenta de que tenía algo que ver con el LA cuando obtuve los mismos resultados con el Bit Whacker.

Observé las señales con un alcance, y tanto el SCL como el SDA eran altos cuando estaban inactivos, y cuando estaban bajos con el protocolo de inicio.

Escogí un conjunto diferente de canales en LA, reconfiguré el intérprete I2C para usar esos en lugar de los dos primeros canales y obtuve un protocolo I2C bien interpretado.

    
respondido por el tcrosley
0

Como mencionó, las líneas SCL y SDA deberían estar inactivas, por lo que definitivamente hay algo fundamentalmente incorrecto con el SCL. Como dijo un comentarista, también parece que se está produciendo una conversación cruzada ya que el aumento de la SDA hace que el SCL tenga un error.

  • ¿Estás seguro de que la línea SCL que has conectado es la que debería tener?
  • Verifique que esté utilizando la interfaz I2C correcta en la foto (I2C1 vs I2C2, etc.)
  • Verifique que está llamando a I2CSetFrequency e I2CEnable (y con la interfaz correcta)

He enumerado más información sobre I2C y problemas típicos en un artículo aparte: enlace

    
respondido por el Mikko Virkkilä

Lea otras preguntas en las etiquetas