+ All Categories
Home > Documents > U N I V E R Z I T E T U N I Š U E L E K T R O N S K I F A ...es.elfak.ni.ac.rs/Seminar works...

U N I V E R Z I T E T U N I Š U E L E K T R O N S K I F A ...es.elfak.ni.ac.rs/Seminar works...

Date post: 19-Oct-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
30
U N I V E R Z I T E T U N I Š U E L E K T R O N S K I F A K U L T E T U NIŠU Seminarski rad Modul: Elektronika i mikroprocesorska tehnika Tema: Projektovanje i realizacija USB adaptera kao interfejsa za programiranje Atmelove serije mikrokontrolera putem SPI magistrale Mentor: Student: dr.Branislav Petrović Miloš Šapić, 13471 jun 2013.godine
Transcript
  • U N I V E R Z I T E T U N I Š U

    E L E K T R O N S K I F A K U L T E T U NIŠU

    Seminarski rad

    Modul: Elektronika i mikroprocesorska tehnika Tema: Projektovanje i realizacija USB adaptera kao interfejsa

    za programiranje Atmelove serije mikrokontrolera putem SPI magistrale

    Mentor: Student: dr.Branislav Petrović Miloš Šapić, 13471

    jun 2013.godine

  • Sadržaj: 1. Uvod

    1.1. Mikrokontroler Intel 8051 1.2. Programator (adapter)

    2. Mikrokontroler C8051F34 3. Mikrokontroler AT89S8253 4. Universal Serial Bus (USB) 5. Serial peripheral interface (SPI) 6. Opis projektnog zadatka 7. Shematik 8. PCB 9. Softver

  • 1. Uvod

    Mikrokontroler je jedno od najvećih tehničkih dostignuća koje je obeležilo dvadeseti vek. Sa napredkom tehnologije rastao je stepen integracije integrisanih kola, što je dovelo do pojave prvih mikroprocesora i mikrokontrolera. Prvenstveno zbog svoje cene , mikrokontroleri nalaze sve veću primenu u svim oblastima u izradi softverski kontrolisanih uređaja i sistema. Druga velika prednost mikrokontrolera, zbog koje su danas neizbežni, jeste činjenica da se mogu programirati u višim programskim jezicima tipa C, Paskal, Basic. Ovo omogućava njihovo programiranje pa čak i bez znanja asemblerskog jezika. Mikrokontroler je mali računar, realizovan u obliku integrisanog kola koji objedinjuje sve potrebne komponente, kako bi mogao samostalno da funkcioniše. Tu spadaju integrisani mikroprocesor, memorija, digitalni i analogni ulazi/izlazi, tajmeri, brojači, oscilatori i drugi sklopovi (u zavisnosti od vrste i namene mikrokontrolera) koji su ranije bili svaki u svom integrisanom čipu. Mikrokontroler se programira da normalno radi u beskonačnoj petlji i za to vreme očitava ulaze i podešava izlaze u zavisnosti od programa koji mu je zadat. Glavna razlika izmedju mikroprocesora i mikrokontrolera je da su mikrokontroleri optimizovani u pravcu integracije kola, upravljanja procesa u realnom vremenu, male cene i niske potrošnje energije, dok je kod mikroprocesora akcenat stavljen na brzinu i performanse. Znači mikrokontroleri su namenski uređaji koji mogu obavljati određene funkcije u granica koje određuju sami resursi mikrokontrolera, dok se mikroprocesori koriste u opsluživanju spoljnih jedinica. Danas imamo mnogo proizvođača mikrokontrolera koji godišnje proizvedu nekoliko milijardi mikrokontrolera.

    1.1 Mikrokontroler Intel 8051 U familiji Intel-ovih mikrokontrolera izvedenih u vidu jednog čipa mikrokontroler, Intel 8051 je sintetizovan namenski da služi kao procesor u sistemima digitalnog upravljanja. Osnovna varijanta čipa Intel 8051 ima strukturu prikazanu na sl.1. Unutar čipa se nalaze centralna procesorska jedinica (CPU), ROM memorija, RAM memorija, tajmeri, brojači, paralelni i serijski ulazi/izlazi. Sem osnovne verzije, na tržištu se može naći veliki broj varijanti ovog mikrokontrolera, koji se od osnovne verzije razlikuju u broju i vrsti periferijskih komponenti, veličini i tipu ugrađene memorije (RAM i ROM). Ovo uputstvo obuhvata osnovnu varijantu mikrokontrolera 8051, uz opis dodatnih elemenata za mikrokontroler 8052. Osnovne karakteristike mikrokontrolera INTEL 8051 su:

    • 8-bitni CPU; • 4 KB (8 KB za 8052) interne ROM ili EPROM memorije za čuvanje programa, sa

    mogućnošću proširenja do 64 KB spoljašnje memorije; • 128 (256 za 8052) bajtova RAM memorije namenjene za upisivanje i čitanje podataka. U

    ovoj memoriji se nalaze 4 registarske banke od po 8 registara, kao i stek memorija; • 64 KB adresnog prostora memorije podataka;

    3

  • • 64 KB adresnog prostora programske memorije; • 8-bitni pokazivač stek memorije, koji pokriva internu memoriju; • Dva (tri za 8052) programabilna 16-bitna tajmera/brojača; • Programabilni serijski ulaz/izlaz (puni dupleks); • Četiri 8-bitna ulazno/izlazna priključka (portovi P0, P1, P2 i P3); • Tajmerski i ulazno/izlazni prekidi sa dva nivoa prioriteta; • 111 naredbi; • Aritmetičko-logička jedinica (ALU) koja može da izvršava aritmetičke operacije sabiranja,

    oduzimanja, množenja i deljenja, kao i logičke operacije I, ILI, EXILI, komplement i negacija;

    Slika 1. Struktura čipa mikrokontrolera Intel 8051

    1.2 Programator (adapter)

    Upis koda u mikrokontroler može se izvršiti pomoću programatora(adpter), kod koji upisujemo u mikrokontroler je heksadecimalni fajl koji se generise debagiranjem programa, koji je napisan nekom višem programskom jeziku “C” uz pomoc nekog od programa za simulaciju, kompajliranje i debagiranje: Keil uVision 3, Keil uVision 4, mikroC PRO for PIC i sličnih. Zadatak Programatora(adaptera) je da validno preslika podatke iz hex fajla (slika 1.2) u konkretne podatke, čist niz bajtova koji se šalju ciljanom mikrokontroleru, po njegovim pravilima, on se smešta u ROM menoriju odakle se naš program izvršava.

  • 1.2 Opšti struktura HEX fajla

    1.3 Opšti prikaz Programatora

    2. Mikrokontroler C8051F340 Mikrokontroler C8051F34 pripada familiji kontrolera C8051F34x. Najznačajnije karakteristike ove familije kontrolera su: Pravi 10-bitni, 200 kbps, nesimetricni AD konvertor sa analognim multiplekserom,

    ugrađenim temperaturnim senzorom Podrska za USB 2.0 komunikaciju USB Full speed (12 Mbps) or low speed (1.5 Mbps) 1 kB USB bafreske memorije Brzo jezgro mikrokontrolera iz familije 8051 ( 48/25 MIPS-a) 64/32 kB Flash memeorije 4325/2304 bajta RAM-a

    5

  • SMBus/I2C, UART, i SPI serijski interfejs su ugrađeni u samom hardveru Četiri 16-bitna tajmera opšte namene Interni oscillator na frekvenciji od 80kHz Regulator napona Programabilni niz brojač-a/tajmer-a sa Watchdog timer funkcijom

    Sa regulatorom napona, resetom, Watchdog Timer-om i oscilatorom, C8051F34x uređaji su zaista odlično rešenje za jedan samostalni sistem na čipu. Fleš memorija može biti reprogramirana čak i u samom kolu, i to promene memorisanih podataka i dozvolom nadogradnje 8051 firmware-a. Korisnički program ima potpunu kontrolu svih periferija, I može individualno gasiti jednu ili sve periferije sa ciljem smanjenja potrošnje. Dvožičani razvojni interfejs napravljen od strane Silicon Labs-a omogućava debagiranje na samom čipu. Ova logika za debagiranje podržava modifikaciju sadržaja memorije i registara, postavljanje prekidnih tačaka, prolaženje kroz program korak-po-korak, pokretanje zaustavljanje komandi. Sve analogne i digitalne periferije su potpuno funkcionalne u toku debagiranja korišćenjem C2 logike. Uredjaji su specificirani za rad pri naponu od 2.5 V do 5.25 V, u temperaturnom opsegu od -40 do +85 °C. Blok dijagram C8051F340/1/2/3/4/5/6/7/A/B prikazan je na Slici 2.1.

    slika 2.1. Blok dijagram C8051F340/1/2/3/4/5/6/7/A/B

    Na slici 2.2 prikazan je raspored pinova kod C8051F34/1/2/3/4/5/6/7/A/B

  • Slika 2.2 raspored pinova

    • VDD – Digitalno napajanje. Mora biti povezano. • GND – Digitalna masa. Mora biti povezana. • GNDA – Analogna masa • REGIN – Ulaz za regulator napon napona • -D i +D – Ulazi za USB diferencijalni prenos podataka • RST/C2CK – Reset ili takt za C2 debagiranje • C2D – bidirekcioni pin za C2 debagiranje

    3. Mikrokontroler AT89S8253 Potrebno je pogledati opis i analiza rad mikrokontrolera AT89S8253 zato što je to ciljani mikrokontroler i sva podešavanja programatora se vrse prema njemu tj u cilju zadovoljavana njegovih uslova:

    - Kompatibilan je sa Microsoft-51 procesorom - 12KB fleš memorija - SPI serijski unos za učitavanje programa - 10 000 ciklusa upis/brisanje - 2KB EEPROM memorija - 100 000 ciklusa upis/brisanje (64-bajtna korisnička matrica) - Napon napajanja od 2.7V do 5.5 V - Frekvencija od 0 do 24 MHz - Memorijsko zaključavanje u 3 nivoa - 256 x 8-bitni unutrašnji RAM - 32 I/O linije za programiranje - Tri 16-bitna Tajmer/Brojač - 9 generatora prekida

    7

  • - Poboljšani UART serijski port sa centriranjem detekcije greške i automatskim prepoznavanjem adrese - Male snage napajanja - Uspostavljanje prekida u niskom režimu rada - Programabilni tajmeri - Dvostruki pokazivač podataka - Isključivanje pomoću znaka (Power-off Flag) - Fleksibilni ISP programator (byte i page modovi) - Page mode: 64 byte/page za kodnu memoriju, 32 byte/page za memoriju podataka - 4-nivo poboljšani kontrolor prekida - Programabilna x2 clock opcije - Unutrašnji Power-on Reset - 42-pin PDIP model kućišta za redukovanje EMS emisije - Zeleni (Pb/Holide-free) opcija kućišta

    AT89S8253 je processor visokih performansi, male potrošnje snage. To je CMOS 8-bitni mikrokontroler sa 12 KB fleš memorijom i 2 KB EEPROM memorijom. Mikrokontroler je napravljena u Atmel korporaciji i kompatibilna je sa nadaleko poznatim i popularnim intelovom MCS-51 familijom mikrokontrolera (8052). Reprogramiranje memorije je moguće pomoću SPI serijskog ulaza ili pomoću konvencionalnog programatora memorija. Kombinovanjem različitih 8-bitnih CPU-a sa ugrađenom programibilnom fleš memorijom na monolitnom čipu. FLASH I EEPROM se mogu reprogramirati u sistemu preko SPI-porta. Atmel AT89S8253 je fleksibilan procesor koji je zahvaljujući niskoj ceni našao veliku primenu kod mnogih kontrolnih aplikacija i programa. Blok dijagram AT89S8253 prikazan je na slici 3.1

    Slika 3.1 Struktura čipa mikrokontrolera AT89S53 Potrebno je pogledati opis i analiza rad mikrokontrolera AT89S8253 zato što je to ciljani mikrokontroler i sva podešavanja programatora trebaju biti u skladu sa njegovim zahtevima

  • 4. Universal Serial Bus (USB) C8051F34x mikrokontroler ima podršku za USB full speed (12 Mbps) i low speed( 1.5 Mbps) komunikaciju, 1k RAM organizovan kao red, ulazni pinovi imaju Pull-up otpornike, na slici 4.1 prikazan je struktura USB perifreije.

    Slika 4.1 blok šema USB periferije

    Kada se podatak primi sa PC on se smešta na endpoint-a adresu, u našem slučaju kontroler poseduje 4 endpoint adrede na koje smešta podatke, endpointovi su bidirekcioniog tipa IN/OUT, pored endpoint adresiranja postoje i ostali načini adresiranja podatka koji stiže od strane računara: Interrupt Flags , Common Registers, Indexed Registers , FIFO access. Gde će se smestiti podatak koji se nalazi u USB0DATA registru, određuje sadržaj registra USB0ADR, što je najbolje ilustrovano na slici 4.2.

    9

  • Slika 4.2 Načini adresiranja

    Ako USB radi u Low speed režimu onda je potrebna frekvencija USB clocka 6 MHz, a ako se radi o Full speed modu onda USB clocka treba da ima vrednost 48 MHz, što je prikazano na u narednoj tabeli.

    USB endpoint ima nekoliko modova rada:

    - Bulk transfer mod - Interrupt transfer mod - Control mod - Isochronous mod

    BULK transfer mod – koristi se u situacijam kada vreme nije kritičan factor, bulk mod je bolji u odnosu na druge modove u tom smislu što on vrši upis za svo vreme koje mu stoji na raspolaganju, te stoga može da prenese veliku količinu podataka INTERRUPT mod – koristi se kada je potrebno da se transfer podataka obavi u tačno određenom vremenskom intervalu, primer primene je tastatura.

  • ISOCHRONOUS mod – koristi se u real-time transfera, kada podatci moraju da stižu u konstantnim vremenskim intervalima i gde se tolerisu graske. CONTROL mod – ovaj mod može da prenose podatci koji definisani od strane USB-a i šalju se korisniku da bi se upoznao sa konfiguracijom uređaja Pri izradi našeg projekta nismo direktno programirali rad USB preiferije, vec smo koristili gotoe bibliotečke API (Application Program Interface) funkcije za rad sa USB periferiom, biblioteka smo preuzeli sa silabsovog sajta (AN169, USBXpress) i inkludovali u naš projekat, da bi smo uopste mogli da koristimo funkcije koje su dostupne. Funkcije koje smo mi koristili u našem kodu i koje su dostupne prikazane su na slici 4.3 i 2.4.

    slika 4.3 Dostupne API funkcije

    11

  • Slika 4.4 API funkcije

    5. Serial peripheral interface (SPI) SPI (Serial Peripheral Interface) standard za sinhronu serijsku komunikaciju razvijen je od strane Motorolinih inženjera, za potrebu brzog i pouzdanog serijskog prenosa podataka na manjim rastojanjima (do 3m). Prvobitno, ovaj standard je bio predviđen za komunikaciju sa perifernim uređajima, ali je vremenom razvijena i mogućnost komunikacije između više mikrokontrolera ili mikroprocesora . SPI komunikaciom mogu da se razviju brzine i do 2Mb/s sto je oko 10 puta brže od standardnih nacina komunikacije. Pri SPI prenosu, podaci se šalju preko pomeračkog registra sa serijskim izlazom, a primaju preko pomeračkog registra sa serijskim ulazom. U bilo kom trenutku može da postoji jedan master, kako bi se osigurala ispravna komunikacija. Kao što je prikazano na Slici 5.1 potrebne su 4 linije, odnosno za SPI komunikaciju koriste se 4 pina:

    slika 5.1 povezivanje jednog mastera sa tri slave-a u SPI komunikaciju

    • MOSI (Master Output Slave Input). Kada mikrokontroler radi kao master, onda je ovo

    li- nija za slanje podataka, a kada radi kao slave – ovo je linija za primanje podataka.

  • • MISO (Master Input Slave Output). Kada mikrokontroler radi kao master, onda je ovo linija za primanje podataka, a kada radi kao slave – ovo je linija za slanje podataka. U slu-čaju da je komunikacija isključivo jednosmerna, svakako da se može ostvariti sa tri linije (bez MOSI ili MISO, zavisno od slučaja).

    • SCK (SPI Clock). Ovo je linija za takt pod kojim se izvodi komunikacija. Takt daje master, a pomerački registar slave-a prima podatke, odnosno očitava ulaz na promenu ovog takta.

    • NSS (Slave Select). Ovaj pin mikrokontrolera se veže na liniju za selektovanje slave-a. Kada mikrokontroler radi kao slave, i kada je ovaj pin na niskom nivou, a ako je pin na visokom nivou mikrokontroler radi ako master.

    U našem slučaju postoje tri načina rada SPI periferije to su:

    • Trožičani master mod – NSS je postavljen na nulu, ovaj način komunikacije se najčešće koristi kada je u pitanju point-to-point komunikacija između master-a i slave-a(slika 5.2)

    Skija 5.2 trožičani režim rada

    • Četvorožičani slave mod rada ili multi-master mod rada, kao što se vidi sa slike 5.3

    namenjen je za komunikaciju između dva mastera

    Slika 5.3 Multi-Master mod rada

    • Četvorožičani master mod rada, komunikacija u kojoj učestvju jedan master i više

    slavova (slika 5.4)

    13

  • slika 5.4 Četvorožičani master mod rada

    Na slici 5.5 dat je blok dijagram SPI periferije C8051F34x mikrokontrolera.

    Slika 5.5 Blok dijagram SPI

  • Upravljačka SPI logika mastera poseduje dva parametra (CKPOL i CKPHA) preko kojih se definišu četiri režima (moda) rad. Na taj način, omogućeno je da master postavi polaritet i fazu takta, kako bi se omogućila velika fleksibilnost za komunikaciju između mastera i slave-a. Pri CKPOL=0 (bazična vrednost takta je 0) važi sledeća logika:

    • CKPHA = 0 (podatak se čita na rastuću, a menja na opadajuću ivicu takta) • CKPHA = 1 (podatak se čita na opadajuću, a menja na rastuću ivicu takta)

    Pri CKPOL=1 (bazična vrednost takta je 1) važi logika : • CKPHA = 0 (podatak se čita na opadajuću, a menja na rastiću ivicu takta) • CKPHA = 1 (podatak se čita na rastuću ivicu takta, a menja na opadajuću)

    Na narednim slikama biće prikazani načini konfigurisanja CKPOL i CKPHA.

    Slika 5.6 Master mod Podešavanje clock-a

    Slika 5.7 Slave mod (CKPHA=0)

    15

  • Slika 5.8 Slave mod (CKPHA=1)

    Registri pomoću kojih se konfigurise rad SPI periferije su:

    • SPI0CFG - konfiguracioni registar • SPI0CN - kontrolni regista • SPI0CKR - definiša se takt • SPI0DATA – registar u koji se smeštaju podatci koji se prenose preko SPI

    6. Opis projektnog zadatka Projektni zadataj je isprojektovati PCB layout, Shematic, softwer USB adaptera koa interfejsa za programiranje Atmelove seriej mikrokontrolera putem SPI magistrale. Na raspolaganju nam je Silabsov mikrokontroler C8051F34x pomoću koga trebamo realizovati postupak programiranja Atmelove serije, HEX fajl se šalje sa PC-a (USB-om) smešta u mikrokontroler gde se “prepakuje” da bi mogo da se pošalje Atmelovom kontroleru i smesti se u njegov ROM odakle se program izvrsava, Što je slikovito prikazano na slici 6.1

    slika 6.1 opšti prikaz projektnog zadatka

  • 7. Shema Na slici je prikazana na slici 7.1, prema projektnom zadatku naša šema sadrži mikrokontroler kao ključni deo projekta, USB 2.0 port, 4-pinski priključak za SPI. Odlučili smo se za USB mini kućište zbog samih dimenzija pločice koja nije velika (125x50)mm te je stoga praktičnije manje kućište, pored toga potrebno je obezediti napajanje mikrokontrolera, signalizaciju i praćenje cele faze programiranja. Odlučili smo se za rešenje u kom se mikrokontroler napaja sa USB-a, pošto USB na svom VBUS pinu daje napona od +5V sa neznatnim varijacijama napona, to se može iskoristiti za napajanje mikrokontrolera, međutim zbog toga što je radni napon kontraolera (2.5-5.25) ne smemo rizikovati da napon direktno dovoedemo na µC stoga je potrebno ubaciti i jedan LDO (Low drop out) regulator, na izlazu daje napon od stabilnih +3.3V a na ulaz mu se dovodi +5V. Dalje treba obezbediti signalizaciju, tj da se zna u kojoj fazi se trenutno nalazi naš programator, za ovo su zadužene diode koje se softverski pale. Potrebno je još i obezbediti mogucnost da se i sam C8051F34x isprogramira, preko 10-pinskog konektora, i dugme koje hardverski resetuje µC.

    slika 7.1 šema veze

    slika 7.2 blok za napajanjeµC

    17

  • Na slici 2.7 je prikazan blok za napajanje µC, uloga U2 je objašnjena ranije, kondezatori služe za stabilizaciju napona.

    sliak 7.3 reset kolo i 10-pinski port za programiranje

    slika 7.3 miniUSB ulaz

    Na slici 7.3 pored miniUSB ulaza prikazan i diodni sistem za zaštitu od naponskog prekoračenja, i kondezatori za stabilizaciju napona.

    slika 7.4 deo šeme za signalizaciju

    Pomoću diode D4, D5, D6 se signalizira npr. dali ima napajanja, dali je počeo USB transfer podataka, dali je SPI počeo da šalje podatke, ovo se izvodi softwerski.

  • sliak 7.5 SPI izlaz prema Atmelu

    U sledećoj tabeli su dat je spisak komponenata koje smo koristili za izradu našeg projekta.

    8. PCB Izgled PCB je prikazan na slicvi 8.1(top layer), 8.2(bottom layer), pri izvođenju PCB-a i layout težili smo ka tome da sve uradimo u jednim sloju.

    19

  • slika 8.1 PCB top Layer

    slika 8.2 PCB bottom layer

  • 9. Softver Sistem funkcioniše na sledeći način: Sa PC-a se šalje HEX fajl na menjen Atmelu, kada na naš µC stignu podatci sa USB periferije on se interaptije i ulazi u interapt servis rutinu za obradu prekida, kada se obarada prekida završi dolazi podiže se softverski flag koji omogućava da se u main procesu uđe u rurinu za slanje podataka preko SPI preiferije. Prilikom konfiguracije i rada sa USB-om korostili smo gotove API funkcije.(detaljno objašnjenje u 4 glavi). Na sledećoj slici dat je okviran algoritam.

    Algoritam toka procesa

    U daljem delu cemo se baviti kodom in a taj način objasniti princip rada. //------------------------------------------------------------------------------------------------------- // Deklaracija promenljivih za komunikaciju // //------------------------------------------------------------------------------------------------------- sbit Led1 = P3^3; // LED = '1' USB transfer ON sbit Led2 = P3^5; // LED = '1' NSS ON sbit SW2 = P2^0; // SW2 = '0' means switch pressed #define SYSCLK 12000000

    21

  • unsigned j; unsigned i = 0; unsigned char P_flag=0x00; unsigned char ISR_flag=0x00; unsigned char size_data=0x00; unsigned char FMS_flag=0x01; //****4 Atmel byts******// unsigned char WRITE_Memory_B1=0x40; //****end***// unsigned char TYPEDATA=0x00; // da se sacuva tip podatka BYTE Out_Packet[21] BYTE SPI_Buffer[21]; BYTE SPI_Buffer_send[21]; /*** [BEGIN] USB Descriptor Information [BEGIN] ***/ code const UINT USB_VID = 0x10C4; code const UINT USB_PID = 0xEA61; code const BYTE USB_MfrStr[] = {0x1A,0x03,'S',0,'i',0,'l',0,'i',0,'c',0,'o',0,'n',0,' ',0,'L',0,'a',0,'b',0,'s',0}; // Manufacturer String code const BYTE USB_ProductStr[] = {0x10,0x03,'U',0,'S',0,'B',0,' ',0,'A',0,'P',0,'I',0}; //Product Desc. String code const BYTE USB_SerialStr[] = {0x0A,0x03,'1',0,'2',0,'3',0,'4',0}; code const BYTE USB_MaxPower = 15; // Max current = 30 mA (15 * 2) code const BYTE USB_PwAttributes = 0xC0; // Bus-powered, remote wakeup not supported code const UINT USB_bcdDevice = 0x0100; // Device release number 1.00 /*** [ END ] USB Descriptor Information [ END ] ***/ //****** ZA FSM ******// #define FSM_INIT 0 #define FSM_DATASIZE 1 #define FSM_ADDRESS 2 #define FSM_TYPEDATA 3 #define FSM_DATA 4 #define FSM_CHECKSUM 5 #define DELIMI 0x3A //HEX ':' delimiter //*****end******/// U predhodnom delu koda odrađena je deklaracija i inicijalizacija promenljivih, koje se koriste u narednoma delu kojda. //----------------------------------------------------------------------------- // PORT_IO_Init //----------------------------------------------------------------------------- void Port_IO_Init() { XBR0 &= ~0x02; // mora maskiranjem zbog USB API !! XBR1 &= ~0x40; } //----------------------------------------------------------------------------- // SPI0_Init //----------------------------------------------------------------------------- // // Configure SPI0 for 8-bit, 1,5MHz SCK, Master mode, polled operation, data

  • // sampled on 1st SCK rising edge. void SPI_Init (void) { SPI0CFG = 0x60; SPI0CN = 0x09; SPI0CKR = 0x11; // za programiranje, SPI 1.5Mhz dakle F_spi=SYCLK/2*(SPI0CKR+1) SYSCLK=48 => // SPI0CKR=17 } void Interrupts_Init() { // Prioritet prekida se definise preko dva SFR registra // IP or EIP2 // IE: Interrupt Enable // IP: Interrupt Priority // EIE1: Extended Interrupt Enable 1 IP = 0x30; //najveci prioritet ima timer , UART, USB EIE1 = 0x02; IE = 0xB0; } void Initialize(void) { Port_IO_Init(); // Initialize Port Oscillator_Init(); // Initialize Oscilator SPI_Init (); // Initialize SPI0; Interrupts_Init(); // Initialize Interrupts } U prehodnom delu koda je obavljena inicujalizacija Portova, SPI periferije, Interapta. / Example ISR for USB_API void USB_API_TEST_ISR(void) interrupt 17 { P3^5=1; BYTE INTVAL = Get_Interrupt_Source(); if (INTVAL & RX_COMPLETE) { Block_Read(Out_Packet, 22); Delay(100); SPI_Buffer[0] = Out_Packet [0]; SPI_Buffer[1] = Out_Packet [1]; SPI_Buffer[2] = Out_Packet [2]; SPI_Buffer[3] = Out_Packet [3]; SPI_Buffer[4] = Out_Packet [4]; SPI_Buffer[5] = Out_Packet [5]; SPI_Buffer[6] = Out_Packet [6]; SPI_Buffer[7] = Out_Packet [7]; SPI_Buffer[8] = Out_Packet [8];

    23

  • SPI_Buffer[9] = Out_Packet [9]; SPI_Buffer[10] = Out_Packet [10]; SPI_Buffer[11] = Out_Packet [11]; SPI_Buffer[12] = Out_Packet [12]; SPI_Buffer[13] = Out_Packet [13]; SPI_Buffer[14] = Out_Packet [14]; SPI_Buffer[15] = Out_Packet [15]; SPI_Buffer[16] = Out_Packet [16]; SPI_Buffer[17] = Out_Packet [17]; SPI_Buffer[18] = Out_Packet [18]; SPI_Buffer[19] = Out_Packet [19]; SPI_Buffer[20] = Out_Packet [20]; SPI_Buffer[21] = Out_Packet [21]; //TR2= 1; //iniciranje tajmera nakon prijema paketa putem USB-a ISR_flag=1; // flag } if (INTVAL & DEV_SUSPEND) { Suspend_Device(); } if (INTVAL & DEV_CONFIGURED) { Initialize(); } FMS_flag=0x01; while(FMS_flag=0x01) { static char state = 0; switch(state) { //***dve tacke***// case FSM_INIT: if(SPI_Buffer[0]==DELIMI) { state = FSM_DATASIZE; } else { // nesto prema PC } breake; //***duzino podatka***// case FSM_DATASIZE: state_data=FSM_ADDRESS; // set next FSM state size_data=SPI_Buffer[1]; // set interbyte timeout chksum+=size_data; // checksum breake; //***adresa***// case FSM_ADDRESS: state=FSM_TYPEDATA; // set next FMS steate SPI_Buffer_send[i] = WRITE_Memory_B1;

  • SPI_Buffer_send[i++] = SPI_Buffer[2]; SPI_Buffer_send[i++] = SPI_Buffer[3]; chksum+=SPI_Buffer[2]; chksum+=SPI_Buffer[3]; break; //***tip podataka***// case FSM_TYPEDATA: state=FSM_DATA; //set next steate TYPEDATA=SPI_Buffer[4]; chksum+=SPI_Buffer[4]; break; //--**DATA**--// case FMS_DATA: state=FSM_CHECKSUM; // set next steate for(k=4;k

  • //----------------------------------------------------------------------------- // Main Routine //----------------------------------------------------------------------------- void main(void) { USB_Clock_Start(); // Init USB clock *before* calling USB_Init USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,USB_MaxPower,USB_PwAttributes,USB_bcdDevice); USB_Int_Enable(); Initialize(); PCA0MD &= ~0x40; // Disable Watchdog timer BYTE PROG_Read_Atmel_Signature (); if(SPI0DATA==0x1E) { P_flag=0x01; } while (P_flag); { P3^3=1; while(ISR_flag==1) SPI0DAT=SPI_Buffer[j] j++ if(j==21) { j=0; ISR_flag=0; } } } Main prigram u kome se na početku inicijalizuje USB, disejbluje se Watchdog timer,zatime se procedurom BYTE PROG_Read_Atmel_Signature () proverava dali je upitanju Atmel, jer je identifikcija deo procedure programiranja, ako jeste nastavlja se sa daljim izvršenjem koda, sledći deo koda je zadužen za slanje bajta preko SPI, prvo se čeka da USB interapt završi sa svojom rutinom i podigne ISR_Flag dalje se bajtovi jedan po jedan prebacuju u SPI0DAT registar i šalju Atmelu. //----------------------------------------------------------------------------- // User-defined types, structures, unions etc //----------------------------------------------------------------------------- #ifndef BYTE #define BYTE unsigned char #endif #ifndef UINT

  • #define UINT unsigned int #endif //----------------------------------------------------------------------------- // Global Constants //----------------------------------------------------------------------------- BYTE PROG_Read_Atmel_Signature(void); void Execute_SPI(void); void Delay_us (BYTE time_us); void Delay_ms (BYTE time_ms); unsigned char programming_enable[2] = {0xAC, 0x53}; unsigned char read_signature_array[3] = {0x28,0x00,0x30}; unsigned char x; unsigned char sign; //----------------------------------------------------------------------------- // main() Routine //----------------------------------------------------------------------------- void Execute_SPI(void) { EA = 1; // Enable global interrupts RST_Target = 0; Delay_ms (10); SPI0CN = 0x01; // Enable RST_Target = 1; CLK_Target = 0; Delay_us (80); PROG_Read_Atmel_Signature(); //**F sign = SPI0DAT; TI0 = 1; printf ("SPI podatak %d \n", sign); } BYTE PROG_Read_Atmel_Signature () //**F { // Reading a byte from the EEPROM is a three-step operation. // po prospektiu iz datasheta prvo se salju bajtovi 28h, dontcare bajt(0x00), 30h // posle slanja sekvence ovih bajtova, od Atmela(slava) se ocekuje da potvrdi // da se tadi o Atmelu, tako sto ce poslati 1Eh // Step1: Send the READ command SPI0DAT = read_signature_array[0]; while (!SPIF); SPIF = 0; // Delay_us (120); // Step2: Send the READ command SPI0DAT = read_signature_array[1]; while (!SPIF); SPIF = 0; // Delay_us (120); // Step3: Send the READ command SPI0DAT = read_signature_array[2];

    27

  • while (!SPIF); SPIF = 0; // Delay_us (120); // Step3: Read the value returned SPI0DAT = 0x00; // Dummy write to output serial clock while (!SPIF); // Wait for the value to be read SPIF = 0; Delay_us (1); return SPI0DAT; } //----------------------------------------------------------------------------- // Support Subroutines //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Delay_us //----------------------------------------------------------------------------- // // Return Value : None // Parameters : 1. time_us - time delay in microseconds // range: 1 to 255 // // Creates a delay for the specified time (in microseconds) using TIMER2. The // time tolerance is approximately +/-50 ns (1/SYSCLK + function call time). // //----------------------------------------------------------------------------- void Delay_us (BYTE time_us) { TR2 = 0; // Stop timer TF2H = 0; // Clear timer overflow flag TMR2 = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) ); TR2 = 1; // Start timer while (!TF2H); // Wait till timer overflow occurs TR2 = 0; // Stop timer } //----------------------------------------------------------------------------- // Delay_ms //----------------------------------------------------------------------------- // // Return Value : None // Parameters : 1. time_ms - time delay in milliseconds // range: 1 to 255 // // Creates a delay for the specified time (in milliseconds) using TIMER2. The // time tolerance is approximately +/-50 ns (1/SYSCLK + function call time). // //----------------------------------------------------------------------------- void Delay_ms (BYTE time_ms) { BYTE i; while(time_ms--)

  • for(i = 0; i< 10; i++) // 10 * 100 microsecond delay Delay_us (100); } //----------------------------------------------------------------------------- // End Of File //--------------------------- Predhodni deo koda predstavlja procedure za utvrđivanje identiteta Atmel-a. LIteratura: USB Complete Everything You Needto Develop Custom USB PeripheralsThird Edition /Jan Axelson/ AN169 The Silicon Laboratories USBXpress® Development Kit /http://www.silabs.com/Support%20Documents/TechnicalDocs/an169.pdf/ C805134x datasheet /http://www.silabs.com/Support%20Documents/TechnicalDocs/c8051f34x.pdf/ C8051f34x development kit /http://www.silabs.com/Support%20Documents/TechnicalDocs/c8051f34x-dk.pdf/ AT89S8253 datasheet / http://www.wvshare.com/datasheet/ATMEL_PDF/AT89S8253.PDF/

    29

    http://www.silabs.com/Support%20Documents/TechnicalDocs/an169.pdfhttp://www.silabs.com/Support%20Documents/TechnicalDocs/c8051f34x.pdfhttp://www.silabs.com/Support%20Documents/TechnicalDocs/c8051f34x-dk.pdfhttp://www.silabs.com/Support%20Documents/TechnicalDocs/c8051f34x-dk.pdfhttp://www.wvshare.com/datasheet/ATMEL_PDF/AT89S8253.PDF


Recommended