Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

SPI Master-Slave med dvema AT89S8253

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
s56wie
Profesionalec


Pridružen/-a: Ned Apr 2004 0:17
Prispevkov: 54

PrispevekObjavljeno: Tor Dec 21, 2010 6:15 pm    Naslov sporočila: SPI Master-Slave med dvema AT89S8253 Odgovori s citatom

Pozdravljeni vsi!

Žal nikjer nisem našel bascom-8051 primera strojne SPI komunikacije med dvema AT89S8253 od katerih bi bil eden
master drugi slave.
Glede na to, da v Bascom-8051 za ta AT89S8253 ne deluje Watchdog z bascom ukazi, me zanima ali za ta MIC tudi ne delujejo BASCOM SPI ukazi. CONFIG SPI, SPIINIT, SPIOUT SPIIN.

Nastavitev za master:
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4

Nastavitev za slave:
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , Polarity = High , Phase = 0 , Clockrate = 4

Prav tako mi ni jasno kdaj uporabiti SPIINIT, CONFIG SPI=ON/OFF. Nikjer nisem zasledil kateri ukjazi se uporabljajo pri software-SPI in kateri pri hardware-SPI.
Želel bi vspostaviti strojno komunikacijo med dvema AT89S8253 z uporabo pinov P1.4 SS, P1.5 MISO, P1.6 MOSI, P1.7 SCK.

V datashetu za AT89S8253 se na strani 23 začne opis komunikacije.

Prosim vas za razlago priklopa ter Master in Slave, demo kodo napisano v bascom-8051. Idealen bi bil tudi zgled komunikacije z uporabo serijskega inerrupta in sočasno brenje podatkov z strojnega UART-a in strojnega SPI.

Vsem se za pomoč v naprej zahvaljujem!
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Yahoo Messenger - naslov
tiger
Mojster


Pridružen/-a: Čet Apr 2004 22:19
Prispevkov: 20
Kraj: Škofja Loka

PrispevekObjavljeno: Sob Dec 25, 2010 5:39 pm    Naslov sporočila: Odgovori s citatom

http://atmel.com/dyn/resources/prod_documents/doc2585.pdf
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
s56wie
Profesionalec


Pridružen/-a: Ned Apr 2004 0:17
Prispevkov: 54

PrispevekObjavljeno: Pon Dec 27, 2010 6:11 pm    Naslov sporočila: Odgovori s citatom

Nikakor mi ne uspe SPI komunikacija, ki bi delovala brezhibno.
Spodaj sta programa za Master in Slave. MOSO-MOSI-SCK so vezani drug na drugega, na Slave pa je SS vezan na GND.
Program naj bi vrednosti spremenljivk S1,S2,S3,S4,S5 iz slave po SPI vodilu poslal na Master. Za prenos podatkov tipa Single, ki v ramu zasede 4 byte sem uporabil trik z Y(1) spremenljivko tipa byte, ki se v ramu nahaja 1 byte pred S1, tako da z indeksi spremenljivke Y(2-22) dostopam do posameznih bytov spremenljivk S1-S5.
V masterju spremenljivkam s1-s5 določim vrednosti (kakeršne naj bi kasneje prejel iz slave) in jih izpišem, da vidim, kakšne byte moram prejeti. Nato S1-S5 določim vrednost 0. Ter začnem z komunikacijo.

Ko je komunikacija končana, še enkrat izpišem vrednosti, da jih lahko pimerjam.

Stvar pa mi ne deluje. Prvi byte (Y1) vedno prenese brezhibno, tudi spremenljivko S1 večinoma prenese, byte za s2 in ostale pa prejmem vrednosti, ki sem jih poslal iz masterja. Kot da v data register na slave nisem vpisal ničesar. Zato domnevam, da je problem na Slave strani!?

