6.5. avr_rauta. spi-ohjelmointia

6
1 6.5. AVR_rauta. SPI, Serial Peripheral Interface 07.11.2007 pva ”Viisaus tulee vanhenemisen myötä. Toisinaan vanheneminen tulee yksin.” - Tuntematon Tavoite Oppia käyttämään SPI-sarjaväylää kahden AVR-ohjaimen välillä. Sisältö Yleistä SPI-toiminta SPI-rekisterit SPI-siirron mallikoodit Yleistä SPI on alunperin Motorolan kehittämä synkroninen, kaksisuuntainen sarjasiirto- protokolla jota käytetään lyhyillä välimatkoilla, siis lähinnä piirikortin sisäiseen tiedonsiirtoon. Se on nykyään hyvin laajalti käytetty mm. (AVR)mikro-ohjaimissa ja niiden oheispiireissä (ADC- ja DAC-muuntimet, muistipiirit). SPI on nopea ja yksinkertainen tapa siirtää tietoa mikro-ohjaimen ja oheispiirien välillä. Siinä ei käytetä osoitteita eikä kuittausta - se on vain helppo ja nopea tapa siirtää tietoa sarjamuotoisesti. Tiedonsiirto tapahtuu Master-Slave-systeemillä ja on Masterin hallitsemaa. Kummassakin, siis lähettävässä ja vastaanottavassa piirissä on 8-bittinen siirtorekisteri. AVR voidaan konfiguroida molempiin moodeihin (master/slave), mutta esim. jotkut anturit-sensorit vain slave-moodiin. Datan siirto tapahtuu full duplex-periaatteella, jossa dataa siirtyy molempiin suuntiin samanaikaisesti. Data voidaan siirtää LSB- tai MSB-bitti ensimmäisenä. SPI määrittää vain data-liikennelinjat ja kellon. Kättelyä, datavuon ohjausta, eikä kuittausjärjestelyä (acknowledgement) ei ole käytössä. Kun tavun siirto on valmis, ja jos keskeytysjärjestely on konfiguroitu, vastaanotettu merkki voidaan lukea talteen koneen muistiin

Upload: digindom

Post on 09-Apr-2015

259 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 6.5. AVR_rauta. SPI-ohjelmointia

1

6.5. AVR_rauta. SPI, Serial Peripheral Interface 07.11.2007 pva

”Viisaus tulee vanhenemisen myötä. Toisinaan vanheneminen tulee yksin.” - Tuntematon Tavoite Oppia käyttämään SPI-sarjaväylää kahden AVR-ohjaimen välillä. Sisältö Yleistä SPI-toiminta SPI-rekisterit SPI-siirron mallikoodit Yleistä SPI on alunperin Motorolan kehittämä synkroninen, kaksisuuntainen sarjasiirto-protokolla jota käytetään lyhyillä välimatkoilla, siis lähinnä piirikortin sisäiseen tiedonsiirtoon. Se on nykyään hyvin laajalti käytetty mm. (AVR)mikro-ohjaimissa ja niiden oheispiireissä (ADC- ja DAC-muuntimet, muistipiirit). SPI on nopea ja yksinkertainen tapa siirtää tietoa mikro-ohjaimen ja oheispiirien välillä. Siinä ei käytetä osoitteita eikä kuittausta - se on vain helppo ja nopea tapa siirtää tietoa sarjamuotoisesti. Tiedonsiirto tapahtuu Master-Slave-systeemillä ja on Masterin hallitsemaa. Kummassakin, siis lähettävässä ja vastaanottavassa piirissä on 8-bittinen siirtorekisteri. AVR voidaan konfiguroida molempiin moodeihin (master/slave), mutta esim. jotkut anturit-sensorit vain slave-moodiin. Datan siirto tapahtuu full duplex-periaatteella, jossa dataa siirtyy molempiin suuntiin samanaikaisesti. Data voidaan siirtää LSB- tai MSB-bitti ensimmäisenä. SPI määrittää vain data-liikennelinjat ja kellon. Kättelyä, datavuon ohjausta, eikä kuittausjärjestelyä (acknowledgement) ei ole käytössä. Kun tavun siirto on valmis, ja jos keskeytysjärjestely on konfiguroitu, vastaanotettu merkki voidaan lukea talteen koneen muistiin

Page 2: 6.5. AVR_rauta. SPI-ohjelmointia

2

