Differences
This shows you the differences between two versions of the page.
hu:comm:bus_spi [2017/09/21 14:18] |
hu:comm:bus_spi [2022/04/21 15:03] () |
||
---|---|---|---|
1: | 1: | ||
+ | ====== SPI ====== | ||
+ | {{tag> | ||
+ | en: Serial Peripheral Interface | ||
+ | |||
+ | A Serial Peripheral Interface busz (SPI) egy szinkron soros kommunikációs interfész specifikáció, | ||
+ | |||
+ | Az SPI eszközök [[hu: | ||
+ | |||
+ | Néha az SPI-t négyvezetékes soros busznak is nevezik/ | ||
+ | |||
+ | A busz sebessége az eredeti specifikáció szerint **100 kbps** volt, ez emelkedett az 1998-as specifikációval **3,4 Mbps**-re. | ||
+ | |||
+ | A busz maximális távolsága nagyjából 8 m. | ||
+ | |||
+ | |||
+ | ===== Az SPI lehetséges portjai ===== | ||
+ | |||
+ | * SCLK: Soros óra (master kimenet). | ||
+ | * MOSI: Master Output Slave Input, vagy Master Out Slave In | ||
+ | * MISO: Master Input Slave kimenet, vagy Master In Slave Out | ||
+ | * SDIO: Soros adat I/O (kétirányú I / O) | ||
+ | * SS: Slave Select (master kimenet) | ||
+ | |||
+ | ===== SPI hálózatkonfiguráció ===== | ||
+ | Az SPI hálózat alapvelően két struktúra szerint épülhet fel: | ||
+ | === Független slave konfiguráció === | ||
+ | {{: | ||
+ | |||
+ | Ebben a struktúrában a master-nek annyi kiválasztó SS porttal kell rendelkeznie, | ||
+ | |||
+ | === Daisy chain konfiguráció === | ||
+ | {{: | ||
+ | |||
+ | Ebben az esetben a master által kiadott MOSI jelsor először az első slave MOSI-jára kerül, majd onnan a MISO kimeneten keresztül jut el a következő slave MOSI-jára, és így tovább. | ||
+ | |||
+ | ===== Az SPI kommunikáció ===== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Az SPI-ben mindig a master kezdeményezi a kommunikációt azzal, hogy a kiválasztott slave felé az SS jel állapotát magasról alacsonyra váltja. Ez után a master által kiadott órajellel a forgalmazás mindkét csatornán egyidejűleg történik, az adatátvitelre alkalmazott regiszterek szinkronban kerülnek feltöltésre, | ||
+ | |||
+ | A regiszterek feltötése után azokat tárolja mindkét egység, és ismétli a regisztertöltést az átvitel végéig. A regiszterek leggyakrabban 8 bitesek, de előfordulhat 16 / 12 bites változatuk is. | ||
+ | |||
+ | Az átvitel végeztével a master leállítja az SLCK órajelet és az SS kiválasztót ismét magas állapotba teszi. | ||
+ | |||
+ | ===== Óra polaritás ===== | ||
+ | |||
+ | Az órajel kezdő polaritása (CPOL) lehet felfutóél vezérelt (CPHA=0) és lefutóél vezérelt (CPHA=1) is, úgy, mint ahogy ez a lenti képen követhető: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | ===== Mód ===== | ||
+ | Az SPI-ben négy kommunikációs mód áll rendelkezésre (MODE 0, 1, 2, 3), melyek alapvetően az SCLK élfigyelését határozzák meg: | ||
+ | |||
+ | {{: | ||
+ | ===== SPI / Arduino ===== | ||
+ | **spi.h** | ||
+ | <code c> | ||
+ | #ifndef _SPI_H_ | ||
+ | #define _SPI_H_ | ||
+ | |||
+ | #include < | ||
+ | |||
+ | |||
+ | extern void spi_init(); | ||
+ | extern void spi_transfer_sync (uint8_t * dataout, uint8_t * datain, uint8_t len); | ||
+ | extern void spi_transmit_sync (uint8_t * dataout, uint8_t len); | ||
+ | extern uint8_t spi_fast_shift (uint8_t data); | ||
+ | </ | ||
+ | **spi.c** | ||
+ | <code c> | ||
+ | #include " | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #define PORT_SPI | ||
+ | #define DDR_SPI | ||
+ | #define DD_MISO | ||
+ | #define DD_MOSI | ||
+ | #define DD_SS DDB2 | ||
+ | #define DD_SCK | ||
+ | |||
+ | |||
+ | void spi_init() | ||
+ | // Initialize pins for spi communication | ||
+ | { | ||
+ | DDR_SPI &= ~((1<< | ||
+ | // Define the following pins as output | ||
+ | DDR_SPI |= ((1<< | ||
+ | |||
+ | | ||
+ | SPCR = ((1<< | ||
+ | (0<< | ||
+ | (0<< | ||
+ | (1<< | ||
+ | (0<< | ||
+ | (0<< | ||
+ | (0<< | ||
+ | |||
+ | SPSR = (1<< | ||
+ | | ||
+ | } | ||
+ | |||
+ | void spi_transfer_sync (uint8_t * dataout, uint8_t * datain, uint8_t len) | ||
+ | // Shift full array through target device | ||
+ | { | ||
+ | | ||
+ | for (i = 0; i < len; i++) { | ||
+ | SPDR = dataout[i]; | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void spi_transmit_sync (uint8_t * dataout, uint8_t len) | ||
+ | // Shift full array to target device without receiving any byte | ||
+ | { | ||
+ | | ||
+ | for (i = 0; i < len; i++) { | ||
+ | SPDR = dataout[i]; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | uint8_t spi_fast_shift (uint8_t data) | ||
+ | // Clocks only one byte to target device and returns the received one | ||
+ | { | ||
+ | SPDR = data; | ||
+ | while((SPSR & (1<< | ||
+ | return SPDR; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Az SPI alkalmazása ===== | ||
+ | |||
+ | [[hu: | ||
+ | [[hu: | ||
+ | ===== Források ===== | ||
+ | https:// | ||
+ | |||