SpiSlave.bas
'$sim
$large
$regfile = "89s8253.dat" 'Atmel AT89Ss8253
$crystal = 22118400 'Uporabljen kristal 22.1184MHz
'///////////////////////////////////////////////////////////////////////////////
'// Nastavitev UART prenosa podatkov //
'///////////////////////////////////////////////////////////////////////////////
$baud = 4800 'Hitrost prenosa 4800
Enable Serial 'Vklučimo prekinitev
On Serial Serrut
'///////////////////////////////////////////////////////////////////////////////
'// Nastavitev SPI hardware prenosa podatkov z Seatalk procesorjem //
'///////////////////////////////////////////////////////////////////////////////
'Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 128
'Spiinit
'Config Spi = On

Spi_data Alias Spdr

Spi_spif Alias Spsr.7
Spi_wcol Alias Spsr.6
Spi_lden Alias Spsr.5
Spi_disso Alias Spsr.1
Spi_enh Alias Spsr.0

Spi_spie Alias Spcr.7
Spi_spe Alias Spcr.6
Spi_dord Alias Spcr.5
Spi_mstr Alias Spcr.4
Spi_cpol Alias Spcr.3
Spi_cpha Alias Spcr.2
Spi_spr1 Alias Spcr.1
Spi_spr0 Alias Spcr.0

Spi_disso = 0 'Za normalno uporabo mora biti 0
'Spi_enh = 1 'Hitri SPI način
Spi_enh = 0 'Normalni SPI način

Spi_spie = 1 'SPI Interrupt = On
Spi_dord = 0 'Data Order = Msb
Spi_mstr = 0 'Master = N0
Spi_cpol = 0 'Polariti = Low
Spi_cpha = 0 'Phase = 0
Spi_spr1 = 1 'Clockrate = 128 - nepomembno, ker ga generira Master
Spi_spr0 = 1 'Clockrate = 128 - nepomembno, ker ga generira Master

Spi_spe = 1 'Config Spi = On

'///////////////////////////////////////////////////////////////////////////////
Dim Novuartbyte As Bit : Novuartbyte = 0
Dim Uartbyte As Byte : Uartbyte = 0

Dim Novspibyte As Bit : Novspibyte = 0
Dim Spibyte As Byte : Spibyte = 0

Dim Y(1) As Byte : Y(1) = 170
Dim S1 As Single : S1 = 10 '2-5
Dim S2 As Single : S2 = 20 '6-9
Dim S3 As Single : S3 = 30 '10-13
Dim S4 As Single : S4 = 40 '14-17
Dim S5 As Single : S5 = 50 '18-21

'///////////////////////////////////////////////////////////////////////////////
Enable Interrupts
'///////////////////////////////////////////////////////////////////////////////
Spdr = Y(1) 'Pripravim podatek v SPData register
Do
If Novspibyte = 1 Then

Novspibyte = 0
End If

If Novuartbyte = 1 Then

Novuartbyte = 0
End If

Loop
'*******************************************************************************
Serrut:
Disable Serial

If Spsr.7 = 1 Then 'Preverim ali gre za SPI interrupt (SPIF)
Spibyte = Spdr 'Preberem prispel byte in hkrati izklučim interrupt
Do
' If Spi_lden = 1 And Spi_wcol = 0 Then
If Spi_wcol = 0 Then
Spdr = Y(spibyte) 'V Data register vnesem novo vrednost
Exit Do
End If
Loop
Novspibyte = 1 'Javim, da je pispel NovSPIbyte
End If

If Scon.0 = 1 Then 'Preverim ali gre za UART interrupt
Uartbyte = Inkey() 'Preberem znak z UART
If Uartbyte > 0 Then
Novuartbyte = 1 'Javim, da je prispel NovUARTbyte
End If
End If

Enable Serial
Return
'*******************************************************************************

End




SpiMaster.bas

'$sim
$large
$regfile = "89s8253.dat" 'Atmel AT89Ss8253
$crystal = 22118400 'Uporabljen kristal 22.1184MHz
'///////////////////////////////////////////////////////////////////////////////
'// Nastavitev UART prenosa podatkov //
'///////////////////////////////////////////////////////////////////////////////
$baud = 4800
Enable Serial 'Vklučimo prekinitev
On Serial Serrut
'///////////////////////////////////////////////////////////////////////////////
'// Nastavitev SPI hardware prenosa podatkov z Seatalk procesorjem //
'///////////////////////////////////////////////////////////////////////////////
'Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128
'Spiinit
'Config Spi = On

