AVR utbildningskurs. Arbetar med SPI-modul. Läsa och skriva data. Ch2. Hur man arbetar med SPI - Theory Spi input

Överför gränssnitt.

Många dataöverföringsgränssnitt har utvecklats för att överföra data från en enhet till en annan eller från ett chip till ett annat. Varje gränssnitt har både positiva och negativa sidor, så du behöver veta vilka gränssnitt som finns, deras för- och nackdelar, och använda rätt gränssnitt för att överföra data i en given situation.

Gränssnitt levereras med asynkron och synkron dataöverföring. Med synkron dataöverföring sänds en klocksignal samtidigt med datan, vilket gör att mottagaren och sändaren kan synkroniseras. Ett exempel på ett sådant protokoll är SPI-gränssnittet.

Vid asynkron dataöverföring finns ingen klocksignal. I sådana linjer finns det risk för missanpassning mellan mottagare och sändare, vilket gör att ytterligare data inte kommer att tas emot korrekt. För att förhindra detta utför asynkrona gränssnitt periodisk synkronisering längs datalinjer. Fördelen med sådana gränssnitt är det mindre antalet ledare som krävs för överföring.

Låt oss ta en närmare titt på flera av de mest populära gränssnitten.

USART-gränssnitt.

USART-gränssnittet är en seriell universell synkron-asynkron transceiver. Data överförs till USART med jämna mellanrum. Denna tidsperiod bestäms av den specificerade USART-hastigheten och anges i baud (för tecken som bara kan ta värden lika med noll eller ett, är baud ekvivalent med bitar per sekund). Det finns ett allmänt accepterat utbud av standardhastigheter: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600.

Utöver databitarna lägger USART automatiskt in synkroniseringsmärken i strömmen, de så kallade start- och stoppbitarna. Vid mottagning tas dessa extra bitar bort. Vanligtvis separerar start- och stoppbitarna en byte med information (8 bitar), men det finns USART-implementationer som tillåter 5, 6, 7, 8 eller 9 bitar att överföras. Bitarna separerade av start- och stoppsignalerna är minsta sändning. USART låter dig infoga två stoppbitar under överföring för att minska sannolikheten för mottagare och sändare avsynkronisering i tung trafik. Mottagaren ignorerar den andra stoppbiten och behandlar den som en kort paus på linjen.

Konventionen är att det passiva (i frånvaro av data) tillstånd för USART-ingången och -utgången är en logisk "1". Startbiten är alltid en logisk "0", så USART-mottagaren väntar på en övergång från "1" till "0" och räknar från den ett tidsintervall på halva bitens varaktighet (mitten av startbitöverföringen) . Om inmatningen för närvarande fortfarande är "0", startar processen för att ta emot minimipaketet. För att göra detta, räknar mottagaren 9 bitars varaktighet i rad (för 8-bitars data) och registrerar ingångstillståndet vid varje ögonblick. De första 8 värdena är mottagna data, det sista värdet är ett testvärde (stoppbit). Stoppbitvärdet är alltid "1", om det faktiska mottagna värdet är annorlunda, registrerar USART ett fel.

För att bilda tidsintervall har de sändande och mottagande USART:erna en källa för exakt tid (klockning). Noggrannheten hos denna källa måste vara sådan att summan av felen (mottagare och sändare) vid inställning av tidsintervallet från början av startpulsen till mitten av stopppulsen inte överstiger hälften (eller ännu bättre, åtminstone en fjärdedel) av bitintervallet. För ett 8-bitars meddelande 0,5/9,5 = 5% (i verkligheten inte mer än 3%). Eftersom detta är summan av mottagar- och sändarfel plus eventuell signalförvrängning på linjen, är den rekommenderade toleransen för USART-klockningsnoggrannhet inte mer än 1,5 %.

Eftersom klockbitarna upptar en del av bitströmmen är den resulterande UART-genomströmningen inte lika med anslutningshastigheten. Till exempel, för 8-bitars 8-N-1 formatöverföringar, upptar klockbitarna 20 % av strömmen, vilket för en fysisk hastighet på 115 200 baud ger en databithastighet på 92 160 bps eller 11 520 byte/s.

Paritetskontroll

USART-protokollet har förmågan att automatiskt övervaka dataintegriteten med hjälp av bitparitetsmetoden. När den här funktionen är aktiverad är den sista databiten ("paritetsbiten") alltid 1 eller 0, så att antalet ettor i en byte alltid är jämnt.

Flödeskontroll

Förr i tiden kunde USART-enheter vara så långsamma att de inte kunde hålla jämna steg med den inkommande dataströmmen. För att lösa detta problem försågs USART-moduler med separata flödeskontrollutgångar och -ingångar. När ingångsbufferten var full ställde logiken för den mottagande USART in inhiberingsnivån på motsvarande utgång, och den sändande USART avbröt överföringen. Senare tilldelades flödeskontroll till kommunikationsprotokoll och behovet av separata flödeskontrolllinjer försvann gradvis.

Fysiskt genomförande.

USART är ett utbytesprotokoll, d.v.s. den bestämmer metoden för bitbildning, byteöverföringsparametrar, överföringshastighet, etc.

Men den fysiska implementeringen av USART kan vara annorlunda. Till exempel, för att överföra data inom ett kort, sänds signaler på +5V och 0V nivåer. För att överföra data över långa avstånd och mellan enheter används andra fysiska spänningsnivåer och standarder, såsom: strömslinga (4-20 mA), RS-232 (COM-port), RS-485 och liknande.

För att konvertera "kontroller"-nivåer på 0-5V till "standard"-nivåer finns det ett stort antal specialiserade mikrokretsar, till exempel ADM202 för RS-232.

Seriellt gränssnitt SPI

Namnet SPI är en förkortning för "Serial Peripheral Bus", vilket återspeglar dess syfte - en buss för anslutning av externa enheter. SPI-bussen är organiserad enligt master-slav-principen. Bussmastern är vanligtvis en mikrokontroller, men den kan också vara programmerbar logik, en DSP-kontroller eller en ASIC. Enheter som är anslutna till mastern är slavar. Deras roll spelas av olika typer av mikrokretsar, inkl. lagringsenheter (EEPROM, Flash-minne, SRAM), realtidsklocka (RTC), ADC/DAC, digitala potentiometrar, specialiserade styrenheter, etc.

Huvudbyggstenen i SPI-gränssnittet är ett konventionellt skiftregister, vars synkroniserings- och bitströmsin-/utsignaler bildar gränssnittssignalerna. Således är det mer korrekt att kalla SPI-protokollet inte för ett dataöverföringsprotokoll, utan ett datautbytesprotokoll mellan två skiftregister, som vart och ett samtidigt utför både funktionen av en mottagare och en sändare. En förutsättning för dataöverföring på SPI-bussen är genereringen av en busssynkroniseringssignal. Endast ledaren har rätt att generera denna signal och slavens arbete beror helt på det.

Förbindelse.

Det finns tre typer av anslutningar till SPI-bussen, som var och en involverar fyra signaler. Syftet med SPI-signaler beskrivs i Tabell 7.1.

