Kör du SPI i master mode på en AVR? läs!

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
adent
Inlägg: 4245
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Kör du SPI i master mode på en AVR? läs!

Inlägg av adent »

Upptäckte just den hårda vägen följande:

En AVR som har hårdvaru-SPI har 4 pinnar för detta:

MOSI
MISO
SCK
SS

SS är Slave select och används som ingång för Chip Select när man kör AVR:en som slave.
inga problem med det.

Men tydligen är det så att kör man SPI i AVR:en i master mode och har SS-pinnen som ingång så avbryts all utsändning och SPI:n ställer om sig till
slav om SS går låg. Detta händer förstås slumpmässigt om man bara satt den till ingång utan pullup/down.
Det är visst en feature på nått vis, man kan vara både master och slave. I mitt fall var det inte en feature :)

Så gör ni nån design där AVR:en bara ska vara master så använd inte SS-pinnen som ingång för något annat. Utgång går bra.

MVH: Mikael
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av Icecap »

Att ha en ingång utan att den har fasta digitala värden är i sig ett allvarligt designmiss.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av jesse »

Jag brukar sätta SS-pinnen som utgång när jag kör SPI, annars blir det svårt att styra slavarna. Har jag många slavar brukar jag multiplexa SS-pinnen.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av blueint »

Hur är det tänkt att SS pinnen skall fungera?
Användarvisningsbild
AndLi
Inlägg: 18282
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av AndLi »

Så går det när man inte lusläser databladet innan kretsdesign :D
Jag har själv gjort nästan samma sak, jag använde dock SS som ingång till något, och någon annan pinne som CS..
limpan4all
Inlägg: 8449
Blev medlem: 15 april 2006, 18:57:29
Ort: Typ Nyköping

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av limpan4all »

Välkänt fenomen....
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av jesse »

blueint skrev:Hur är det tänkt att SS pinnen skall fungera?
Den används som "Chip Select" - CS.... Aktiverar slaven när den går låg.
Användarvisningsbild
adent
Inlägg: 4245
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av adent »

Logiskt sett så borde SS-pinnen inte ha någon funktion när SPI är i master-mode. Det har den inte heller OM den är satt till utgång, alltså kan man använda vilken pinne som helst för CS på sina slavar.

Jag har två slavar så och en av dem råkade ha SS-pinnen för CS. Men just den slaven har jag inte lött in på kortet än
så när jag testade hade jag inte brytt mig om att sätta den till utgång. Därav mina problem. Tur i oturen att jag
inte valt SS som ingång i min design.

BlueInt: SS är CS _IN_ när SPI är i slave mode. Tydligen används den som CS _IN_ även i master mode, men BARA om pinnen är satt som ingång, annars är den ingenting särskilt.

Tänkte bara vara snäll att bespara nästa icke datablads-lusläsare de 4 timmar det tog mig att hitta. Speciellt som hårdvaran var helt ny också. Felet kunde (ur min synpunkt) ha varit nästan vad som helst.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av Icecap »

Jag kan hålla med om att sådana "fel" kan vara synnerligt svårhittat, visst står det i databladet men man ska ju lusläsa precis allt och när man upplever felet första gången kan det ju lika väl vara programmeringfel. Så det är bra att du skriver det här så att andra får kännedom, samtidig är det en typisk: "ta inget för givit!" tråd.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av jesse »

Logiskt sett så borde SS-pinnen inte ha någon funktion när SPI är i master-mode. Det har den inte heller OM den är satt till utgång, alltså kan man använda vilken pinne som helst för CS på sina slavar
En anledning att använda just den pinnen som SS-pinne är väl just det att det annars kan vara lätt att glömma bort att den inte får användas som ingång till något annat.

