I 2 c I 2 c I 2

  • Slides: 28
Download presentation
I 2 c

I 2 c

I 2 c • • I 2 c=Inter-Integrated Circuit, è stato ideato nel 1980

I 2 c • • I 2 c=Inter-Integrated Circuit, è stato ideato nel 1980 dalla Philips Semiconductors che ne possiede quindi la proprietà. Il protocollo permette lo scambio dati tra due dispositivo es. tra due o più microcontrollori o tra due o più microprocessori o tra microprocessori e microcontrollori. Lo scopo è quello di superare l'utilizzo di troppi bus paralleli per la comunicazione tra un'unità di controllo e le varie periferiche. A differenza del protocollo RS 232 che permette di effettuare un collegamento punto tra due periferiche, I 2 C permette il collegamento sullo stesso bus di più periferiche La comunicazione i 2 c avviene tra un solo master e più slave; un master può essere anche slave e viceversa; tutti gli slave sono collegati su un unico bus scambio dati La comunicazione tra un master e tutti gli slave avviene su due linee: SCL ed SDA SCL viene utilizzata per i segnali di clock per sincronizzare il trasferimento dei dati su un bus SDA è il bus per il trasferimento dati che avviene in maniera half duplex

I 2 c Un vantaggio del protocollo I 2 C è quello di poter

I 2 c Un vantaggio del protocollo I 2 C è quello di poter aggiungere o togliere delle periferiche dal bus senza influenzare il resto del circuito, quindi una facile scalabilità Oltre ai bus SDA ed SCL c’è bisogno anche della linea per il ground e quella per l’alimentazione che può essere di: 5 V, 3. 3 V o 2. 5 V I resistori di condizionamento possono avere valori compresi tra 1800 Hom e 4700 Hom

Master e slave • Il master inizializza e termina la comunicazione; invia i segnali

Master e slave • Il master inizializza e termina la comunicazione; invia i segnali di clock per la sincronizzazione • Le comunicazioni di start e di stop sono codici particolari, diversi dagli altri e mostrati in figura: •

Sequenza trasferimento dati • Invio del bit di start da parte del master •

Sequenza trasferimento dati • Invio del bit di start da parte del master • Invio dell’indirizzo dello slave da parte del master • Invio del bit di read o di write • Attesa, ricezione ACK • Invio/ricezione dati • Attesa, ricezione ack • Bit di stop

Sequenza trasmissione dati

Sequenza trasmissione dati

Trasferimento dati • I dati vengono trasferiti tramite una sequenza di 8 bit partendo

Trasferimento dati • I dati vengono trasferiti tramite una sequenza di 8 bit partendo dal MSB sul bus SDA in maniera half duplex, visto che il bus è unico • Per ogni treno di bit inviati, il device che riceve invia un segnale di ACK su SDA • Il segnale ACK può essere emesso sia dal master che dallo slave, dipende da chi riceve il segnale. • Siccome il cavo SDA è unico sia per trasmettere che per ricevere, il treno complessivo di dati è di 9 bit

Frequenza di trasferimento • La frequenza clock per l’I 2 C è superiore a

Frequenza di trasferimento • La frequenza clock per l’I 2 C è superiore a 100 KHz • In base alla frequenza di trasferimento dati, vengono date le seguenti definizioni: – Fast mode per frequenze superiori a 400 KHz – High speed mode per frequenze superiori a 3. 4 MHz

Indirizzamento • Gli slave sono tutti collegati su un solo bus e devono avere

Indirizzamento • Gli slave sono tutti collegati su un solo bus e devono avere un indirizzo per essere distinti • I bit dedicati agli indirizzi sono in totale 7 • Ciò vuol dire che il numero di slave indirizzabili sono 128 da 0 a 127 • Prima di trasmettere o ricevere i dati, il master deve individuare l’indirizzo dello slave sul bus inviando un segnale di 8 bit fatto in questo modo: • A 6 A 5…A 0 sono i bit di indirizzo • R/W indica se la trasmissione è si lettura o scrittura – R/W=0 il master deve inviare allo slave dei dati e quindi si ha la scrittura – R/W=1 il master deve leggere dei dati dallo slave

Treno di dati

Treno di dati

I 2 C Arduino

I 2 C Arduino

I 2 C Arduino

I 2 C Arduino

Programma master #include<Wire. h> int x = 0; void setup() { Wire. begin(); }