Den enklaste anslutningen, som endast involverar två mikrokretsar, visas i figur 7.2. Här sänder bussmastern data längs MOSI-linjen synkront med SCLK-signalen som genereras av den, och slaven fångar de överförda databitarna på vissa kanter av den mottagna synkroniseringssignalen. Samtidigt skickar slaven sitt datapaket. Den presenterade kretsen kan förenklas genom att eliminera MISO-linjen om den använda slav-IC inte tillhandahåller svarsdataöverföring eller om det inte finns något behov av det. Envägsdataöverföring kan hittas i sådana chips som DAC, digitala potentiometrar, programmerbara förstärkare och drivrutiner. Det övervägda alternativet för att ansluta en slav-IC kräver således 3 eller 4 kommunikationslinjer.

För att slav-IC:en ska ta emot och sända data måste SS-linjen förutom att ha en klocksignal också drivas lågt. Annars kommer slav-IC:en att vara inaktiv. När endast en extern IC används kan det vara frestande att eliminera SS-linjen genom att driva slav-IC:s valda ingång hårt låg. Denna lösning är extremt oönskad och kan leda till misslyckanden eller till och med omöjligheten av dataöverföring, eftersom Chipväljaringången tjänar till att återställa IC till dess initiala tillstånd och initierar ibland utmatningen av den första databiten.

Om det är nödvändigt att ansluta flera mikrokretsar till SPI-bussen, används antingen en oberoende (parallell) anslutning (fig. 7.3) eller en kaskad (seriell) anslutning (fig. 7.4). Oberoende anslutning är vanligare, eftersom uppnås när du använder några SPI-kompatibla chips. Här är alla signaler, förutom valet av mikrokretsar, parallellkopplade och bussmastern anger genom att överföra en eller annan SS-signal till ett lågt tillstånd med vilken slav-IC den ska utbyta data. Den största nackdelen med denna anslutning är behovet av ytterligare linjer för att adressera slavchips (det totala antalet kommunikationslinjer är 3+n, där n är antalet slavchips).

Om det inte finns tillräckligt med mikrokontrollerben kan du använda ett demultiplexerchip. Demultiplexern ansluter en enda insignal till en av utsignalerna, beroende på koden på kontrollstiften. Figur 7.4 visar anslutningsschemat för demultiplexern. SS-signalen matas till dess ingång, som får ett värde lika med 0 om det är nödvändigt att välja en av mikrokretsarna. Numret på den nödvändiga mikrokretsen i binär kod levereras till Am-A0-benen. Detta gör att du kan minska antalet ben som används i mikrokontrollern till m=log 2 n. Där n är antalet slavchips. De där. för att ansluta 128 enheter krävs 8 mikrokontrollerstift. En för att ställa in aktiveringssignalen och 7 för att ställa in numret på det chip som ska slås på. Det bör noteras att det måste finnas en logisk på de oanslutna benen av demultiplexern. Annars används en signalväxelriktare, som omvandlar en logisk nolla till en logisk.

Kaskadväxling är fri från denna nackdel, eftersom här bildar flera marker ett stort skiftregister. För att göra detta ansluts sändningsdatautgången från den ena IC till datamottagningsingången på den andra, som visas i figur 3. Chipväljaringångarna här är parallellkopplade och därför hålls det totala antalet kommunikationslinjer lika. till 4. Användningen av kaskadkoppling är dock endast möjlig om dess stöd anges i dokumentationen för de använda chipsen. För att ta reda på det är det viktigt att veta att en sådan koppling kallas "daisy-chaining" på engelska.

Överföringsprotokoll

Överföringsprotokollet över SPI-gränssnittet är i huvudsak identiskt med logiken i skiftregistret (Figur 7.6), som består av att utföra en skiftoperation och följaktligen bitinmatning och utmatning av data på vissa kanter av synkroniseringssignalen. Datainställning under sändning och sampling under mottagning utförs alltid på motsatta klockkanter. Detta är nödvändigt för att säkerställa att data tas från när den väl har fastställts på ett tillförlitligt sätt. Om vi ​​tar hänsyn till att den första kanten i överföringscykeln kan vara en stigande eller fallande kant, så finns det fyra möjliga logiska alternativ för driften av SPI-gränssnittet. Dessa alternativ kallas SPI-lägen och beskrivs av två parametrar:

· CPOL - initial nivå för synkroniseringssignalen (om CPOL=0, då har synkroniseringslinjen före starten av överföringscykeln och efter dess slut en låg nivå (dvs den första kanten stiger och den sista faller), annars, om CPOL=1, - hög (dvs den första fronten faller och den sista stiger));

· CPHA - synkroniseringsfas; Denna parameter bestämmer i vilken ordning data installeras och hämtas. Om CPHA=0, kommer data att samplas på den stigande flanken av klockcykeln, och sedan kommer data att ställas in på den fallande flanken. Om CPHA=1 kommer datainstallation att utföras på den stigande flanken i synkroniseringscykeln, och sampling kommer att utföras på den fallande flanken.

Information om SPI-lägen presenteras i figurerna 7.7 och 7.8.

Master- och slavchips som fungerar i olika SPI-lägen är inkompatibla, därför är det viktigt att klargöra vilka lägen som stöds av bussmastern innan du väljer slavchips. Hårdvaru-SPI-moduler integrerade i mikrokontroller stöder i de flesta fall möjligheten att välja vilket läge som helst och därför kan alla slav-SPI-chips anslutas till dem (gäller endast ett oberoende anslutningsalternativ). Dessutom är SPI-protokollet i något av lägena enkelt implementerat i mjukvara.

RS-485 gränssnitt

RS-485-gränssnittet (ett annat namn är EIA/TIA-485) är en av de vanligaste standarderna för fysiska kommunikationslager. Det fysiska lagret är en kommunikationskanal och en signalöverföringsmetod (lager 1 i OSI-modellen för sammankoppling av öppna system).

Ett nätverk byggt på RS-485-gränssnittet består av transceivrar som är anslutna med ett tvinnat par - två tvinnade ledningar. RS-485-gränssnittet är baserat på principen om differentiell (balanserad) dataöverföring. Dess kärna är att överföra en signal över två ledningar. Dessutom bär en tråd (villkorligt A) den ursprungliga signalen och den andra (villkorligt B) bär sin omvända kopia. Med andra ord, om det finns en "1" på en tråd, då en "0" på den andra och vice versa. Således finns det alltid en potentialskillnad mellan de två ledningarna i ett tvinnat par: vid "1" är det positivt, vid "0" är det negativt (Figur 7.9).

Det är denna potentialskillnad som överför signalen. Denna överföringsmetod ger hög immunitet mot störningar i common mode. Common-mode-störning är en störning som påverkar båda ledningarna på linjen lika. Till exempel, en elektromagnetisk våg som passerar genom en sektion av en kommunikationslinje inducerar potential i båda ledningarna. Om signalen överförs med potential i en tråd i förhållande till den gemensamma, som i RS-232, kan störningar på denna tråd förvränga signalen i förhållande till den gemensamma (jorden) som absorberar störningar väl. Dessutom kommer jordpotentialskillnaden att falla över motståndet hos en lång gemensam tråd - en ytterligare källa till distorsion. Och med differentialöverföring uppstår ingen distorsion. Faktum är att om två ledningar ligger nära varandra, och till och med är sammanflätade, är pickupen på båda ledningarna densamma. Potentialen i båda lika belastade ledningarna ändras lika, medan den informativa potentialskillnaden förblir oförändrad.

Hårdvaruimplementering av RS485-gränssnittet.

Hårdvaruimplementering av gränssnittet - transceiverchips med differentiella ingångar/utgångar (till linjen) och digitala portar (till UART-portarna på styrenheten). Det finns två alternativ för detta gränssnitt: RS-422 och RS-485.

