PIC24f: ¿Cómo generar la condición de inicio usando SPI para el dispositivo I2C?

0

Estoy tratando de comunicarme con el dispositivo que tiene comunicación interna como I2C, mientras que externamente tiene dos pines diferentes para Entrada y amp; Salida junto con un pin separado para el reloj. Aquí está el link .

Estoy usando SPI para comunicarme con este dispositivo. Pero no puedo generar la condición START / STOP para comunicarme con el dispositivo I2C.

¿Puedo obtener alguna sugerencia para superar este problema?

Estoy usando la codificación C

Intenté golpear los bits como sigue

No sé si hay algún error lógico.

Aquí está la condición de inicio que estoy intentando implementar:

bool generateStartSeq()
{
    SPI1STATbits.SPIEN      = 0;    // disable SPI port
//    SPI1CON1bits.DISSCK       = 1;    // Internal SPIx clock is enabled
//    SPI1STATbits.SPIEN        = 1;    // enable SPI port, clear status

    AD1PCFG = 0xFFFF;               // Convert IO pin to Digital
    TRISFbits.TRISF6 = 0;           // Configure RF6 pin as output;
    TRISFbits.TRISF8 = 0;           // Configure RF8 pin as output;

    LATFbits.LATF6 = 1;             // Make RF6 pin high

    LATFbits.LATF8 = 1;

    Nop;
    Nop;
    Nop;
    Nop;
    Nop;

    LATFbits.LATF8 = 0;

    //    writeSPI1(0xFF);                // SDO send data High
    //    
    //    Nop;
    //    Nop;
    //    Nop;
    //    Nop;
    //    Nop;
    //    
    //    writeSPI1(0x00);

    SPI1Init();

    return true;

}

Cualquier sugerencia realmente me ayudará a corregir la lógica.

    
pregunta skg

1 respuesta

1

DESCARGO DE RESPONSABILIDAD: los voltajes involucrados pueden dañar fácilmente su PIC, su programador y su hardware USB. Si utiliza este diseño, lo hace bajo su propio riesgo y no soy responsable de ningún daño que pueda surgir.

En lugar de intentar encontrar una solución de software, recomendaría una solución de hardware muy simple que le permitiría utilizar el controlador I2C de serie en el PIC. Tenga en cuenta que, al igual que con su solución de software, probablemente necesite un cambiador de nivel para elevar la salida de su imagen a los niveles lógicos de 0-24 V del módulo, pero con esta solución no necesita un cambiador de nivel para colocar la salida del módulo a su rango de imagen (debido a el diodo de bloqueo).

simular este circuito : esquema creado usando CircuitLab

El diodo puede ser cualquier diodo de bloqueo con Vfwd suficientemente bajo (por eso recomiendo un diodo de disparo) y un voltaje de bloqueo alto (> 30 V). La serie BAT41 parece ser un buen ajuste según sus especificaciones (exención de responsabilidad, nunca la he usado en esta aplicación).

Esto funciona porque I2C es una comunicación digital de colector abierto. Es decir, cualquier IC en el bus I2C solo lo bajará a un nivel bajo, el bus regresa a un nivel alto debido a la resistencia que lo lleva a Vdd. Por lo tanto, si el HM DATA OUT baja, saca el SDAx bajo, pero cuando está alto, el PIC es libre de dejarlo alto o de bajarlo solo.

Si necesita implementar su propio hardware de cambio de nivel, le recomendaría un simple cambio de nivel basado en FET. Aunque tenga cuidado, el FET debe montarse en la dirección correcta. Si invierte la dirección, su imagen se expondrá a 24 V a través de su diodo corporal y es probable que (su PIC) no sobreviva.

simular este circuito

    
respondido por el Mathieu L.

Lea otras preguntas en las etiquetas