Spi_spif Alias Spsr.7
Spi_wcol Alias Spsr.6
Spi_lden Alias Spsr.5
Spi_disso Alias Spsr.1
Spi_enh Alias Spsr.0

Spi_spie Alias Spcr.7
Spi_spe Alias Spcr.6
Spi_dord Alias Spcr.5
Spi_mstr Alias Spcr.4
Spi_cpol Alias Spcr.3
Spi_cpha Alias Spcr.2
Spi_spr1 Alias Spcr.1
Spi_spr0 Alias Spcr.0

Spi_disso = 0 'Za normalno uporabo mora biti 0
'Spi_enh = 1 'Hitri SPI način
Spi_enh = 0 'Normalni SPI način

Spi_spie = 1 'SPI Interrupt = On
Spi_dord = 0 'Data Order = Msb
Spi_mstr = 1 'Master = YEes
Spi_cpol = 0 'Polariti = Low
Spi_cpha = 0 'Phase = 0
Spi_spr1 = 1 'Clockrate = 128
Spi_spr0 = 1 'Clockrate = 128

Spi_spe = 1 'Config Spi = On

'///////////////////////////////////////////////////////////////////////////////
Dim I As Byte : I = 0

Dim Novuartbyte As Bit : Novuartbyte = 0
Dim Uartbyte As Byte : Uartbyte = 0

Dim Novspibyte As Bit : Novspibyte = 0
Dim Spibyte As Byte : Spibyte = 0

Dim Y(2) As Byte
Dim S1 As Single : S1 = 0 '03-06
Dim S2 As Single : S2 = 0 '07-10
Dim S3 As Single : S3 = 0 '11-14
Dim S4 As Single : S4 = 0 '15-18
Dim S5 As Single : S5 = 0 '19-22

'///////////////////////////////////////////////////////////////////////////////
Enable Interrupts
'///////////////////////////////////////////////////////////////////////////////
Print
Print "**Start**"

For I = 1 To 22
Y(i) = 0
Next

S1 = 10
S2 = 20
S3 = 30
S4 = 40
S5 = 50
Print
Print " Y(01)=" ; Y(1)
Print " Y(02)=" ; Y(2)
Print "Single S1:" ; S1 ; " " ; Y(3) ; " " ; Y(4) ; " " ; Y(5) ; " " ; Y(6)
Print "Single S2:" ; S2 ; " " ; Y(7) ; " " ; Y(8) ; " " ; Y(9) ; " " ; Y(10)
Print "Single S3:" ; S3 ; " " ; Y(11) ; " " ; Y(12) ; " " ; Y(13) ; " " ; Y(14)
Print "Single S4:" ; S4 ; " " ; Y(15) ; " " ; Y(16) ; " " ; Y(17) ; " " ; Y(18)
Print "Single S5:" ; S5 ; " " ; Y(19) ; " " ; Y(20) ; " " ; Y(21) ; " " ; Y(22)
Print " Y(23)=" ; Y(23)

S1 = 0
S2 = 0
S3 = 0
S4 = 0
S5 = 0

I = 2
Spdr = I 'Pošljem prvi byte

Do
If Novspibyte = 1 Then

If I = 23 Then
Print "--Prejeto--"
Print " Y(01)=" ; Y(1)
Print " Y(02)=" ; Y(2)
Print "Single S1:" ; S1 ; " " ; Y(3) ; " " ; Y(4) ; " " ; Y(5) ; " " ; Y(6)
Print "Single S2:" ; S2 ; " " ; Y(7) ; " " ; Y(8) ; " " ; Y(9) ; " " ; Y(10)
Print "Single S3:" ; S3 ; " " ; Y(11) ; " " ; Y(12) ; " " ; Y(13) ; " " ; Y(14)
Print "Single S4:" ; S4 ; " " ; Y(15) ; " " ; Y(16) ; " " ; Y(17) ; " " ; Y(18)
Print "Single S5:" ; S5 ; " " ; Y(19) ; " " ; Y(20) ; " " ; Y(21) ; " " ; Y(22)
Print " Y(23)=" ; Y(23)
Print "*** END ***"
End If