SPI-toiminta SPI-protokollassa on käytössä seuraavat pinnit: 2 data signaalia

MISO, Master In Slave out, slave lähettää MOSI, Master Out Slave In, master lähettää ja sen slave vastaanottaa

2 control signals, SCLK-clock ja /SS –slave select

SCK, Serial Clock, master lähettää, synkronoi datan siirron SS, Slave Select (no addressing)

- jos useita orjia, jokainen slave tarvii erillisen slave select-signaalin. CS tekee master, sillä valitaan slave or devise.

Bitit siirretään Masterista Slaveen ja samanaikaisesti Slavesta Masteriin samalla Masterin generoimalla kellolla, joten 8 clk-pulssia ja datat on vaihdettu samanaikaisesti. Uutta dataa ei voi siirtää datarekisteriin ennenkuin ed. on shiftattu pois alta. Vastaanotettu tavu kirjoitetaan Receiver Bufferiin kun kaikki data on siirretty. Receiver Buffer tulee lukea ja siirtää muistiin talteen ennen kuin uutta siirretään. Kun siirto ok, SPIF asetetaan in SPSR. Se aiheuttaa keskeytyksen, jos SPIE on asetettu ja global keskeytysbitti on ON. Mode hoidetaan by MSTR-bit on SPCR, control rekisteri. Slave vain vastaanottaa ja lähettää dataa, kunhan master generoi kellosignaalin. Master generoi kellon vain lähettäessään dataa. Tämä merkitsee sitä, että masterin täytyy lähettää dataa kun se haluaa lukea slavea.

Page 3: 6.5. AVR_rauta. SPI-ohjelmointia

3

SPI-rekisterit SPI - tiedonsiirtoa varten tarvitaan kolme rekisteriä:

SPI Control Register SPI Status Register SPI Data Register

Data kirjoitetaan ja luetaan data-rekisteristä, tiedonsiirto käynnistetään SPI Control rekisteristä. SPCR, SPI Control Register Bitti 7 6 5 4 3 2 1 0 Nimi SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0

Bitti Nimi Merkitys Toiminto 7 SPIE SPI Interrupt Enable

when SPIF bit in SPSR register is set -an interrupt occures.

0: disable, 1: enable

6 SPE SPI Enable 0: disable, 1: enable 5 DORD Data Order, bittien järjestys siirrossa 0: MSB first, 1: LSB first 4 MSTR Master/Slave Select

If SS input is low level while MSTR is set, MSTR will be cleared and SPIF flag in SPSR will be set (interrupt occures). After this user has to re-enable MSTR to continue in master mode;

0: Slave SPI mode, 1: Master SPI mode

3 CPOL Clock Polarity 2 CPHA Clock Phase 1 SPR1 Clock rate selection (refer to table in datasheet); 0 SPR0 Clock rate selection (refer to table in datasheet);

SP12X SPR1 SPR0 Kellon valinta 0 0 0 CK/4 0 0 1 CK/16 0 1 0 CK/64 0 1 1 CK/128 1 0 0 CK/2 1 0 1 CK/8 1 1 0 CK/32 1 1 1 CK/64

CLK polarity useimmiten on käytössä polarity 0, clk-line is 0 in the quiscent state ja data kirjoitetaan nousevalla reunalla ja luetaan laskevalla reunalla. polarity 1, päinvastoin. SPSR, SPI Status Register Bitti 7 6 5 4 3 2 1 0 NIMI SPIF WCOL - - - - - SP12X

Bitti Nimi Merkitys Toiminto 7 SPIF SPI Interrupt Flag 0: 1: serial transfer complete 6 WCOL Write COLlision Flag 0: 1: if the SPDR is written

during a data transfer 0 SP12X Double SPI Speed Bit 0: MSB first, 1: SPI speed

doubled SPDR, SPI Data Register Bitti 7 6 5 4 3 2 1 0 Nimi MSB LSB

Page 4: 6.5. AVR_rauta. SPI-ohjelmointia

4

