I2CBusManager, Gestione periferiche su bus I2C

  1. Home
  2. Knowledge Base
  3. Manualistica
  4. Programmazione IEC 61131-3
  5. Libreria dispositivi I2C
  6. I2CBusManager, Gestione periferiche su bus I2C

Questo blocco funzione gestisce periferiche con interfaccia su bus I2C, in base alla definizione di I2CMode è possibile selezionare il bus da utilizzare.

Attivando Check viene verificata la presenza dispositivo I2C indirizzato in I2CAddress sul bus. Se presente sul Done sarà attivo anche Ok.

Attivando RRCmd se WrBytes e WrBuffer sono definiti, viene eseguita la scrittura di WrBytes bytes dal buffer indirizzato da WrBuffer sul dispositivo I2C indirizzato in I2CAddress. Terminata la scrittura se RdBytes e RdBuffer sono definiti viene eseguita la lettura di RdBytes bytes dal dispositivo I2C indirizzato in I2CAddress nel buffer indirizzato da RdBuffer.

Se I2CMode=1 sugli ingressi IClock ed IData vanno connessi i relativi segnali di ingresso, e sulle uscite OClock ed OData i relativi segnali di uscita del bus I2C.

Function block
CODESYS: Non disponibile
LogicLab: eLLabI2CDevsLib

Start (BOOL) Comando esecuzione gestione. Se non sono definiti i parametri di scrittura e lettura viene eseguito il solo controllo se il dispositivo è connesso al bus.

IClock (BOOL) Collegare il segnale hardware di lettura Clock da bus I2C. Se non è necessario gestire lo stretching si può lasciare scollegato. Si utilizza solo se I2CMode<>0.

IData (BOOL) Collegare il segnale hardware di lettura Data da bus I2C. Si utilizza solo se I2CMode<>0.

I2CMode (DINT) Definisce il modo di gestione del bus I2C.
0:Viene utilizzato il bus di espansione del sistema gestito in hardware.
1:Si utilizza un bus simulato su I/O discreti. La gestione dei segnali Clock e Data del bus è eseguita interamente da software permettendo di utilizzare qualsiasi I/O discreto, occorre appoggiare i segnali sui rispettivi I/O.

BFrequency (REAL) Frequenza di Clock bus I2C (Hz). Se I2CMode:=0 il parametro non è utilizzato la frequenza è definita dal sistema.

I2CAddress (USINT) Indirizzo dispositivo I2C range da 16#00 a 16#7F.

WrBytes (UDINT) Numero di bytes dati da scrivere. 0 se solo lettura.

WrBuffer (@BYTE) Indirizzo buffer memoria che contiene i dati da scrivere, NULL se solo lettura.

RdBytes (UDINT) Numero di bytes dati da leggere. 0 se solo scrittura.

RdBuffer (@BYTE) Indirizzo buffer memorizzazione dati letti, NULL se solo scrittura.

Done (BOOL) Si attiva per un loop al termine dell'esecuzione comando.

Ok (BOOL) Si attiva per un loop contemporaneamente al Done se il comando terminato correttamente.

OClock (BOOL) Occorre collegare il segnale hardware di gestione Clock su bus I2C. Si utilizza solo se I2CMode<>0.

OData (BOOL) Occorre collegare il segnale hardware di gestione Data su bus I2C. Si utilizza solo se I2CMode<>0.

Esempi

Come utilizzare gli esempi.
Negli esempi vengono utilizzati gli I/O digitali del modulo CPU per gestire un bus I2C software, in questo modo il bus è completamente isolato dal sistema. Di fianco lo schema di cablaggio utilizzato, la tensione di alimentazione del bus +5Vcc deve essere fornita da un alimentatore esterno.

ST_I2CBusManager: Viene eseguita l'acquisizione del valore di temperatura e di umidità da un sensore SHT30-DIS della Sensirion utilizzando gli I/O del modulo CPU per gestire il bus. Non viene eseguito il controllo sul CRC dei valori acquisisti.

ST_ScanI2CDevices: Collegandosi in telnet alla porta indicata viene eseguito la scansione di tutti i possibili indirizzi I2C e ritornato l'elenco dei dispositivi connessi al bus.

