|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
s56wie Profesionalec
Pridružen/-a: Ned Apr 2004 0:17 Prispevkov: 54
|
Objavljeno: Tor Dec 21, 2010 6:15 pm Naslov sporočila: SPI Master-Slave med dvema AT89S8253 |
|
|
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 |
|
|
tiger Mojster
Pridružen/-a: Čet Apr 2004 22:19 Prispevkov: 20 Kraj: Škofja Loka
|
|
Nazaj na vrh |
|
|
s56wie Profesionalec
Pridružen/-a: Ned Apr 2004 0:17 Prispevkov: 54
|
Objavljeno: Pon Dec 27, 2010 6:11 pm Naslov sporočila: |
|
|
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 |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Pon Dec 27, 2010 8:27 pm Naslov sporočila: |
|
|
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 |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Tor Dec 28, 2010 7:49 am Naslov sporočila: |
|
|
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 |
|
|
s56wie Profesionalec
Pridružen/-a: Ned Apr 2004 0:17 Prispevkov: 54
|
Objavljeno: Sre Dec 29, 2010 11:58 am Naslov sporočila: |
|
|
RudiP. Zamenjava kristalov žal ni pomagala. |
|
Nazaj na vrh |
|
|
s56wie Profesionalec
Pridružen/-a: Ned Apr 2004 0:17 Prispevkov: 54
|
Objavljeno: Sre Dec 29, 2010 1:13 pm Naslov sporočila: |
|
|
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 |
|
|
logist Novinec
Pridružen/-a: Pet Okt 2010 9:08 Prispevkov: 6
|
Objavljeno: Čet Mar 24, 2011 11:02 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|