If I < 23 Then
Print " " ; I ;
Y(i) = Spibyte
I = I + 1
Do
' If Spi_lden = 1 And Spi_wcol = 0 Then
If Spi_wcol = 0 Then
Spdr = I
Exit Do
End If
Loop

End If

Novspibyte = 0
End If

If Novuartbyte = 1 Then

Novuartbyte = 0
End If

Loop
'*******************************************************************************
Serrut:
Disable Serial

If Spsr.7 = 1 Then 'Preverim ali gre za SPI interrupt
Spibyte = Spdr 'Preberem prispel byte in hkrati izklučim interrupt
Novspibyte = 1 'Javim, da je pispel NovSPIbyte
End If

If Scon.0 = 1 Then 'Preverim ali gre za UART interrupt
Uartbyte = Inkey() 'Preberem znak z UART
If Uartbyte > 0 Then
Novuartbyte = 1 'Javim, da je prispel NovUARTbyte
End If
End If

Enable Serial
Return
'*******************************************************************************

End
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Yahoo Messenger - naslov
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Pon Dec 27, 2010 8:27 pm    Naslov sporočila: Odgovori s citatom

Oj,

predlagam ti, da si na LCD-ju (ali serijskem portu) večkrat v programu izpisuješ vrednosti spremenljivk in tako ugotoviš, kje je problem.

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Tor Dec 28, 2010 7:49 am    Naslov sporočila: Odgovori s citatom

Probaj zamenjati kristala na obeh mikroprocesorjih z manjšo frekvenco. Npr. 11,0592 Mhz. Uporabljena Frekvenca je zelo visoka ter ti lahko dela probleme.
_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
s56wie
Profesionalec


Pridružen/-a: Ned Apr 2004 0:17
Prispevkov: 54

PrispevekObjavljeno: Sre Dec 29, 2010 11:58 am    Naslov sporočila: Odgovori s citatom

RudiP. Zamenjava kristalov žal ni pomagala.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Yahoo Messenger - naslov
s56wie
Profesionalec


Pridružen/-a: Ned Apr 2004 0:17
Prispevkov: 54

PrispevekObjavljeno: Sre Dec 29, 2010 1:13 pm    Naslov sporočila: Odgovori s citatom

Ojla!

Problem je rešen.

Oba programa (Master in Slave delujeta popolnoma pravilno).

Napaka je bila, da sem oba mikrokontrolerja povezal za zunanjim kabnlom. Uporabil sem tistega iz PC.ja, ki je namenjen avdio povezavi CD-roma in zvočne kartice (zdel se je zelo priročen). V tem kablu so dve žičke in oplet. Očitno je zaradi opleta, ki je v mojem primeru bil (MISO) pri prenosu prišlo do takšnih motenj, da stvar ni delovala oz. je bilo ogromno napak. Sedaj, ko sem to povezavo uredil, stvar deluje brezhibno, tako da vsi, ki bi želeli uporabljati komunuikacijo SPI, lahko oba programa (master in slave) uporabite za vajo.

LP
Gregor
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Yahoo Messenger - naslov
logist
Novinec


Pridružen/-a: Pet Okt 2010 9:08
Prispevkov: 6

PrispevekObjavljeno: Čet Mar 24, 2011 11:02 pm    Naslov sporočila: Odgovori s citatom

Mene pa zanima če je taka komunikacija izvedljiva z SPI :
[mcu1]<mcu2>[SD]

povezava v smeri Mcu1 > Mcu2 ne predstavlja problema ker je osnovna tipična Master/Slave komunikacije, prav tako ne povezava v smeri Mcu2-> SD, ampak predstavlja pa mi težava prehodi Mcu2 iz slave v master režim. A bascom omogoča prehod med master/salve v slave/master izvajanjem programa? Ali pa če obstaja možnost, da konfiguriram dva SPI režima, kjer se na eni strani mcu2 obnaša kot slave na drugi kot master?

SPI sem izbral zaradi hitrosti in ker sta tx in rx že poralbjena za komunikacijo.

Lp,
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group