Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:lab:lab5-2021 [2021/04/04 21:36]
dumitru.brigalda
pm:lab:lab5-2021 [2021/04/17 16:05] (current)
jan.vaduva
Line 2: Line 2:
 Acest laborator acoperă noțiunea de SPI. Pentru aprofundarea acestui topic, consultați [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] și {{https://​en.wikipedia.org/​wiki/​Serial_Peripheral_Interface?​fbclid=IwAR3qQ8-N1G8sf38MDyQFSq4vtjz3aj9oynzeG46HjJoLr1OrBxybdlB74Fk|Serial Peripheral Interface}}. Acest laborator acoperă noțiunea de SPI. Pentru aprofundarea acestui topic, consultați [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] și {{https://​en.wikipedia.org/​wiki/​Serial_Peripheral_Interface?​fbclid=IwAR3qQ8-N1G8sf38MDyQFSq4vtjz3aj9oynzeG46HjJoLr1OrBxybdlB74Fk|Serial Peripheral Interface}}.
  
-===== SPI (Serial Peripheral Interface) =====+===== 1. SPI (Serial Peripheral Interface) =====
 SPI este un standard sincron dezvoltat de Motorola care funcționează în modul full-duplex (transferul de date are loc în ambele direcții simultan). Dispozitivele comunică utilizând o arhitectură Master-Slave (este permis un singur dispozitiv Master și unul sau mai multe dispozitive Slave). Dispozitivul Master este cel care inițiază comunicarea. SPI mai este numit și „four wire”. Cele patru semnale utilizate sunt următoarele:​ SPI este un standard sincron dezvoltat de Motorola care funcționează în modul full-duplex (transferul de date are loc în ambele direcții simultan). Dispozitivele comunică utilizând o arhitectură Master-Slave (este permis un singur dispozitiv Master și unul sau mai multe dispozitive Slave). Dispozitivul Master este cel care inițiază comunicarea. SPI mai este numit și „four wire”. Cele patru semnale utilizate sunt următoarele:​
-  * MOSI  — Master Output Slave Input (transmiterea datelor de la Master la Slave.+  * MOSI  — Master Output Slave Input (transmiterea datelor de la Master la Slave) 
-  * MISO  — Master Input Slave Output (transmiterea datelor de la Slave la Master.+  * MISO  — Master Input Slave Output (transmiterea datelor de la Slave la Master) 
-  * SCLK  — Serial Clock              (sincronizarea dintre dispozitive. Controlat de Master.)+  * SCLK  — Serial Clock              (sincronizarea dintre dispozitive. Controlat de Master)
   * CS/SS — Chip Select/​Slave Select ​ (selectarea dispozitivului Slave de către Master. Valoarea LOW pentru Slave-ul selectat)   * CS/SS — Chip Select/​Slave Select ​ (selectarea dispozitivului Slave de către Master. Valoarea LOW pentru Slave-ul selectat)
  
Line 13: Line 13:
 {{ :​pm:​lab:​spi1.png?​500 |}} {{ :​pm:​lab:​spi1.png?​500 |}}
  
-===== Conectarea mai multor dispozitive Slave ===== +===== 2. Conectarea mai multor dispozitive Slave =====
-Multiple slave devices can be connected to a single master, selecting a particular slave with the CS/SS signal associated with the slave. The other three signals are shared.+
 Mai multe dispozitive Slave pot fi conectate în același timp la un singur dispozitiv Master. Semnalele MOSI, MISO și SCLK sunt partajate. Pentru fiecare dispozitiv Slave, dispozitivul Master are câte un semnal CS / SS. Când Masterul dorește să comunice cu un Slave, dispozitivul Master setează pe LOW semnalul CS / SS care duce către dispozitivul Slave dorit (celelalte semnale CS / SS sunt puse pe HIGH). Astfel, dispozitivul Slave cu CS / SS pe LOW știe că Masterul comunică cu el. Mai multe dispozitive Slave pot fi conectate în același timp la un singur dispozitiv Master. Semnalele MOSI, MISO și SCLK sunt partajate. Pentru fiecare dispozitiv Slave, dispozitivul Master are câte un semnal CS / SS. Când Masterul dorește să comunice cu un Slave, dispozitivul Master setează pe LOW semnalul CS / SS care duce către dispozitivul Slave dorit (celelalte semnale CS / SS sunt puse pe HIGH). Astfel, dispozitivul Slave cu CS / SS pe LOW știe că Masterul comunică cu el.
  
 {{ :​pm:​lab:​spi2.png?​500 |}} {{ :​pm:​lab:​spi2.png?​500 |}}
  
-===== Conectarea mai multor dispozitive Slave cu ajutorul topologiei SPI Daisy Chain ===== +===== 3. Conectarea mai multor dispozitive Slave cu ajutorul topologiei SPI Daisy Chain ===== 
-În topoligia ​Daisy Chain, datele sunt transferate de la Master la primul Slave, de la primul Slave la al doilea Slave, până când datele ajung la ultimul Slave care le trimite înapoi la Master. Datele primului Slave ajung la Master ultimele, în timp ce datele ultimului Slave ajung la Master primele.+În topologia ​Daisy Chain, datele sunt transferate de la Master la primul Slave, de la primul Slave la al doilea Slave, până când datele ajung la ultimul Slave care le trimite înapoi la Master. Datele primului Slave ajung la Master ultimele, în timp ce datele ultimului Slave ajung la Master primele.
  
 {{ :​pm:​lab:​spi3.png?​500 |}} {{ :​pm:​lab:​spi3.png?​500 |}}
  
-===== Transmiterea datelor cu SPI =====+===== 4. Transmiterea datelor cu SPI =====
  
 Pentru a începe comunicarea cu dispozitivul Master, ceasul Master-ului trebuie setat la o frecvență cel mult egală cu frecvența suportată de dispozitivul Slave (de obicei până la câțiva MHz). Apoi, Master-ul selectează dispozitivul Slave dorit, punând 0 pe linia CS / SS. În timpul unui ciclu SPI, transmisia este full-duplex:​ Pentru a începe comunicarea cu dispozitivul Master, ceasul Master-ului trebuie setat la o frecvență cel mult egală cu frecvența suportată de dispozitivul Slave (de obicei până la câțiva MHz). Apoi, Master-ul selectează dispozitivul Slave dorit, punând 0 pe linia CS / SS. În timpul unui ciclu SPI, transmisia este full-duplex:​
Line 37: Line 36:
 {{ :​pm:​lab:​spi5.png?​500 |}} {{ :​pm:​lab:​spi5.png?​500 |}}
  
-===== Configurări de SPI =====+===== 5. Configurări de SPI =====
  
 Clock Polarity (CPOL) configurează starea IDLE a ceasului. După cum putem vedea, pentru CPOL = 0, când ceasul este inactiv valoarea semnalului SCLK este pe LOW, iar pentru CPOL = 1 ceasul inactiv are SCLK pe HIGH. Clock Polarity (CPOL) configurează starea IDLE a ceasului. După cum putem vedea, pentru CPOL = 0, când ceasul este inactiv valoarea semnalului SCLK este pe LOW, iar pentru CPOL = 1 ceasul inactiv are SCLK pe HIGH.
Line 54: Line 53:
 {{ :​pm:​lab:​spi6.png?​500 |}} {{ :​pm:​lab:​spi6.png?​500 |}}
  
-===== SPI în Atmega324 ​=====+===== 6. SPI în Atmega328p ​=====
  
-SPI-ul inclus în microcontrolerul ​atmega324 ​poate funcționa atât ca Master, cât și ca Slave.+SPI-ul inclus în microcontrolerul ​atmega328p ​poate funcționa atât ca Master, cât și ca Slave.
  
 ==== SPI Control Register (SPCR) ==== ==== SPI Control Register (SPCR) ====
Line 75: Line 74:
  
   * Bit 3 - CPOL (Clock Polarity)   * Bit 3 - CPOL (Clock Polarity)
-    * 0 - SCK LOW  pe idle (când nu trimite / primește+    * 0 - SCK LOW  pe idle (când nu comunică
-    * 1 - SCK HIGH pe idle (când nu trimite / primește)+    * 1 - SCK HIGH pe idle (când nu comunică)
  
   * Bit 2 - CPHA (Clock Phase)   * Bit 2 - CPHA (Clock Phase)
-    * 0 - datele sunt citite pe frontul întâmpinare+    * 0 - datele sunt citite pe frontul ​de întâmpinare
     * 1 - datele sunt citite pe frontul de sfârșit     * 1 - datele sunt citite pe frontul de sfârșit
  
Line 99: Line 98:
     * în modul Slave:SPI este doar garantat că o să funcționeze la fosc / 4 sau mai mic.     * în modul Slave:SPI este doar garantat că o să funcționeze la fosc / 4 sau mai mic.
  
-==== SPI Data Register (SPDR) ===-+==== SPI Data Register (SPDR) ====
  
 {{:​pm:​lab:​spi10.png?​500|}} {{:​pm:​lab:​spi10.png?​500|}}
Line 105: Line 104:
 Un registru de citire / scriere utilizat pentru transferul de date între Register File și SPI Shift Register. Scrierea în registru inițiază transmiterea datelor. Citirea registrului determină citirea bufferului Shift Register Receive. Un registru de citire / scriere utilizat pentru transferul de date între Register File și SPI Shift Register. Scrierea în registru inițiază transmiterea datelor. Citirea registrului determină citirea bufferului Shift Register Receive.
  
-==== Example ​==== +==== Exemplu ​==== 
-Initialize the SPI as a Master.+Inițializare ​SPI ca Master.
 <​code>​ <​code>​
 /* set master mode */ /* set master mode */
Line 118: Line 117:
 </​code>​ </​code>​
  
-Perform a simple transmission.+Transmiterea unui byte (pe Master).
 <​code>​ <​code>​
 /* Start transmission */ /* Start transmission */
Line 127: Line 126:
 </​code>​ </​code>​
  
-Perform a simple reception.+Recepția unui byte (pe Slave).
 <​code>​ <​code>​
 /* Wait for reception complete */ /* Wait for reception complete */
Line 136: Line 135:
 </​code>​ </​code>​
  
-===== Adaptor MicroSD =====+===== 7. Adaptor MicroSD =====
 Un card MicroSD este un exemplu de memorie nevolatilă. Pentru ca placa Arduino UNO să poată comunica pe SPI cu cardul, avem nevoie de un adaptor. De menționat că adaptorul din laborator nu suportă carduri de o dimensiune mai mare de 32GB. Un card MicroSD este un exemplu de memorie nevolatilă. Pentru ca placa Arduino UNO să poată comunica pe SPI cu cardul, avem nevoie de un adaptor. De menționat că adaptorul din laborator nu suportă carduri de o dimensiune mai mare de 32GB.
  
Line 145: Line 144:
 Mediul de dezvoltare Arduino IDE ne oferă bibliotecile "​SPI.h"​ și "​SD.h"​ pentru lucrul cu cardurile microSD. De menționat faptul că bibliotecile sunt compatibile doar cu sistemele de fișiere FAT16 și FAT32. Aceste biblioteci ne oferă posibilitatea să lucrăm cu fișiere și directoare, să le creăm, modificăm, ștergem etc. În link-ul de mai jos puteți găsi informații despre bibliotecile respective. Mediul de dezvoltare Arduino IDE ne oferă bibliotecile "​SPI.h"​ și "​SD.h"​ pentru lucrul cu cardurile microSD. De menționat faptul că bibliotecile sunt compatibile doar cu sistemele de fișiere FAT16 și FAT32. Aceste biblioteci ne oferă posibilitatea să lucrăm cu fișiere și directoare, să le creăm, modificăm, ștergem etc. În link-ul de mai jos puteți găsi informații despre bibliotecile respective.
   * {{https://​www.arduino.cc/​en/​reference/​SPI|SPI.h}}   * {{https://​www.arduino.cc/​en/​reference/​SPI|SPI.h}}
 +<file c>
 +/* Exemplu SPI MASTER: transfer un byte către Slave */
 +#include "​SPI.h"​
 +
 +void setup(void)
 +
 +  byte masterSend = 1;
 +  byte masterRecv;
 +  ​
 +  /* Inițializarea pinului de Slave Select */
 +  pinMode(SS, OUTPUT);
 +  digitalWrite(SS,​ HIGH);
 +
 +  /* Inițializarea SPI-ului */
 +  SPI.begin();​
 +  ​
 +  /* Selectarea Slave-ului */
 +  digitalWrite(SS,​ LOW);
 +
 +  /* Trimiterea byte-ului masterSend către Slave-ul selectat.
 +   * Salvarea byte-ului primit de la Slave-ul selectat în masterRecv. */
 +  masterRecv = SPI.transfer(masterSend); ​
 +  ​
 +  /* Deselectarea Slave-ului */
 +  digitalWrite(SS,​ HIGH);
 +}
 +</​file>​
 +
   * {{https://​www.arduino.cc/​en/​reference/​SD|SD.h}}   * {{https://​www.arduino.cc/​en/​reference/​SD|SD.h}}
 +<file c>
 +/* Exemplu MASTER: Creare și scriere a unui fișier pe Card MicroSD */
 +#include "​SD.h"​
 +
 +void setup(void)
 +{
 +  File myFile;
 +
 +  /* Inițializare comunicare cu Cardul MicroSD. Semnalul SS este pe pinul 4 */
 +  if (SD.begin(4))
 +  {
 +    /* Creăm fișierul dacă acesta nu există */
 +    if (!SD.exists("​hello.txt"​))
 +    {
 +      myFile = SD.open("​hello.txt",​ FILE_WRITE);​
 +      if (myFile)
 +      {
 +        myFile.print("​Hello world"​);​
 +        myFile.close();​
 +      }
 +      else 
 +      {
 +        /* Fișierul nu a putut fi creat. Trebuie investigată problema. */
 +      }
 +    }
 +  }
 +  else
 +  {
 +    /* Inițializarea comunicării a eșuat. Trebuie investigată problema. */
 +  }
 +}
 +</​file>​
  
-===== Exerciții =====+===== 8. Exerciții =====
  
 ==== Tinkercad ==== ==== Tinkercad ====
Line 170: Line 229:
       * consola Slave  afișează: "​Hello,​ I am SPI Slave"       * consola Slave  afișează: "​Hello,​ I am SPI Slave"
       * {{:​pm:​lab:​spi_tinker_schelet.png?​nolink&​500|}}       * {{:​pm:​lab:​spi_tinker_schelet.png?​nolink&​500|}}
-  - Configurați pinii pentru SPI Master și SPI Slave. ​Pentru ambele plăci:+  - Configurați pinii pentru SPI Master și SPI Slave. ​Efectuați atât pe Master cât și pe Slave:
     - Setați #define TASK 1 (pe linia 3 din cod)     - Setați #define TASK 1 (pe linia 3 din cod)
     - Completați toate "​TODO1"​ (din setup())     - Completați toate "​TODO1"​ (din setup())
Line 178: Line 237:
       * ambele console afișează: "SPI <​device>​ pins are initialized"​       * ambele console afișează: "SPI <​device>​ pins are initialized"​
       * semnalul CS/SS este HIGH (LED-ul roșu este aprins) - niciun Slave nu este selectat       * semnalul CS/SS este HIGH (LED-ul roșu este aprins) - niciun Slave nu este selectat
-  - Configurați selecția Slave-ului cu ajutorul semnalului CS/​SS. ​Pentru ambele plăci:+  - Configurați selecția Slave-ului cu ajutorul semnalului CS/​SS. ​Efectuați atât pe Master cât și pe Slave:
     - Setați #define TASK 2     - Setați #define TASK 2
     - Completați toate "​TODO2"​ (din loop())     - Completați toate "​TODO2"​ (din loop())
Line 185: Line 244:
       * ambele console afișează un număr egal de selectări/​deselectări       * ambele console afișează un număr egal de selectări/​deselectări
       * semnalul CS/SS este LOW când Slave-ul este selectat (LED-ul roșu se stinge)       * semnalul CS/SS este LOW când Slave-ul este selectat (LED-ul roșu se stinge)
-  - Configurați generarea semnalului de ceas SCK. Pentru ambele plăci:+  - Configurați generarea semnalului de ceas SCK. Efectuați atât pe Master cât și pe Slave:
     - Setați #define TASK 3     - Setați #define TASK 3
     - Completați toate "​TODO3"​ (din resetClock(),​ getClockTransition())     - Completați toate "​TODO3"​ (din resetClock(),​ getClockTransition())
Line 194: Line 253:
       * Ambele console afișează fronturile ceasului: "CLK signal <​action>​ HIGH"       * Ambele console afișează fronturile ceasului: "CLK signal <​action>​ HIGH"
       * semnalul SCK face toggle când Slave-ul este selectat (LED-ul verde face toggle)       * semnalul SCK face toggle când Slave-ul este selectat (LED-ul verde face toggle)
-  - Configurați transmiterea datelor pe MOSI și MISO. Pentru ambele plăci:+  - Configurați transmiterea datelor pe MOSI și MISO. Efectuați atât pe Master cât și pe Slave:
     - Setați #define TASK 4     - Setați #define TASK 4
     - Completați toate "​TODO4"​ (din sendRecvByte())     - Completați toate "​TODO4"​ (din sendRecvByte())
Line 224: Line 283:
     * Introduceți cardul în adaptor     * Introduceți cardul în adaptor
     * Realizați conexiunile fizice dintre adaptor și Arduino UNO     * Realizați conexiunile fizice dintre adaptor și Arduino UNO
-      * Adaptor GND  - GND +      * Adaptor GND  - GND Arduino Uno 
-      * Adaptor VCC  - VCC +      * Adaptor VCC  - VCC Arduino Uno 
-      * Adaptor MISO - 12 +      * Adaptor MISO - 12 Arduino Uno 
-      * Adaptor MOSI - 11 +      * Adaptor MOSI - 11 Arduino Uno 
-      * Adaptor SCK  - 13 +      * Adaptor SCK  - 13 Arduino Uno 
-      * Adaptor CS   - 4+      * Adaptor CS   - 4 Arduino Uno
     * Rulați exemplul File -> Examples -> SD -> CardInfo     * Rulați exemplul File -> Examples -> SD -> CardInfo
     * Verificați că nu aveți erori     * Verificați că nu aveți erori
Line 238: Line 297:
     * Suprascrieți codul proiectului cu cel de mai jos     * Suprascrieți codul proiectului cu cel de mai jos
       * {{:​pm:​lab:​microsd_reset_cnt.txt|Board reset counter}}       * {{:​pm:​lab:​microsd_reset_cnt.txt|Board reset counter}}
 +    * Analizați codul
     * Uploadați proiectul pe placă     * Uploadați proiectul pe placă
  
Line 247: Line 307:
     * {{:​pm:​lab:​spi_microsd_reset_cnt.png?​300|}}     * {{:​pm:​lab:​spi_microsd_reset_cnt.png?​300|}}
  
 +===== 9. Resurse =====
 +
 +  * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}
 +  * Arduino UNO pinout
 +{{:​pm:​lab:​uno.jpg?​200|pinout Arduino UNO}}
 +  * Responsabil:​ [[dbrigalda@gmail.com | Dumitru Brigalda]]
 +
 +===== 10. Linkuri Utile =====
 +  * [[https://​www.arduino.cc/​en/​reference/​SPI|Arduino SPI]]
 +  * [[https://​www.arduino.cc/​en/​reference/​SD|Arduino SD]]
 +  * [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328p]]
  
-Responsabil:​ [[dbrigalda@gmail.com | Dumitru Brigalda]] 
pm/lab/lab5-2021.1617561407.txt.gz · Last modified: 2021/04/04 21:36 by dumitru.brigalda
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0