RS-422 är ett full duplex-gränssnitt. Mottagning och överföring sker över två separata trådpar. Det kan bara finnas en sändare på varje par av ledningar.

RS-485 är ett halvduplexgränssnitt. Mottagning och överföring sker över ett par ledningar med tidsseparation. Det kan finnas många sändare i ett nätverk, eftersom de kan stängas av i mottagningsläge (Figur 7.10).

Förklaring av symboler i Fig. 7.10

D (förare) - sändare;
R (mottagare) - mottagare;
DI (föraringång) - digital ingång på sändaren;
RO (mottagarutgång) - digital utgång från mottagaren;
DE (drivrutinaktivering) - tillåtelse att använda sändaren;
RE (receiver enable) - tillåtelse att använda mottagaren;
A - direkt differentiell ingång/utgång;
B - invers differentialingång/utgång;
Y - direkt differentialutgång (RS-422);
Z - omvänd differentialutgång (RS-422).

Låt oss ta en närmare titt på RS-485-transceivern. Den digitala utgången på mottagaren (RO) är ansluten till mottagarens UART-port (RX). Sändarens digitala ingång (DI) till UART-sändarporten (TX). Eftersom mottagaren och sändaren är anslutna på differentialsidan måste sändaren vara avstängd under mottagning och mottagaren måste stängas av under sändning. För detta ändamål används styringångar - mottagartillstånd (RE) och sändartillstånd (DE). Eftersom RE-ingången är omvänd kan den anslutas till DE och koppla om mottagaren och sändaren med en signal från valfri port på styrenheten. På nivå "0" - arbeta för mottagning, vid "1" - för sändning (Fig. 7.11).

Mottagaren, som tar emot potentialskillnaden (UAB) vid differentialingångarna (AB), omvandlar dem till en digital signal vid utgången RO. Mottagarens känslighet kan vara annorlunda, men tillverkarna av transceiverchips skriver i dokumentationen det garanterade tröskelintervallet för signaligenkänning. Vanligtvis är dessa trösklar ±200 mV. Det vill säga när UAB > +200 mV - detekterar mottagaren "1" när UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Alla enheter är anslutna till en tvinnad parkabel på samma sätt: direktutgångar (A) till en tråd, omvända utgångar (B) till den andra.

Mottagarens ingångsimpedans för linjesidan (RAB) är typiskt 12KΩ. Eftersom sändareffekten inte är obegränsad skapar detta en gräns för antalet mottagare som är anslutna till linjen. Enligt RS-485-specifikationen, med hänsyn till termineringsmotstånden, kan sändaren driva upp till 32 mottagare. Det finns dock ett antal mikrokretsar med ökad ingångsimpedans, vilket gör att du kan ansluta betydligt fler än 32 enheter till linjen.

Den maximala kommunikationshastigheten enligt RS-485-specifikationen kan nå 10 Mbaud/sek. Det maximala avståndet är 1200 meter. Om det är nödvändigt att organisera kommunikation på ett avstånd av mer än 1200 meter eller ansluta fler enheter än vad sändarens belastningskapacitet tillåter, används speciella repeatrar.

I2C-gränssnitt.

Detta gränssnitt föreslogs av Philips, som använde det för att organisera kommunikation mellan chips i sina tv-apparater. I 2 C (en förkortning för Inter-Integrated Circuit) är en dubbelriktad asynkron seriell buss. Fysiskt består I2C-bussen av två signalledningar, varav en (SCL) är avsedd för att sända en klocksignal och den andra (SDA) för datautbyte. För att styra ledningarna används slutsteg med öppen kollektor, så bussledningarna måste anslutas till en +5 V strömkälla genom motstånd med ett motstånd på 1...10 kOhm, beroende på ledningarnas fysiska längd och dataöverföringshastigheten. Längden på anslutningslinjer i standardläge kan nå 2 meter, dataöverföringshastigheten är 100 kbit/s.

Alla bussabonnenter är indelade i två klasser - "Leader" och "Slave". Masteranordningen genererar en klocksignal (SCL). Den kan oberoende komma åt bussen och adressera vilken slavenhet som helst i syfte att sända eller ta emot information. Alla slavenheter "lyssnar" på bussen för att upptäcka sin egen adress och, efter att ha känt igen den, utför den föreskrivna operationen. Dessutom är det så kallade "MultiMaster"-läget möjligt, när flera masterenheter är installerade på bussen, som antingen delar gemensamma slavenheter, eller växelvis fungerar som masters när de själva initierar informationsutbytet, eller som slavar när de väntar på åtkomst från en annan huvudenhet. "MultiMaster"-läget kräver konstant övervakning och erkännande av konflikter. I detta avseende är detta läge svårare att implementera (vilket betyder mjukvaruimplementering) och används som ett resultat mindre ofta i riktiga produkter.

Vid det inledande ögonblicket - i standby-läge - är båda ledningarna SCL och SDA i ett logiskt ett-tillstånd (transistorn i den öppna kollektorns utgångssteg är stängd). I sändningsläge (Figur 7.12) klockas SDA-databiten av den stigande flanken på SCL. Informationen på SDA-linjen ändras när SCL-linjen är i nollläge. Slavanordningen kan "hålla" SCL-linjen i nolltillståndet, till exempel under bearbetning av nästa mottagna byte, medan masteranordningen måste vänta tills SCL-linjen frigörs innan den fortsätter att sända information.

För att synkronisera I 2 C-busspaket särskiljs två villkor - "START" och "STOPP", vilket begränsar början och slutet av informationspaketet (Figur 7.13). För att koda dessa villkor används en ändring i tillståndet för SDA-linjen med ett enda tillstånd för SCL-linjen, vilket är oacceptabelt vid sändning av data. "START"-tillståndet bildas när en fallande kant visas på SDA-linjen, när SCL-linjen är i ett enda tillstånd, och vice versa, "STOPP"-villkoret bildas när en stigande kant visas på SDA-linjen när SCL linjen är i ett enda tillstånd.

Dataöverföring börjar på den första stigande flanken på SCL-linjen, som klockar den mest signifikanta biten av den första informationsbyten. Varje informationsbyte (8 bitar) innehåller 9 klockperioder av SCL-linjen. I den nionde cykeln utfärdar den mottagande anordningen en bekräftelse (ACK) - en fallande flank som indikerar mottagning av data. Det bör noteras att varje bussabonnent, både master och slav, vid olika tidpunkter kan vara både en sändare och en mottagare och, i enlighet med läget, måste antingen ta emot eller utfärda en ACK-signal, vars frånvaro tolkas som ett fel.

För att starta en datautbytesoperation utfärdar masteranordningen ett "START"-villkor på bussen. "START"-villkoret följs av en byte med adressen till slavenheten (Figur 7.14), som består av en sju-bitars enhetsadress (bitar 1...7) och en enbits läs-skrivoperationsflagga - " R/W” (bit 0). R/W-biten bestämmer utbytets riktning, där 0 betyder dataöverföring från master till slav (Figur 7.14a), och 1 betyder läsning från slav (Figur 7.14b). Alla bitar på I2C-bussen sänds i ordning från hög till låg, det vill säga den 7:e biten sänds först, den 0:e sist. Adressen kan följas av en eller flera informationsbytes (i den riktning som specificeras av R/W-flaggan), vars bitar klockas av mastern på SCL-bussen.