Programma master #include<Wire. h> int x = 0; void setup() { Wire. begin(); } void loop() { Wire. begin. Transmission(9); // trasmette al device 9 Wire. write(x); Wire. end. Transmission(); x++; if (x > 5) x = 0; delay(500); }

Programma slave int LED = 13; int x = 0; void setup() {Serial. begin(9600);

Programma slave int LED = 13; int x = 0; void setup() {Serial. begin(9600); pin. Mode (LED, OUTPUT); Wire. begin(9); //lo slave prende indirizzo 9 Wire. on. Receive(receive. Event); } void receive. Event(int bytes) { x = Wire. read(); Serial. println(x); } void loop() { void receive. Event(); if (x != '0') digital. Write(LED, HIGH); delay(200); digital. Write(LED, LOW); delay(200); }

Lcd I 2 c

Lcd I 2 c

I 2 C STM 32

I 2 C STM 32

Pin raspberry

Pin raspberry

I 2 c Raspberry • Per poter utilizzare il protocollo I 2 C su

I 2 c Raspberry • Per poter utilizzare il protocollo I 2 C su Raspberry è più complicato • Bisogna installare le librerie per python (se si vuole utilizzare python) e configurare la scheda Raspberry • Il procedimento è il seguente: – Bisogna digitare I seguenti comandi: • sudo apt-get update • sudo apt-get install -y python-smbus • sudo apt-get install -y i 2 c-tools

Configurare il kernel sudo raspi-config

Configurare il kernel sudo raspi-config

Configurare il kernel

Configurare il kernel

Testare i 2 c • Per testare I 2 c su Raspeberry Pi 3

Testare i 2 c • Per testare I 2 c su Raspeberry Pi 3 bisogna digitare il seguente comando: – sudo i 2 cdetect -y 1 • Per testare I 2 c su modelli precedenti di Raspberry bisogna digitare il seguente comando: – sudo i 2 cdetect -y 0

Testare i 2 c

Testare i 2 c

Codice esempio Raspberry import smbus = smbus. SMBus(1) # 0 = /dev/i 2 c-0

Codice esempio Raspberry import smbus = smbus. SMBus(1) # 0 = /dev/i 2 c-0 (port I 2 C 0) #1 = /dev/i 2 c-1 (port I 2 C 1) DEVICE_ADDRESS = 0 x 15 DEVICE_REG_MODE 1 = 0 x 00 DEVICE_REG_LEDOUT 0 = 0 x 1 d #Write a single register bus. write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE 1, 0 x 80) #Write an array of registers ledout_values = [0 xff, 0 xff, 0 xff] bus. write_i 2 c_block_data(DEVICE_ADDRESS, DEVICE_REG_LEDOUT 0, ledout_values)

I 2 c arduino raspberry Codice raspberry import smbus import time # for RPI

I 2 c arduino raspberry Codice raspberry import smbus import time # for RPI version 1, use "bus = smbus. SMBus(0)" bus = smbus. SMBus(1) # This is the address we setup in the Arduino Program address = 0 x 04 def write. Number(value): bus. write_byte(address, value) # bus. write_byte_data(address, 0, value) return -1 def read. Number(): number = bus. read_byte(address) # number = bus. read_byte_data(address, 1) return number while True: var = input("") if not var: Continue write. Number(var) number = read. Number()

I 2 c arduino raspberry Codice arduino #include <Wire. h> #define SLAVE_ADDRESS 0 x

I 2 c arduino raspberry Codice arduino #include <Wire. h> #define SLAVE_ADDRESS 0 x 04 #define RELAY 1 9 int number = 0; int state = 0; void setup() { pin. Mode(RELAY 1, OUTPUT); Serial. begin(9600); // start serial for output // initialize i 2 c as slave Wire. begin(SLAVE_ADDRESS); // define callbacks for i 2 c communication Wire. on. Receive(receive. Data); Wire. on. Request(send. Data); Serial. println("Ready!"); } void loop() { delay(100); } // callback for received data void receive. Data(int byte. Count){ while(Wire. available()) { number = Wire. read(); Serial. print("data received: "); Serial. println(number); if (number == 1){ if (state == 0){ digital. Write(RELAY 1, HIGH); // set the LED on state = 1; } else{ digital. Write(RELAY 1, LOW); // set the LED off state = 0; } } // callback for sending data void send. Data(){ Wire. write(number); }