I2CBusOnIOs
LogicLab (Ptp176)
PROGRAM ST_I2CBusManager
VAR
    CaseNr : USINT; (* Program case *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    DInp : SysGetPhrDI; (* Digital input acquisistion *)
    DOut : SysSetPhrDO; (* Digital output management *)
    I2CBus : I2CBusManager; (* I2C bus management *)
    I2CWrite : ARRAY[0..1] OF BYTE; (* I2C write buffer *)
    I2CRead : ARRAY[0..5] OF BYTE; (* I2C read buffer *)
    Errors : UDINT; (* Error counter *)
    Temperature : REAL; (* Temperature value (°C) *)
    Humidity : REAL; (* Humidity value (%) *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_I2CBusManager"
// *****************************************************************************
// Temperature and humidity acquisition from a Sensirion SHT30-DIS connected
// to a I2C bus emulated by logic I/Os
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // First program loop initialization.

    IF (SysFirstLoop) THEN

        // Initialize the logic I/O management.

        DInp.Address:=255; (* Module address *)
        DInp.Mode:=DI_I_8_LL; (* Input mode *)

        DOut.Address:=255; (* Module address *)
        DOut.Mode:=DO_8_LL; (* Output mode *)
        DOut.Mask:=16#00000003; (* Output mask *)

        // Initialize the software I2C management.

        I2CBus.I2CMode:=1; //I2C mode selection
        I2CBus.I2CAddress:=16#44; //I2C Address
        I2CBus.BFrequency:=1000.0; //Bus frequency (Hz)
    END_IF;

    // -------------------------------------------------------------------------
    // OBJECT EXECUTION
    // -------------------------------------------------------------------------
    // Manage the I2C bus on CPU module logic I/Os.
    // The Di00 is used as Clock, Di01 is used as Data.

    DInp(); //Dgital inputs acquisition
    I2CBus.IClock:=NOT(TO_BOOL(DInp.Value AND 16#00000001));
    I2CBus.IData:=NOT(TO_BOOL(DInp.Value AND 16#00000002));

    // The Do00 is used as Clock, Do01 is used as Data.

    DOut.Value:=NOT(I2CBus.OData); //Output value
    DOut.Value:=DOut.Value*2; //Output value
    DOut.Value:=DOut.Value OR NOT(I2CBus.OClock); //Output value
    DOut(); //Digital output management

    // -------------------------------------------------------------------------
    // PROGRAM CASES
    // -------------------------------------------------------------------------
    // Program cases management.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // Conversion command "Single Shot Mode high repeatability" clock
        // streching disabled.

        0:
        I2CWrite[0]:=16#24; //MSB
        I2CWrite[1]:=16#00; //LSB
        I2CBus(Start:=TRUE, WrBuffer:=ADR(I2CWrite), WrBytes:=2, RdBuffer:=NULL, RdBytes:=0);
        IF NOT(I2CBus.Done) THEN RETURN; END_IF;
        IF NOT(I2CBus.Ok) THEN Errors:=Errors+1; CaseNr:=0; RETURN; END_IF;

        // Save time to wait.

        TimeBf:=SysGetSysTime(TRUE);
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // Wait conversion complete (Max time oh high repeatability 15 mS).

        1:
        IF ((SysGetSysTime(TRUE)-TimeBf) < 15000) THEN RETURN; END_IF;

        // Read the conversion results.

        I2CBus(Start:=TRUE, WrBuffer:=NULL, WrBytes:=0, RdBuffer:=ADR(I2CRead), RdBytes:=6);
        IF NOT(I2CBus.Done) THEN RETURN; END_IF;
        IF NOT(I2CBus.Ok) THEN Errors:=Errors+1; CaseNr:=0; RETURN; END_IF;

        // Convert the acquired values.

        Temperature:=-45.0+(175.0*(TO_REAL((I2CRead[0]*256)+I2CRead[1])/65535.0));
        Humidity:=100.0*(TO_REAL((I2CRead[3]*256)+I2CRead[4])/65535.0);
        CaseNr:=0; //Program case
    END_CASE;

// [End of file]
LogicLab (Ptp176)

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 9 Marzo 2020