När du utför en läsoperation måste värden ACK läsa byten om den vill läsa nästa byte, och inte utfärda en ACK om den är på väg att avsluta läsningen av paketet (se figur 7.14b).

Det är tillåtet att återuppta slavenhetens adress flera gånger i en överföringscykel, det vill säga sända ett upprepat "START"-tillstånd utan ett tidigare "STOPP"-tillstånd (Figur 7.14c).

Det är nödvändigt att notera några funktioner hos minneschips som fungerar via I 2 C-gränssnittet och procedurerna för att utbyta data med dem. För det första är det icke-flyktiga dataminnet i dessa mikrokretsar uppdelat i minnessidor, så när en byte skrivs kopieras hela sidan först till mikrokretsens interna RAM, där den önskade cellen ändras. Efter detta raderas den gamla sidan och en ny skrivs i dess ställe. En annan egenskap är att de mest signifikanta fyra bitarna i slavadressen alltid måste vara lika med 1010. Detta krav regleras av Philips själv.

1-trådsbussen använder endast en ledare för kommunikation och ström. Kommunikationsläget är asynkront och halvduplex, vilket strikt följer master-slav-mönstret. En eller flera slavenheter kan anslutas till samma buss samtidigt. Endast en masterenhet kan anslutas till en buss.

Bussens viloläge motsvarar en hög nivå, som genereras av ett pull-up-motstånd. Värdet på pull-up-motståndet anges i dokumentationen för slav-IC. Alla chips anslutna till bussen måste kunna producera en låg nivå. Om mikrokontrollerutgången inte stöder tre tillstånd, är det nödvändigt att tillhandahålla en drivrutin som har en öppen kollektor eller öppen dräneringsutgång

Signalöverföring över 1-trådsbussen är uppdelad i tidsluckor med en varaktighet på 60 µs. Endast en bit data sänds per tidslucka. Slavenheter tillåts ha betydande skillnader från de nominella tidsfördröjningarna. Detta kräver dock mer exakt timing av ledaren för att säkerställa korrekt kommunikation med underordnade som har olika tidsbaser.

Grundläggande busssignaler.

Mastern initierar varje kommunikation på bitnivå. Detta innebär att överföringen av varje bit, oavsett riktning, måste initieras av mastern. Detta uppnås genom att sätta bussen lågt, vilket synkroniserar logiken för alla andra enheter. Det finns 5 huvudkommandon för kommunikation via 1-trådsbussen: "Skriv logg. 1", "Skriv logg. 0”, “Läs”, “Återställ” och “Närvaro”.

Signal "Skriv logg. 1"

Signal "Skriv logg. 1" visas i fig. 7.15. Mastern ställer in den låga nivån för 1...15 µs. Efter detta frigör den bussen för resten av tidsluckan.

Ris. 7.15 – Signal ”Skriv logg. 1"

Signal "Skriv logg. 0"

Signal "Skriv logg. 0” visas i figur 7.16. Mastern genererar en låg nivå i minst 60 µs, men inte längre än 120 µs.

Fig 7.16 – Signal "Skriv logg. 0"

Läs signal

"Läs"-signalen visas i fig. 7.17. Mastern ställer in den låga nivån för 1...15 µs. Slaven håller sedan bussen lågt om den vill sända en logg. 0. Om det är nödvändigt att överföra loggen. 1, så släpper den helt enkelt linjen. Bussskanningen måste utföras inom 15 µs från det att bussen blir låg. Sett från masterns sida är "Läs"-signalen i huvudsak en "Skriv logg"-signal. 1". Det faktiska interna tillståndet för slaven kommer att bestämmas av "Record log"-signalen. 1" eller "Läser".

Figur 7.17 – "Läs"-signal

Återställ/närvarosignal

Signalerna "Återställ" och "Närvaro" visas i figur 7.18. Observera att pulstidsintervallen är olika. Mastern drar lågt i 8 tidsluckor (480 µs) och släpper sedan bussen. Denna långa period av lågt tillstånd kallas en "Återställ"-signal.

Om en slav finns på bussen måste den, inom 60 µs efter att mastern släpper bussen, ställa in en låg nivå på minst 60 µs. Detta svar kallas "Närvaro". Om en sådan signal inte detekteras måste mastern anta att det inte finns några enheter anslutna till bussen och att ingen ytterligare kommunikation är möjlig.

USB (Universal Serial Bus) utvecklades för att snabbt ansluta externa enheter till en persondator och sedan hitta och installera nödvändig programvara. Lågströmsenheter drivs direkt via gränssnittet.

USB-standarden innebär att det endast finns en huvudenhet (värd) i nätverket. Dessutom stöder standarden upp till 127 slavenheter i nätverket. För att skilja mellan master- och slavenheter har olika typer av kontakter utvecklats (Figur 7.19): Typ A för mastern och Typ B för slaven. Det accepteras att 5V-spänningen endast finns på typ A-kontakten, som är huvudkontakten. Resten av enheterna drivs direkt från den.

USB-standarden använder fyra skärmade ledningar, varav två överför ström (+5v & GND) (Figur 7.19 och Tabell 7.2). De andra två representerar twisted-par differentialdatasignaler. Kodningsschema används NRZI(Non Return to Zero Invert) för dataöverföring med ett synkroniseringsfält för att synkronisera master- och slavklockorna.

USB 2.0-standarden introducerade On-The-Go-standarden (OTG), som introducerade Host Negotiation Protocol, som gör att två USB-enheter kan komma överens om vem som ska fungera som master. Detta är avsett och begränsat till enstaka punkt-till-punkt-anslutningar, såsom en mobiltelefon till en persondator.

USB stöder "hot" (plug'n'play) anslutning med dynamiskt laddade och urladdade drivrutiner. Användaren kopplar helt enkelt in enheten och ansluter den därigenom till bussen. Värden upptäcker anslutningen, pollar den nyligen införda enheten och laddar lämplig drivrutin, vilket indikerar laddningsögonblicket med ett timglas på skärmen (om drivrutinen för USB-enheten redan är installerad på systemet). Slutanvändaren bryr sig inte om uppsägning eller IRQ(avbrott) och portadresser, inte heller om att starta om datorn (ingen omstart krävs). När användaren är klar med USB-enheten tar de helt enkelt bort den (eller kopplar ur kabeln), värden kommer att upptäcka frånvaron av enheten och automatiskt ladda ur drivrutinen.

SB version 1.1 stöder två hastigheter - fullhastighetsläge med en hastighet på 12 Mbits/s och låghastighetsläge med en hastighet på 1,5 Mbits/s. 1,5 Mbit/s-läget är långsammare och mindre känsligt för EMI (interferens), vilket minskar kostnaden för ferritpärlor och minskar kraven på komponentkvalitet.

Fullhastighetsbusskabeln är en partvinnad kabel, skyddad av en skärm, och kan även användas för låghastighetsdrift. En kabel för drift endast vid lägsta hastighet (till exempel för att ansluta en mus) kan vara vilken som helst och oskärmad.

USB 2.0-standarden introducerar ett höghastighetsläge med en dataöverföringshastighet på 480Mbits/s.

Dataöverföring.

Alla dataöverföringar över gränssnittet initieras av värden. Data överförs i form av paket. USB-gränssnittet använder flera typer av paket:

A) skyltpaket (tokenpaket) beskriver typen och riktningen för dataöverföring, enhetens adress och serienumret för slutpunkten (CT är den adresserbara delen av USB-enheten); Funktionspaket finns i flera typer: I, UT, SÅ F, UPPSTART;

