Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
I2c
2
I2c I2c=Inter-Integrated Circuit, è stato creato dalla Philips Semiconductors Costituito da due fili che rappresentanoi collegamenti denominati SCL ed SDA. I2c=protocollo di comunicazione La comunicazione i2c 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
3
I2c Oltre ai bus SDA ed SCL c’è bisogno anche della linea per il ground e quella per l’alimentazione a 5 V I resistori possono avere valori da 1800 Hom a 4700 Hom
4
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:
5
Trasferimento dati I dati vengono trasferiti tramite una sequenza di 8 bit partendo dal MSB sul bus SDA in maniera hal 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
6
Frequenza di trasferimento
La frequenza clock per l’I2C è 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
7
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: A6 A5…A0 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
8
Treno di dati
9
I2C Arduino
10
I2C Arduino
11
Programma master #include<Wire.h> int x = 0; void setup() { Wire.begin(); } void loop() { Wire.beginTransmission(9); // trasmette al device 9 Wire.write(x); Wire.endTransmission(); x++; if (x > 5) x = 0; delay(500);
12
Programma slave int LED = 13; int x = 0; void setup() {Serial.begin(9600); pinMode (LED, OUTPUT); Wire.begin(9); //lo slave prende indirizzo 9 Wire.onReceive(receiveEvent); } void receiveEvent(int bytes) { x = Wire.read(); Serial.println(x); void loop() { void receiveEvent(); if (x != '0') digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW);
14
Lcd I2c
15
Pin raspberry
16
I2c Raspberry Per poter utilizzare il protocollo I2C su Raspberry è più complicato Bisogna installare le librerie 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 i2c-tools
17
Configurare il kernel sudo raspi-config
18
Configurare il kernel
21
Testare i2c Per testare I2c su Raspeberry Pi3 bisogna digitare il seguente comando: sudo i2cdetect -y 1 Per testare I2c su modelli precedenti di Raspberry bisogna digitare il seguente comando: sudo i2cdetect -y 0
22
Testare i2c
23
Codice esempio Raspberry
import smbus bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0) #1 = /dev/i2c-1 (port I2C1) DEVICE_ADDRESS = 0x15 DEVICE_REG_MODE1 = 0x00 DEVICE_REG_LEDOUT0 = 0x1d #Write a single register bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE1, 0x80) #Write an array of registers ledout_values = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff] bus.write_i2c_block_data(DEVICE_ADDRESS, DEVICE_REG_LEDOUT0, ledout_values)
24
I2c 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 = 0x04 def writeNumber(value): bus.write_byte(address, value) # bus.write_byte_data(address, 0, value) return -1 def readNumber(): number = bus.read_byte(address) # number = bus.read_byte_data(address, 1) return number while True: var = input("") if not var: Continue writeNumber(var) number = readNumber()
25
I2c arduino raspberry Codice arduino #include <Wire.h> #define SLAVE_ADDRESS 0x04 #define RELAY1 9 int number = 0; int state = 0; void setup() { pinMode(RELAY1, OUTPUT); Serial.begin(9600); // start serial for output // initialize i2c as slave Wire.begin(SLAVE_ADDRESS); // define callbacks for i2c communication Wire.onReceive(receiveData); Wire.onRequest(sendData); Serial.println("Ready!"); } void loop() { delay(100); } // callback for received data void receiveData(int byteCount){ while(Wire.available()) { number = Wire.read(); Serial.print("data received: "); Serial.println(number); if (number == 1){ if (state == 0){ digitalWrite(RELAY1, HIGH); // set the LED on state = 1; } else{ digitalWrite(RELAY1, LOW); // set the LED off state = 0; } } } } // callback for sending data void sendData(){ Wire.write(number); }
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.