SPI-siirron mallikoodit Tarvitaan kaksi PV-M32-korttia, toinen ohjelmoidaan allaolevilla koodeilla SPI_Masteriksi ja toinen SPI_Slaveksi. Koodeissa on ohjeet miten toimitaan. SPI_Master mallikoodi /************************************************** ******** Project : SPI_Master.c Hardware: PV-M32-MOOkit (4 MHz)+ PV-LEDIT on PORTA Liitä 10-pinninen lattakaapeli Master- ja Slave- korttien B-porttien välille Software: AVRStudio4.13 + WinAVR-20070525 Date : 01.11.2007 Author : [email protected] Comments: Master lähettää Slave-kortille tavuja by SPI (= PORTB) *************************************************** *******/ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> // function prototypes void wait(uint16_t time); void SPI_MasterInit(void); void SPI_MasterTransmit(uint8_t data); int main(void) { DDRA = 0xFF; // näyttää lähtevän merkin uint8_t i; uint8_t text[] = "Microsalo"; SPI_MasterInit(); for(i=0; i<9; i++) { SPI_MasterTransmit(text[i]); PORTA = text[i]; wait(500); } } void SPI_MasterInit(void) { // set MOSI and SCK and SS out DDRB = (1<<5) | (1<<7) |(1<<4); // PB5 = MOSI, PB7 = SCK, PB4 = SS // DDRB &= ~(1<<6); // MISO in // enable SPI, Master, clockrate fck/16 and LSB f irst SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) | (1<<DOR D); } void SPI_MasterTransmit(uint8_t data) { // start transmission PORTB &= ~(1<<4); // SS alas SPDR = data;

Page 5: 6.5. AVR_rauta. SPI-ohjelmointia

5

// wait for transmitted complete while (!(SPSR & (1<<SPIF))); } // *** Primitive wait() *** void wait(uint16_t time) { uint16_t i; for(i=0;i<2000;i++) _delay_loop_2(time); } SPI-Slave mallikoodi /************************************************** ******** Project : SPI_Slave.c Hardware: PV-M32-MOOkit (4 MHz) + PV-EMO Liitä 10-pinninen lattakaapeli Master- ja Slave- korttien B-porttien välille Software: AVDRStudio4.13 + WinAVR-20070525 Date : 01.11.2007 Author : [email protected] Comments: Slave-card vastaanottaa tavuja by SPI (= PORTB) ja tulostaa ne PV-EMOn LCD-näyttöön Lataa ohjelmat, liitä korttien B-portit yhteen lattakaapelilla, resetoi slave ja sitten master. *************************************************** *******/ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "lcd_tat.h" #define MASKI 1<<1 #define RIVI 0 #define SARAKE 0 // function prototype void wait(uint16_t time); void SPI_SlaveInit(void); // globaali muuttuja uint8_t datas = 0x00; uint8_t i=0; int main(void) { DDRD = 0xFF; DDRC |= (1<<0) | (1<<1); PORTC |= 1<<0; // taustavalo LCD_init(1, 0, 0); // lcd käyttöön SPI_SlaveInit(); sei(); // globaali keskeytys ON while(1) { PORTC = PORTC ^ MASKI; wait (50); } }

Page 6: 6.5. AVR_rauta. SPI-ohjelmointia

6

void SPI_SlaveInit(void) { // set MISO output, all others in DDRB = (1<<PB6); // PB6 = MISO // enable SPI SPCR |= (1<<SPE); // SPI enable SPCR |= 1<<SPIE; // SPI interrupt enable SPCR |= 1<<SPR0; // jako 16 SPCR |= 1<<DORD; // LSB first } // SPI interrupt, vastaanotto ISR(SPI_STC_vect) { static uint8_t i=0; datas = SPDR; LCD_SetCursorXY(SARAKE + i, RIVI); LCD_WriteChar(datas); i++; } // *** Primitive wait() *** void wait(uint16_t time) { uint16_t i; for(i=0;i<2000;i++) _delay_loop_2(time); } Analysointi Tutustu tähän materiaaliin huolella ja tutki koodien kommentit, niin selviää mitä tehdään ja miksi. Datan siirto, Master-mode Master aloittaa datan siirron vetämällä Slaven SS-linjan alas. Master generoi kellopulssit, CLK. Data siirtyy Masterista Slaveen by MOSI, Slavesta Masteriin by MISO. Tavun siirron jälkeen Master synkronoi Slaven vetämällä SS ylös. Kun SS Low, kirjoita data SPDR-rekisteriin. Kellon CLK:n tahdissa 8-bittiä siirretään Masterista Slaveen. Kun CLK stop, SPIF-lippu asetetaan ja siirrytään keskeytysohjelmaan jossa tulostetaan tullut merkki LCD-näyttöön. jatkuu.. kirjoitetaan seuraava tavu=merkki SPDR-rekisteriin, jne...