B) datapaket (datapaket) innehåller överförda data;

B) godkännandepaket (handskakningspaket) är avsedd att rapportera resultaten av dataöverföring; Det finns flera typer av samordningspaket: ACK, N.A.K., BÅS.

Dataöverföring via USB utförs enligt följande:

Det första paketet, den så kallade token, genereras av masterenheten för att beskriva typen av data som överförs, överföringsoperationen (läs eller skriv), enhetens adress och slutpunkten. Nästa som vanligtvis överförs är ett datapaket som innehåller användbar information, följt av ett handskakningspaket som indikerar att data eller token har tagits emot framgångsrikt, eller att slutpunkten har stannat eller inte är tillgänglig för att acceptera data.

Slutpunkterna i USB-standarden är källorna och sänkorna för data. Alla enheter måste stödja ändpunkt 0. Detta är ändpunkten som accepterar alla kontroll- och statusförfrågningar under uppräkning (en handtagsbegäran för att fastställa vilken typ av enhet som är ansluten) och så länge som enheten förblir i drift på bussen.

Slutpunkter numrerade från 1 används för att överföra användarinformation. Låt oss titta på ett par exempel.

Enhetsdrivrutinen sänder till huvudenhetens slutpunkt EP1. Därför att Denna enhet är master, sedan går data till OUT-bufferten EP1. I det här fallet skickas en OUT-token, vilket indikerar att data är redo att skickas. Efter att ha mottagit denna token kan slavenheten läsa data från OUT-bufferten.

Om slavenheten behöver överföra data till mastern placerar den den i IN-bufferten. Denna buffert kommer att hålla data tills mastern skickar en IN-token som begär data från slutpunkten. Alla ändpunktsbuffertar är namngivna i förhållande till mastern, dvs. Utgångsbufferten för slavenheten kallas IN pga det är ingångsbufferten för masterenheten.

Dataöverföring från en slutpunkt till en annan sker genom strömmar. Flöde – En logisk koppling mellan en värd och en slutpunkt(er).

Strömmar har också en uppsättning parametrar som överföringstyp (Control, Bulk, Iso eller Interrupt), dataflödesriktning och maximala paket-/buffertstorlekar.

Till exempel är standardströmmen en dubbelriktad ström som består av IN-ändpunkt 0 och OUT-ändpunkt 0 med kontroll av överföringstyp.

USB definierar två typer av rör

A) Strömrör har inte ett fördefinierat USB-format, så du kan skicka vilken typ av data som helst genom strömröret och återställa data i andra änden. Dataströmmar är sekventiella och har en förutbestämd riktning - IN eller UT. Strömrör stöder bulk-, isokron- och avbrottsöverföringstyper. Strömrör kan styras från antingen värden eller enheten.

B) Meddelanderör har ett fördefinierat USB-format. De är värdkontrollerade, initierade av en begäran som skickas från värden. Uppgifterna skickas i önskad riktning som anges i begäran. Meddelanderör tillåter alltså att data överförs i båda riktningarna, men stöder endast kontrollöverföringar.

USB-standarden beskriver fyra typer av dataöverföring:

A) Styr vidarebefordran (kontrollöverföring) används för enhetskonfiguration såväl som andra enhetsspecifika ändamål.

B) Streaming (bulköverföring) används för att överföra en relativt stor mängd information.

B) Avbryt vidarebefordran (avbryta överföringen) används för att överföra en relativt liten mängd information, för vilken överföring i rätt tid är viktig. Den har en begränsad varaktighet och högre prioritet jämfört med andra typer av överföringar.

D) Isokron vidarebefordran (isokron överföring) kallas även realtidsströmning. Information som sänds i en sådan överföring kräver en realtidsskala under dess skapande, överföring och mottagning.

Strömmande överföringar kännetecknas av garanterad felfri dataöverföring mellan värden och funktionen genom att upptäcka fel under överföringen och återbeställa information. När värden blir redo att ta emot data från en funktion skickar den ett flaggpaket till funktionen I-plastpåse. Som svar på detta sänder funktionen i dataöverföringsfasen ett datapaket till värden eller, om det

SPI i Arduino är det ett av huvudprotokollen för utbyte av data mellan Arduino-kortet och anslutna enheter. Tillsammans med I2C och UART används detta protokoll ofta för många typer av kringutrustning, så kunskap om principerna för SPI-drift är nödvändig för alla Arduino-ingenjörer. I den här artikeln kommer vi kort att titta på de grundläggande principerna, interaktionsschemat och metoden för att ansluta SPI-sensorer och skärmar till Arduino.

SPI är ett allmänt använt dataöverföringsprotokoll mellan en mikrokontroller (Master) och kringutrustning (Slave). I våra projekt används en Arduino-bräda oftast som en Master. SPI-gränssnittet uppfanns och användes av Motorola, men med tiden blev det en industristandard. Den största fördelen med att arbeta med detta gränssnitt är dess höga hastighet och möjligheten att ansluta flera enheter på en databuss.

SPI stift och stift

Kommunikation via SPI arduino-gränssnittet sker mellan flera enheter som är placerade nära varandra. Arduino-brädorna är utrustade med separata stift för SPI. Parning sker med fyra kontakter:

  • MOSI – information överförs via denna linje till slaven från mastern.
  • MISO – används för att överföra information till mästaren från slaven.
  • SCLK – skapande av klockpulser för synkron dataöverföring.
  • SS – val av slavenhet.

Interaktion mellan SPI-enheter

Enhetsinteraktion börjar när SS-utgången blir låg.

Innan du börjar arbeta måste du bestämma:

  • Vilken bit ska växlingen börja från - hög eller låg? Ordningen justeras med funktionen PI.setBitOrder() .
  • Bestäm vid vilken nivå SCK-linjen ska vara i frånvaro av en klockpuls. Justerbar med SPI.setDataMode() funktion.
  • Välj dataöverföringshastighet. Bestäms av funktionen SPI.setClockDivider().

Nästa steg är att bestämma i vilket läge informationen ska överföras. Valet av läge bestäms av sådana indikatorer som klockpulsens polaritet och fas. Om nivån är låg, spelas 0 in, hög - 1. Det finns totalt 4 lägen:

  • Läge 0 – SPI_MODE0: polaritet (CPOL) 0, fas (CPHA) 0.
  • Läge 1: polaritet 0, fas 1.
  • Läge 2: polaritet 1, fas 0.
  • Läge 3: polaritet 1, fas 1.

Ursprungligen designades Arduino för att överföra data med den mest signifikanta biten först, men innan du börjar måste du förtydliga detta i dokumentationen. Du kan demonstrera lägena på bilden.

Det finns två typer av anslutningar möjliga i SPI-gränssnittet: oberoende och kaskadkopplade. I det första fallet, vid anslutning, adresserar Mastern varje Slave individuellt, i det andra fallet sker anslutningen en efter en, d.v.s. kaskad.

Ansluter SPI till Arduino

Varje Arduino-modell har sina egna SPI-stift. Dessa slutsatser:

  • Uno: MOSI motsvarar stift 11 eller ICSP-4, MISO – 12 eller ICSP-1, SCK – 13 eller ICSP-3, SS (slav) – 10.
  • Mega1280 eller Mega2560: MOSI – 51 eller ICSP-4, MISO – 50 eller ICSP-1, SCK – 52 eller ICSP-3, SS (slav) – 53.
  • Leonardo: MOSI – ICSP-4, MISO – ICSP-1, SCK – ICSP-3.
  • Förfaller: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3, SS (master) – 4, 10, 52.

