Rozhraní SPI (Synchronous Peripheral interface) je sériové vysokorychlostní rozhraní typu master-slave. Rozhraní umožňuje obousměrnou komunikaci řízenou master (nadřazeným) zařízením s libovolným počtem slave zařízení, které jsou k této sběrnici připojeny. Rozhraní tvoří následující signály:
CS (chip select) - signál vymezující datový rámec, aktivní v logické 0 (při přenosu); signál generuje master
SCK (clock) - hodinový signál, který v závislosti na zvoleném režimu určuje okamžik, kdy dochází k vzorkování dat; generuje master
MOSI (master out slave in) - data vystupující z master zařízení (data out); generuje master
MISO (master in slave out) - data vstupující do master zařízení (data in); generuje slave
Připojení jednotlivých zařízení k jednomu SPI rozhraní je možno realizovat několika způsoby. Jednotlivá zařízení mohou sdílet veškeré signály, pak je nutné rozlišovat adresované zařízení na úrovni přenášených bitů a signály MISO musí být realizovány pomocí třístavových budičů. Další možností je propojit jednotlivá zařízení do řetězce, čímž se prodlouží datový rámec na k-násobek. Poslední možností je sdílet veškeré signály kromě signálu CS, který je rozveden individuálně ke každému zařízení na sběrnici.
Komunikace prostřednictvím SPI spočívá ve výměně obsahu dvou osmibitových registrů - jednoho umístěného v master a druhého v slave zařízení (obr. 1.1). Přenos probíhá tak, že se nejprve zapíše osmibitová hodnota do posuvného registru a tím se automaticky nastartuje přenos dat. Signál CS indikuje zahájení transakce přechodem do log 0. Master generuje hodinový signál SCK, jehož příslušná hrana generuje signál enable oběma posuvným registrům. Po osmi hodinových taktech dojde k výměně obsahu registrů v master a slave zařízení, čímž dojde současně k zápisu do i čtení ze slave zařízení. Přenos mezi registry master a slave zařízení probíhá od nejvýznamějšího (MSB) po nejméně významný bit (LSB).
SPI na fitkitu umožňuje procesoru, který je nakonfigurován v master režimu, kromě komunikace s pamětí FLASH uchovávající konfiguraci FPGA, komunikovat i s periferiemi realizovanými uvnitř FPGA. Typicky se např. SPI používá ke komunikaci s řadiči periferií, pamětí RAM, apod. Jelikož slave zařízení FLASH a FPGA sdílejí veškeré signály a není možné zajistit adresaci cílového zařízení na úrovní přenášených bitů (pomocí vzájemně disjunktní množiny operačních kódů), používají se k adresaci dva chip select (CS) signály. Signál SPI_CS umožňuje zvolit komunikaci s pamětí FLASH, signál SPI_FPGA_CS s komponentami uvnitř FPGA.
Rozhraní SPI je nakonfigurováno tak, že k vzorkování signálů MOSI a MISO dochází při vzestupné hraně hodinového signálu SCK, přičemž neaktivní úroveň SCK je logická 1. Konfiguraci SPI a jednotlivé funkce je možné nalézt v souboru spi.c knihovny libfitkit. Frekvence hodinového signálu SCK je určena hodnotou uloženou v registrovém páru U1BR1a U1BR0. Tyto registry specifikují dělitel hodinového signálu SMCLK, který má kmitočet 7.3728MHz (generován z krystalu X2). Protože nejmenší možný dělitel je roven 2, je maximální možná frekvence SCK rovna 3.6864MHz, což odpovídá přenosové rychlosti 460.8 kB/s.
Abychom mohli uvnitř FPGA využívat snadno sběrnici SPI a připojit libovolné množství zařízení, byla vytvořena interní sériová sběrnice a protokol, který umožňuje komunikovat s konkrétním zřízením uvnitř FPGA. Komunikaci můžeme rozdělit na tři části:
Odeslání operačního kódu. Operační kód je osmice bitů, která určuje, že komunikace se týká FPGA a nikoliv FLASH. Kromě rozlišení cíle obsahuje operační kód informace pro SPI řadič uvnitř FPGA.
Adresace cílového zařízení. Datové bity určující adresu zařízení, kterého se komunikace týká. Počet bitů adresní části může být libovolný.
Přenosu dat. Počet přenášených bitů je opět jako v případě adresy libovolný. Data se mohou číst i zapisovat současně. Počet datových bloků je opět neomezen.
Počet bitů adresové i datové části je možné libovolně nastavit podle požadavků dané aplikace. Je nutné si však uvědomit, že ze strany procesoru dochází vždy k přenosu po osmi bitech. Pozor je třeba si dávat na takovou konfiguraci, která může způsobovat nechtěný zápis do zařízení. Tento případ může nastat tehdy, pokud je nevyužitý zbytek bitů osmice (které musí ještě SPI zapsat) větší nebo roven zvolené šířce dat. V tom případě tyto nevyužité bity způsobí další zápis/čtení.
Nejvyšší čtyři bity operačního kódu (0001) udávají identifikaci FPGA. Bity 2,3 operačního kódu jsou vyhrazeny pro budoucí použití. Bit 1 (RE) říká, že se provádí čtení ze zařízení, bit 0 (WE) zápis.
Propojovací systém je sada komponent, které umožňují vytvořit uvnitř FPGA sběrnici dovolující komunikaci mikrokontroleru a libovolného zařízení připojeného k této sběrnici. Protokol i jednotlivé komponenty byly navrženy s ohledem na maximální jednoduchost a minimální počet spotřebovaných zdrojů. Základ tvoří SPI řadič, který provádí jednoduchou konverzi SPI protokolu na vnitřní sériový protokol. Vnitřní sběrnice může být obsazena libovolným počtem SPI dekodérů, jejichž úkolem je jednak dekódovat adresu cílového zařízení, ale hlavně poskytnout jednoduché paralelní rozhraní umožnující obousměrnou komunikaci.
SPI řadič je jednoduchá komponenta, která má za úkol realizovat převod SPI protokolu na interní sériovou sběrnici. Kromě převodu dekóduje, zda se transakce týká FPGA či nikoliv. Signál SPI_SCK je vzorkován hodinovým signálem CLK a detekují se vzestupné a sestupné hrany. Při vzestupné hraně signálu SPI_SCK se provádí čtení bitu signálu SPI_MOSI, při sestupné hraně se mění hodnota signálu SPI_MISO. Veškeré signály vnitřní sběrnice jsou synchronizovány hodinovým kmitočtem CLK.
Po zahájení komunikace (aktivací signálu SPI_CS) řadič postupně načte první čtyři zaslané bity. Pokud se shodují s identifikací přidělené FPGA (0001), je aktivován signál CS a je povoleno generování signálů DO_VLD a DI_REQ. Pokud se identifikace neshoduje, je signál CS neaktivní a řadič čeká na konec transakce indikované deaktivací SPI_CS.
Je-li signál CS neaktivní, musí být signál SPI_MISO i DI ve stavu vysoké impedance Z. Pokud by tomu tak nebylo, byla by znemožněna komunikace MCU s pamětí FLASH. V případě, že si nepřejeme v aplikaci využívat SPI a SPI řadič, je nutné signál SPI_MISO uvést trvale do stavu vysoké impedance.
Popis rozhraní SPI řadiče:
RST : std_logic
Signál, který uvádí řadič do výchozího stavu
CLK : std_logic
Hodinový signál, kterým jsou vzorkovány signály sběrnice SPI. Frekvence CLK musí být pro bezchybnou funkci alespoň 4x vyšší, než je maximální frekvence hodinového signálu SPI_SCK.
SPI_SCK, SPI_CS, SPI_MOSI, SPI_MISO : std_logic
Signály rozhraní SPI.
CS : std_logic
Pokud je CS v log. 0, probíhá komunikace se zařízením uvnitř FPGA (tj. signál CS je aktivní v nule).
DO : std_logic
Seriová data, výstup z mikrokontroleru
DO_VLD : std_logic
Logická 1 signálu DO_VLD určuje platnost dat DO.
DI : std_logic
Sériová data, vstup do mikrokontroleru.
DI_REQ : std_logic
Je-li DI_REQ v logické 1, pak je nutné v následujícím taktu CLK vystavit na vodiči DI další bit datového slova. Bit vystavený na DI musí zůstat platný až do příchodu dalšího požadavku (obr. 3.2).
SPI dekodér je synchronní komponenta, která má za úkol převádět vnitřní sériovou komunikaci na jednoduché paralelní rozhraní, které umožňuje komunikaci s připojenou periferií. Srdce tvoří čtyřstavový automat, čítač počtu přenesených bitů a posuvné registry sloužící k uchování adresy a dat.
V případě, že dojde k aktivaci signálu CS, přijme nejprve dekodér 4bity, které odpovídají čtyřem nejméně významným bitům operačního znaku. V těch je zakódován typ operace - čtení, zápis, případně čtení i zápis. V dalším kroku dekodér přijme určitý parametricky zvolený počet adresních bitů. Po přijmutí adresy se provede komparace určitého počtu nejvyšších bitů (konkrétně ADDR_WIDTH-ADDR_OUT_WIDTH bitů - viz generické parametry dále). Pokud se tyto bity shodují s odpovídajícím počtem nejvyšších bitů bázové adresy (dané generickým parametrem BASE_ADDR), znamená to, že jsou data určena pro zařízení připojené k tomuto dekodéru a pokračuje se přenosem dat. Vždy, když je přijmut určitý počet bitů (daný parametrem DATA_WIDTH), jsou data vystavena na sběrnici DATA_OUT a je generován signál WRITE_EN (je-li zvolen režim zápisu do zařízení, tzn. je nastaven bit WE operačního znaku). Pokud jsme zvolili režim čtení ze zařízení (nastaven bit RE), pak je vždy před zahájením přenosu generován signál READ_EN, který informuje, že je nutné v následujícím taktu CLK vystavit na sběrnici DATA_IN platná data, která budou přenesena do mikrokontroléru.
Popis generických parametrů SPI dekodéru:
ADDR_WIDTH : integer, výchozí hodnota 8
Parametr určující celkovou šířku adresy
DATA_WIDTH : integer, výchozí hodnota 8
Parametr určující šířku dat
ADDR_OUT_WIDTH : integer, výchozí hodnota 4
Šířka adresní sběrnice, která je k dispozici zařízení připojenému k SPI dekodéru. ADDR_OUT_WIDTH musí být menší než ADDR_WIDTH a větší než 0
BASE_ADDR : integer, výchozí hodnota 0x10
Parametr definující bázovou adresu zařízení. Při komparaci se bere v úvahu pouze nejvyšších ADDR_WIDTH-ADDR_OUT_WIDTH bitů.
DELAY : integer, výchozí hodnota 0
Parametr definující zpoždění (počet taktů) mezi požadavkem READ_EN a vystavením dat na DATA_IN. Výchozí hodnota 0 znamená, že data musí být vystavena kombinačně s aktivací signálu READ_EN, tzn., že v cestě mezi daty a signálem DATA_IN nesmí být registr. Pokud máme periferii, která dává výstup se zpožděním 1 takt (typicky synchronní paměti), je nutné změnit parametr na hodnotu 1. Aby byla zaručena správná funkce SPI, musí být maximální hodnota zvolena tak, aby k vystavení dat došlo dříve, než bude aktivován signál DO_VLD (viz. obr. 3.2), tzn. menší než počet taktů CLK mezi DI_REQ a DO_VLD.
Ponecháme-li výchozí parametry, je SPI dekodér mapován do adresového prostoru 0x10 - 0x1F. Na výstupu jsou k dispozici 4 adresní bity, kterými je možné adresovat až 16 registrů s datovou šířkou 8 bitů.
Popis rozhraní SPI dekodéru:
CLK : std_logic
Hodinový signál
CS, DO, DO_VLD, DI, DI_REQ : std_logic
Signály interního sériového rozhraní (SPI řadiče)
ADDR : std_logic_vector(ADDR_OUT_WIDTH-1 downto 0)
Adresa, ze které mají být čtena / zapisována data
WRITE_EN : std_logic
Logická 1 určuje okamžik platnosti dat vystavených na sběrnici DATA_OUT, tzn. okamžik zápisu dat na adresu ADDR.
READ_EN : std_logic
Pokud je signál roven logické 1, je nutné v aktuálním taktu (kombinačně) CLK vystavit na sběrnici DATA_IN platná data z adresy ADDR, která budou v následujícím taktu přečtena a postupně odeslána pomocí SPI do mikrokontroleru. V případě, že parametr DELAY je větší než 0, je nutné platná data vystavit v DELAY-tém následujícím taktu CLK po aktivaci signálu READ_EN.
DATA_OUT : std_logic_vector(DATA_WIDTH-1 downto 0)
Data - výstup do periferie připojené k dekodéru
DATA_IN : std_logic_vector(DATA_WIDTH-1 downto 0)
Data - výstup z periferie připojené k dekodéru
Na obrázku 4.1 je ukázka typické aplikace využívající rozhraní SPI. Obrázek demonstruje, jakým způsobem lze využít navržené komponenty a sestavit složitější celek. Celý systém obsahuje jeden SPI řadič (SPI_ctrl) a několik SPI dekodérů (SPI_adc). Počet SPI dekodérů je závislý na tom, kolik požadujeme disjunktních adresových prostorů a většinou odpovídá počtu jednotlivých zařízení. Aby byla zaručena bezchybná funkce, musí mít každý SPI dekodér zvolenu šířku adresní části (parametr ADDR_WIDTH) a bázovou adresu tak, aby šlo jednoznačně určit cíl. Datová šířka (parametr DATA_WIDTH) i šířka adresní sběrnice ADDR (parametr ADDR_OUT_WIDTH) může být volena podle požadavků daného zařízení. Ukázka funkční konfigurace je v následující tabulce. Entita Addr. dec. / controller znázorňuje vlastní řadič konkrétního zařízení.
zařízení |
ADDR_WIDTH |
DATA_WIDTH |
ADDR_OUT_WIDTH |
BASE_ADDR |
adresový prostor |
device 0 |
8 |
8 |
4 |
0x80 (1000 0000) |
0x80 - 0x8F |
device 1 |
8 |
16 |
6 |
0x40 (0100 0000) |
0x40 - 0x7F |
device 2 |
8 |
24 |
4 |
0x90 (1001 0000) |
0x90 - 0x9F |
Tabulka :