Angående att köra AVR-processorn som slav så har jag haft väldigt svårt för att få det att fungera bra. Kör man SPI i t.ex. 500kHz så har man inte mycket tid på sig att ta emot data innan det är borta igen. Om man inte har möjlighet att ligga och polla hela tiden (oftast gör man ju något annat än att bara vänta på SPI hela tiden) så måste man göra ett interrupt som triggas av CS - låg flank. Men interruptet tar sån tid att starta (Om man programmerar i C) att man mycket lätt missar första byten... Ännu svårare är att hinna få med den data som ska komma som svar... Jag har inte lyckats lösa problemet särskilt bra. Trots det använder jag en Attiny461 som SPI-slav för att ta emot kommandon och sända data. Tror jag kör ett par "dummy"-bytes i början för att den ska hinna med. Det fungerar "klockrent", men jag känner mig ändå inte nöjd.

Det fungerar ju om man kan manipulera mastern att skicka som man vill (t.ex. långsamt, speciella bytes etc), men inte om man har en "färdig" master som skickar ut massa data i hög hastighet... Det är grymt svårt att fånga upp... :doubt:

Allra bäst fungerar SPI förstås om man ha shiftregister att klocka in / ur all data med. Det har jag också gjort och det fungerar extremt bra. Läser bland annat av ett antal knappar och tänder/släcker ett antal lysdioder med en enda byte SPI (åtta bitar in och åtta ut samtidigt via två shiftregister). Bara man ser till att ha ett litet lågpassfilter på CS och klockan, annars kan det bli konstigheter när man kör på några meters avstånd.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av stekern »

jesse skrev:Angående att köra AVR-processorn som slav så har jag haft väldigt svårt för att få det att fungera bra. Kör man SPI i t.ex. 500kHz så har man inte mycket tid på sig att ta emot data innan det är borta igen. Om man inte har möjlighet att ligga och polla hela tiden (oftast gör man ju något annat än att bara vänta på SPI hela tiden) så måste man göra ett interrupt som triggas av CS - låg flank. Men interruptet tar sån tid att starta (Om man programmerar i C) att man mycket lätt missar första byten..
Det låter märkligt att interruptet skulle ta sån tid att starta att man missar första byten.
Om du kör processorn i 10MHz och SPIn i 500kHz så skall du väl ha ca 160 (8*10/0.5) instruktioner på dig innan ens datan kommit fram från negativ flank på CS?
Har du disassemblat och kollat vad som görs i början av interruptrutinen?
ds77
Inlägg: 2459
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av ds77 »

Använder du inte interruptet för mottagen byte? Eller tar det för lång tid? Jag har för mig att ner mot klockfrekvens/4 ska gå och håller man sig på /8 så ska det vara bra med marginal. Det kanske är läge att kolla hur klocksignalen från mastern ser ut?

För övrigt så har jag också gjort mig skyldig till att inte lusläsa databladet om hur SS-pinnen beter sig, det tog ett tag att felsöka innan jag hittade vad det var...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kör du SPI i master mode på en AVR? läs!

Inlägg av jesse »

Det var ett tag sedan jag bökade med det där och jag blev inte riktigt nöjd... Det bästa vore ju om man lyckades fixa bra rutiner för att kommunicera som slav och som fyller på en buffert med data (samt läser ut en buffer med utdata)... Problemet jag hade sist, om jag minns rätt, var att jag inte var säker på om det var SPI-rutinerna som var kassa eller om jag var dålig på att ta hand om den data som kom in. Det var nämligen ganska knepig information som skulle tolkas. Hur som helst blev det inte bra. (Buggar har man ju gott om ändå... :| )

En sak som var knepig var att jag skulle shifta ut åtta bitar i den allra första byten. De måste alltså finnas laddat i SPI-shiftregistret när CS går låg - sedan ska ju bitarna shiftas ut så fort klockan börjar röra sig. Problemet var att dessa åtta bitar skulle uppdateras dynamiskt hela tiden. Då gäller det att man inte gör det när den håller på att skicka eller ta emot data... Då hamnar det i osynk. Tror jag löste det genom att jag hade en varaibel i SRAM som flyttades över till SPI när den startade. Men då gällde det att vara snabb. (Jag körde med 8 MHz intern RC-klocka).
Skriv svar