Den senaste Arduino Due-kontrollern utökar användarkapaciteten och låter dig implementera fler uppgifter än andra mikrokontroller. Det är till exempel möjligt att automatiskt styra slavenheten och automatiskt välja olika konfigurationer (klockhastighet, läge, etc.).

Arduino SPI bibliotek

För att arbeta med Arduino har ett separat bibliotek skapats som implementerar SPI. Innan du startar koden måste du lägga till #include för att aktivera biblioteket.

Huvud funktioner:

  • begin() och end() – slå på och av arbetet. Under initiering konfigureras SCLK-, MOSI- och SS-linjerna vid utgången och sänder en låg nivå till SCLK, MOSI och en hög nivå till SS. End()-funktionen ändrar inte linjenivåerna, den behövs för att stänga av blocket som är associerat med gränssnittet på Arduino-kortet.
  • setBitOrder(order) – ställer in ordningen för att skicka informationsbitar (MSBFIRST – prioritet för den mest signifikanta biten, LSBFIRST – prioritet för den minst signifikanta biten).
  • setClockDivider(divider) – ställer in huvudfrekvensklockavdelare. Du kan ställa in divisorer på 2, 4, 8, 16, 32, 64 och 128. Det skrivs på följande sätt - SPI_CLOCK_DIVn, där n är den valda divisorn.
  • setDataMode(mode) – välj ett av fyra driftlägen.
  • transfer(value) – överför en byte från masterenheten och returnerar den byte som tas emot från slavenheten.
  • shiftIn(miso_pin, sclk_pin, bit_order) och shiftOut(mosi_pin, sclk_pin, order, value) – accepterar och skickar data, kan kopplas till alla digitala stift, men innan dess måste du konfigurera dem själv.

Fördelar och nackdelar med SPI

Fördelar med SPI-gränssnittet:

  • Möjlighet att överföra stora data, inte begränsad till 8 bitar.
  • Lätt att implementera mjukvara.
  • Enkelheten i hårdvaruimplementeringen.
  • Färre stift behövs än för parallella gränssnitt.
  • Endast enhetens hastighet begränsar den maximala klockfrekvensen.

Brister:

  • Stort antal stift jämfört med I2C.
  • Slaven kan inte kontrollera informationsflödet.
  • Avsaknad av ett standardfelsökningsprotokoll.
  • Ett stort antal sätt att implementera gränssnittet.
  • Brist på bekräftelse på mottagande av information.

Ett exempel på att använda Arduino SPI i ett projekt med en trycksensor

För att genomföra projektet behöver vi en Arduino, en trycksensor, en brödbräda och kablar. Ett exempel på sensoranslutning visas i figuren.

Med hjälp av SCP1000-sensorn är det möjligt att känna igen parametrar som tryck och temperatur och överföra dessa värden via SPI.

Grundläggande element i en programskiss

Först och främst registreras sensorregistren i koden med setup(). Flera värden returneras från enheten - en på 19 bitar för det mottagna trycket, en annan i 16 bitar för temperaturen. Därefter avläses två temperaturbyte och trycket avläses i två steg. Först tar programmet de tre mest signifikanta bitarna, sedan de nästa 16 bitarna, varefter, med hjälp av en bitförskjutning, dessa två värden kombineras till ett. Verkligt tryck är det 19-siffriga värdet dividerat med 4.

const int PRESSURE = 0x1F; // första steget av tryckbestämning (tre mest signifikanta bitar detekteras)

const int PRESSURE_LSB = 0x20; // andra steget, som definierar 16 bitar för tryck

const int TEMPERATURE = 0x21; //16 bitar för temperatur

För att läsa temperaturdata och konvertera dem till Celsius används följande kodelement:

int tempData = readRegister(0x21, 2);

float realTemp = (float)tempData / 20.0; // för att bestämma det verkliga temperaturvärdet i Celsius måste du dividera det resulterande talet med 20

