Vai al contenuto

Protocollo comunicazione con PIO I2C

Home Forum Programmazione IEC 61131 (LogicLab) Protocollo comunicazione con PIO I2C

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #60392
    Paolo
    Partecipante

    Sto valutando realizzare una scheda di interfaccia basata su di un PIO MPC23017 da collegare al modulo CPU MPS056 per avere 16 I/O a disposizione. In questo modo posso realizzare una mia scheda di interfaccia realizzata ad-hoc per le mie necessità.

    Il segnale di reset mi pare di aver capito vada invertito rispetto al segnale RDYO-N del bus di espansione.

    Ma per quanto riguarda l’interfaccia I2C, ho provato ad utilizzare la funzione SysI2CWrR, ma ho una domanda come faccio ad indirizzare un registro?

    Ok per l’indirizzo del dispositivo ma non trovo come leggere e scrivere un determinato registro.

    #60395
    Sergio Bertana
    Amministratore del forum

    Il bus di estensione dei ns sistemi utilizza il protocollo I2C standard è quindi possibile collegare qualsisi dispositivo I2C al bus. Abbiamo previsto la funzione SysI2CWrRd proprio per poter gestire dispositivi I2C standard connessi al bus di estensione.

    Come hai già visto tu il segnale RDYO-N è il segnale di abilitazione ai moduli , normalmente è allo stato logico TRUE (+5Vdc) e si porta a FALSE quando il programma PLC è in esecuzione (LED RDY acceso).

    Guardando il datsheet del MPC23017 vedo che ha un ingresso di RESET negato, quindi devi collegare a questo ingresso il segnale RDYO-N negato. mentre per la gestione dei comandi I2C devi riferti al datasheet del componente al capitolo byte mode and sequential mode.

    In Byte mode puoi scrivere/leggere un solo byte per ogni esecuzione della funzione SysI2CWrRd, in Sequential mode puoi scrivere/leggere più bytes sequenzialmente per ogni esecuzione della funzione SysI2CWrRd. Ecco un esempio di utilizzo

    // Esempio scrittura e lettura di 1 byte in "byte mode".
    
    I2CWrite[0]:=xx; //Device register address
    I2CWrite[1]:=xx; //Data to write
    i:=SysI2CWrRd(Address:=xx, WrBytes:=2, WrBuffer:=ADR(I2CWrite), RdBytes:=0, RdBuffer:=eNULL)
    
    I2CWrite[0]:=xx; //Device register address
    i:=SysI2CWrRd(Address:=xx, WrBytes:=1, WrBuffer:=ADR(I2CWrite), RdBytes:=1, RdBuffer:=ADR(I2CRead ))
    
    // Esempio scrittura e lettura di 4 bytes in "sequential mode".
    
    I2CWrite[0]:=xx; //Device register address
    I2CWrite[1]:=xx; //Data to write
    I2CWrite[2]:=xx; //Data to write
    I2CWrite[3]:=xx; //Data to write
    I2CWrite[3]:=xx; //Data to write
    i:=SysI2CWrRd(Address:=xx, WrBytes:=5, WrBuffer:=ADR(I2CWrite), RdBytes:=0, RdBuffer:=eNULL)
    
    I2CWrite[0]:=xx; //Device register address
    i:=SysI2CWrRd(Address:=xx, WrBytes:=1, WrBuffer:=ADR(I2CWrite), RdBytes:=4, RdBuffer:=ADR(I2CRead ))

    Il bus di estensione può essere utilizzato sia da task in back che slow o fast, l’accesso al bus blocca il task switching, quindi per minimizzare i jitters è preferibile non eseguire scritture/letture sequenziali di più di 4 bytes.

    Nota: Tutto quello cho ho scritto l’ho desunto dal datasheet del PIO quindi fai tu la verifica reale di funzionamento.

    #60397
    Paolo
    Partecipante

    Fatto un test con due MCP230017, uno per avere 16 ingressi, altro per le 16 uscite.

    Funziona tutto regolarmente, grazie

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Devi essere connesso per rispondere a questo topic.