Serial.print(“Temp

Serial.print(realTemp);

Läsa tryckbitar och kombinera dem:

byte pressure_data_high = readRegister(0x1F, 1);

tryck_data_hög &= 0b00000111;

unsigned int press_data_low = readRegister(0x20, 2);

långt tryck = ((pressure_data_high<< 16) | pressure_data_low) / 4; //определение давления в Паскалях.

Korta slutsatser om SPI

SPI-sköldar och sensorer finns ofta i Arduino-projekt, så du måste veta hur detta protokoll fungerar. I princip är det inget komplicerat med att ansluta SPI-enheter. Det viktigaste är att ansluta ledningarna korrekt och använda standardbiblioteksmetoderna i rätt ordning. För vissa enheter, till exempel SD-kort eller OLED-skärmar, finns det i princip inga alternativ.

God dag! Dagens artikel är en liten teoretisk utvikning som hjälper oss att bemästra Arduino-programmeringskursen. Vi kommer att prata om SPI-gränssnittet. Vad det är och vad det äts med kommer vi att försöka ta reda på i den här artikeln.

Till att börja med definitionen. SPI(Serial Peripheral Interface - seriellt perifert gränssnitt) är en seriell synkron dataöverföringsstandard, som är utformad för att kommunicera styrenheten med olika kringutrustning. Detta gränssnitt är enkelt och bekvämt. Ett speciellt bibliotek för att arbeta med SPI skrevs för Arduino.

Kommunikation bygger på principen "mästare-slav". Styrenheten är vanligtvis huvudenheten. Alla andra enheter som är anslutna till systemet är slavar. Data från masterenheten överförs via databussen till en av de valda slavarna eller vice versa från slavenheten till mastern synkront med hjälp av masterklocksignalen.

SPI databuss pinout består av 4 rader: MOSI, MISO, CS och SCLK:

  • MOSI(Master Out Slav In - Master-utgång, Slav-ingång) eller bara SI.– dataöverföring sker från masterenheten till slavenheten.
  • MISO(Master In Slave Out - Master-ingång, Slave-utgång) eller bara – dataöverföring sker från slavenheten till masterenheten.
  • C.S.(Chip Select - Chip Selection) eller SS(Slavval — Slavval) – val av en slavenhet.
  • SCLK(Seriell KLOCKA) eller bara SCK– överföring av en klocksignal från mastern till slaven.

För att överföra data från en master till en slav är det nödvändigt att mastern ställer in signalnivån lågt på CS-linjen för den slav som den ska upprätta kommunikation med. Bitarna överförs sedan över MOSI-linjen. För att stoppa dataöverföringen "släpper" ledaren CS-linjen, så att säga, och ställer in en hög signalnivå på den.

För att ansluta flera slavenheter till SPI-databussen måste var och en av dem ha sin egen individuella CS-linje. När detta är gjort kan masterenheten växelvis "dra" ledningarna och växla mellan slavenheterna. Flera slavar kan kopplas på olika sätt: parallellt eller i serie.

Parallellkoppling av slavenheter via SPI-databuss

Det speciella med parallellkoppling av flera slavenheter är att gemensamma linjer SCLK, MOSI och MISO används för att skapa kommunikation. I detta fall har varje slavenhet sin egen SS(CS)-linje. Masterenheten bestämmer vilken "strömslav" som ska upprättas datautbyte med genom att generera en låg signalnivå på motsvarande SSn-linje (där n – 1,2...).

För att ansluta n-antal slavenheter till styrenheten via SPI-gränssnittet, måste du tilldela dem för detta ändamål n+3 mikrokontrollerstift.

Seriell anslutning av slavenheter till SPI-bussen

När det gäller seriell anslutning av slavenheter använder de gemensamma linjer SCLK och SS, och utgången på den ena är ansluten till ingången på den andra. Masterns MOSI-linje är ansluten till den första slaven och MISO-linjen är ansluten till den sista. Om du ser på denna anslutning från masterenhetens synvinkel, så är en slavenhet ansluten via SPI-databussen.

Det bör noteras fördelen med denna typ av anslutning: du kan ansluta det n:te antalet enheter med endast 4 stift på mikrokontrollern för detta ändamål.

Det var allt för nu, fortsättning...

Idag börjar vi vår bekantskap med däcket SPI (Serial Peripheral Interface).

Denna buss används mycket inom elektronik. Det är mycket bekvämt, eftersom det är synkront och full duplex, därför används det i många kretsar för kommunikation mellan olika digitala enheter - sensorer, styrenheter, drivrutiner och andra enheter.

En annan viktig faktor i behovet av vår bekantskap med den är att denna buss är organiserad i hårdvara i styrenheter AVR.

Dessutom, vare sig vi vill det eller inte, har vi kommunicerat med SPI-gränssnittet under lång tid, så snart vi började blinka vår styrenhet för första gången, eftersom den flashas genom detta gränssnitt.

Därför skulle jag vilja lära känna detta däck bättre.

Låt oss öppna den tekniska dokumentationen för Atmega8-kontrollern, öppna sidan där pinouten för denna kontrollenhet visas och se att stift 16 till 19 är där SPI-bussstiften är placerade

Nu lite mer om dessa fynd

SS (chip select)— detta är benet för val av enhet. Om slavenheten på detta stift är inställd på en låg nivå kommer den här enheten att svara och utbyta information via SPI-bussen, om den är hög kommer den inte att göra det.

MOSI (master output slav input)- Detta är utgångsstiftet för masterenheten och ingången för slavenheten.

MISO (master input slav output)- tvärtom, utsignalen från slaven, ingången från mastern.

SCK— synkroniseringsben. Alla enheter som deltar i informationsutbytet på denna buss förses med klockpulser med en viss frekvens.

Här är ett diagram över implementeringen av SPI-bussen i Atmega8-styrenheten

Som vilken buss som helst finns det ett antal register som lagrar viss information.

Vi är intresserade av SHIFT REGISTER, information utbyts genom det. Så snart det finns en viss kant på synkroniseringsstiftet, antingen fallande eller stigande, beroende på inställningarna, kommer dessa register för slav- och masterenheterna att utbyta information, och inte all information, utan bara en bit. Dessa register kommer att skifta åt vänster och de mest signifikanta bitarna från varje register kommer att gå till de minst signifikanta bitarna i samma register hos den associerade enheten. Det vill säga, slaven kommer att sända sin mest signifikanta bit genom MOSI-stiftet till ledaren, som kommer att skriva in den i den lediga lågordningens bit på grund av vänsterskiftet, och slaven kommer att överföra sin förskjutna högordningsbit genom MISO:n nåla till den låga ordningens bit av ledaren. Så här går utbytet till, det vill säga på 8 hela klockcykler kommer de att helt byta byte

Så snart alla 8 bitar av en byte med information har sänts, kommer ett visst register att signalera till oss att denna process är avslutad. Eller snarare, en viss bit av ett visst register.

Också i blockdiagrammet ser vi en delare, vars ingång tar emot klockpulser och sedan, dividerat med ett visst värde, skickas de genom en kedja till SCK-stiftet och därifrån matas de till slavenheten på stiftet till samma namn. Detta säkerställer synkroniserad drift av enheterna. Klockfrekvensen väljs från den lägsta som stöds av alla enheter som deltar i utbytet.

Jag säger plural eftersom det kan finnas mer än bara två enheter på en given krets. Hur detta säkerställs, förutsatt att enheterna inte har några adresser, ska jag nu berätta.

Det finns flera sätt att utbyta information mellan flera enheter, det vill säga när det finns flera slavar per en masterenhet. Vi kommer att titta på de två vanligaste av dem.

Den första metoden är radiell (klicka på bilden för att förstora bilden)

Här dirigerar mastern data till en specifik enhet och slår på logisk 0 på SS-stiftet. Med den här metoden är det möjligt att välja endast en enhet, du behöver också flera lediga stift till kontrollerportarna.

Det finns en annan intressant metod - ring eller kaskad (klicka på bilden för att förstora bilden)

Här ser vi att urvalsbenen alla är parallella och utbytet går i en cirkel. Således minskar hastigheten på grund av att transmissionscirkeln ökar, men babordsbenen sparas.

Vi kommer att studera allt detta mer i detalj i nästa lektion, när vi använder vissa enheter i våra projekt.

Tja, det verkar med kretsen för dataöverföring via bussen SPI vi kom på det.

Låt oss nu ta reda på hur man kontrollerar denna process på nivån av hårdvaruregister för AVR-kontrollern.

Dessa register ser vi i blockdiagrammet ovan på sidan.

Atmega8 har följande register för service av SPI-bussen.

SPDR (SPI Data Register)- dataregister, i blockschemat är det DATA BUFFER. Vi kommer att mata in en byte i detta register för dess efterföljande överföring till slavenheten, och från den kommer vi att läsa byten med information som kom från slavenheten. Det är inte heller nödvändigt att vår styrenhet kommer att vara huvudenheten. Därefter kommer vi att montera en krets av två kontroller, varav en kommer att vara en slav. Det är alltså i detta register som byten för både sändning och mottagning kommer att finnas.

SPCR (SPI Control Register)- kontrollregister

Detta register innehåller följande bitar:

SPIE (SPI Interrupt Enable)- lite som möjliggör avbrott.

SPE (SPI Enable)— lite som möjliggör SPI-bussen.

DORD (Data Order)— en bit som anger ordningen som bitar skickas i. Om den är satt till 1 så skickas den minst signifikanta biten först, om den är satt till 0 skickas den mest signifikanta biten.

MSTR (Master/Slave Select)— en bit som betecknar en enhet som en master eller slav. När denna bit är inställd på 1 kommer enheten att vara master.

CPOL (klockpolaritet)— synkroniseringspolaritet, bestämmer vid vilken kant av synkroniseringspulsen standbyläget kommer att initieras

Om denna bit är 1, kommer vi att ha ett standbyläge med en stigande kant, och om den är 0, då med en fallande kant.

CPHA (klockfas)— en bit ansvarig för klockfasen, det vill säga på vilken kant biten kommer att sändas.

Låt oss titta på dataöverföringsdiagrammen beroende på installationen av CPOL och CPHA

Detta är ett så intressant beroende. Ibland ser vi ibland i de tekniska egenskaperna hos en enhet att den till exempel kan fungera i SPI 0:0 och SPI 1:1 läge, och det är just det som gäller att ställa in dessa bitar.

SPR1, SPR0 (SPI Clock Rate Select)- dessa är de bitar som ansvarar för värdet på synkroniseringsfrekvensdelaren, de arbetar tillsammans med biten SPI2X finns i statusregistret. Det är också en kontroll, eftersom åtta bitar i kontrollregistret inte räckte för alla inställningar, och det finns många lediga i statusregistret.

SPSR (SPI Status Register)- statusregister

SPI2X (Double SPI Speed ​​​​Bit)- en bit som fördubblar hastigheten, arbetar tillsammans med SPR1- och SPR0-bitarna i styrregistret.

Låt oss se frekvensens beroende av dessa tre bitar

SPIF (SPI Interrupt Flag)— Avbryt flagga. Vi väntar på att denna bit ska sättas till ett. när vi får en byte. Så snart byten från en annan enhet visas helt i vår buffert, kommer denna flagga att ställas in. Denna flagga fungerar bara om biten som möjliggör avbrott är inställd, liksom globala avbrott är aktiverade.

WCOL (Write COLlision Flag)— konflikt- eller kollisionsflaggan kommer att ställas in om det uppstår en bitkonflikt under dataöverföringen, om ett försök görs att skriva till dataregistret under dataöverföringen.

Nåväl, nu kan vi säga att vi har blivit lite bekanta med SPI-gränssnittet.

Se VIDEO TUTORIAL(klicka på bilden)

Visningar av inlägg: 6 294

Med värden från 10 Ohm till 1 MOhm);

  • anslutningsledningar (till exempel är detta en bra uppsättning);
  • persondator med Arduino IDE-utvecklingsmiljö.
  • 1 Beskrivning av serie SPI-gränssnitt

    SPI - Serial Peripheral Interface eller "Serial Peripheral Interface"är ett synkront dataöverföringsprotokoll för ihopparning huvudenhet Med kringutrustning (slav). Huvudenheten är ofta en mikrokontroller. Kommunikation mellan enheter sker över fyra ledningar, varför SPI ibland kallas ett "fyrtrådsgränssnitt." Dessa är däcken:

    Det finns fyra dataöverföringslägen ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), orsakad av kombinationen av klockpulsernas polaritet (vi arbetar på HÖG eller LÅG nivå), Klocka polaritet, CPOL och fasen för klockpulserna (synkronisering på stigande eller fallande flank av klockpulsen), Klockfas, CPHA.

    Figuren förklarar denna tabell.

    SPI-gränssnittet ger flera alternativ för att ansluta slavenheter: oberoende Och kaskad. När den är ansluten oberoende till SPI-bussen kommer masterenheten åt varje slavenhet individuellt. Med en kaskadkoppling fungerar slavenheterna en efter en, som i en kaskad.


    Typer av enhetsanslutning för drift via SPI-gränssnittet: oberoende och kaskad

    2 Implementering av SPI-gränssnittet på Arduino-familjenstavlor

    I Arduino finns SPI-gränssnittsbussar på specifika portar. Varje bräda har sin egen pin-tilldelning. För enkelhetens skull dupliceras slutsatserna och placeras även på en separat ICSP-kontakt(I Circuit Serial Programmering, programmering av en enhet som ingår i en krets med hjälp av ett seriellt protokoll). Observera att ICSP-kontakten inte har ett slavvalsstift - SS, eftersom det antas att Arduino kommer att användas som en masterenhet i nätverket. Men om det behövs kan du tilldela vilken digital pin som helst av Arduino som SS.

    Figuren visar standardöverensstämmelsen mellan stift och SPI-bussar för Arduino UNO och Nano.


    3 Bibliotek för arbete med SPI-gränssnitt

    Ett speciellt bibliotek har skrivits för Arduino som implementerar SPI-protokollet. Det ansluter så här: i början av programmet lägger vi till #inkludera SPI.h.

    För att komma igång med SPI-protokollet måste du ställa in inställningarna och sedan initiera protokollet med hjälp av proceduren SPI.beginTransaction(). Du kan göra detta med en instruktion: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Detta innebär att vi initierar SPI-protokollet vid en frekvens på 14 MHz, dataöverföring sker med start från MSB (mest signifikant bit), i SPI_MODE0-läge.

    Efter initiering, välj slavenheten genom att flytta motsvarande SS-stift till tillståndet LÅG.

    Sedan överför vi data till slavenheten med kommandot SPI.transfer().

    Efter överföringen returnerar vi SS till staten HÖG.


    Arbetet med protokollet slutförs med kommandot SPI.endTransaction().

    Det är tillrådligt att minimera överföringstiden mellan instruktionerna SPI.beginTransaction() och SPI.endTransaction() för att undvika problem om en annan enhet försöker initiera en dataöverföring med andra inställningar.

    4 Anslutning av ett skiftregister till Arduino

    Låt oss överväga den praktiska tillämpningen av SPI-gränssnittet. Vi kommer att tända lysdioderna genom att styra ett 8-bitars skiftregister via SPI-bussen. Låt oss ansluta till Arduino skiftregister 74HC595. Vi kommer att ansluta en lysdiod med ett nominellt värde på 220 Ohm till var och en av de 8 registerutgångarna genom ett begränsningsmotstånd. Diagrammet visas i figuren.


    5 Skiss för styrning av ett skiftregister via SPI-gränssnitt

    Låt oss skriva en sådan här skiss.

    #omfatta const int pinSelect = 8; // registrera välj pin void setup() ( SPI.begin(); // initiering av SPI-gränssnittet pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // välj slavenheter (register) SPI.transfer(0); // rensa innehållet i registret digitalWrite(pinSelect, HIGH); // slutet av sändningen Serial.begin(9600); } void loop() ( för (int i=0; i )

    Låt oss först ansluta SPI-biblioteket och initiera SPI-gränssnittet. Låt oss definiera stift 8 som SS-slavvalsstiftet. Låt oss rensa skiftregistret genom att skicka värdet "0" till det. Initiera serieporten.

    För att tända en specifik lysdiod med hjälp av ett skiftregister måste du använda ett 8-bitars nummer på dess ingång. Till exempel, för att den första lysdioden ska tändas, tillhandahåller vi det binära numret 00000001, för den andra - 00000010, för den tredje - 00000100, etc. Dessa binära tal, när de omvandlas till decimaltalssystemet, bildar följande sekvens: 1, 2, 4, 8, 16, 32, 64, 128 och är tvåpotenser från 0 till 7.

    Följaktligen i cykeln slinga() Baserat på antalet lysdioder räknar vi om från 0 till 7. Funktion pow(bas, grad) Höjer 2 till slingräknarens effekt. Mikrokontroller fungerar inte särskilt noggrant med tal av typen "dubbel", så vi använder avrundningsfunktionen för att omvandla resultatet till ett heltal runda(). Och vi överför det resulterande numret till skiftregistret. För tydlighetens skull visar serieportmonitorn de värden som erhållits under denna operation: Enheten "kör" genom urladdningarna - lysdioderna lyser i en våg.

    6 "Running Wave" från lysdioder

    Lysdioderna tänds en efter en och vi observerar en rinnande "våg" av ljus. Lysdioderna styrs med hjälp av ett skiftregister, som vi anslutit till via SPI-gränssnittet. Som ett resultat används endast 3 Arduino-stift för att styra 8 lysdioder. Om vi ​​skulle ansluta lysdioderna direkt till Arduinos digitala portar, skulle vi behöva använda en separat port för varje lysdiod.

    Vi studerade det enklaste exemplet på Arduino som arbetar med SPI-bussen. Vi kommer att överväga mer detaljerat driften av flera skiftregister med oberoende och kaskadkopplade anslutningar i en separat artikel.