Vraag : Juiste manier om interface uit te voeren GPIO

Zo moeten wij twee microprocessors maken aan elkaar spreken.  Men is een meester, en één is een slaaf, en wij willen de huidige staat van de slaaf naar de meester (b.v., init, klaar, bezig, fout, enz.) terugsturen.  Wij komen voor de eenvoudigste manier om dit te doen met enkel de duidelijke I/O lijnen (van GPIO), slaven micro- reeksen één of meerdere lijnen is, krijgt de hoofdmicro hen.  

So de zeer, zeer gemakkelijke manier te doen het is elke speld wijst op een actieve state

Pin 0: Actieve Init
Pin 1: Ready
Pin 2 actieve Busy
Pin 3 actieve Error

However konden wij GPIO behouden door het met twee inactieve pins

Pin 0 te doen, inactieve 1 spelden: Inactieve Init
Pin 0, speldt actieve 1: Actieve Ready
Pin 0, speldt inactieve 1: Actieve Busy
Pin 0, speldt actieve 1: Error

Note dit gebruikt twee spelden in plaats van 4.  Nochtans, denk ik in de tweede techniek wij het risico in werking stellen om een overgang te vangen.  Bijvoorbeeld, probeert de slaaf aan overgang van INIT aan FOUT verklaart verandert het zo de eerste speld van 0 tot 1 verandert, dan de tweede speld van 0 tot 1.  Nochtans, als de meester binnen - tussen de twee veranderingen krijgt zou het 01 of 10 lezen, wat KLAAR of BEZIG is, en het zou een slechte action.

So het antwoord waarschijnlijk een derde speld te gebruiken is, die op de geldigheid van andere twee wijst.  De slavenreeksen die laag spelden, dan brengt de veranderingen aan, dan plaatst het opnieuw aan hoogte, betekenend de andere twee beetjes zijn geldig.

So dit drie spelden nemen, wat nog besparingen over 4 vereist door eerste approach.

Can is ik een geestelijke gezondheidcontrole van dit alles krijg?  De tweede benadering is verkieslijk, juist, op voorwaarde dat wij de extra speldtechniek gebruiken?  Dat is noodzakelijk recht?

Thanks voor om het even welke thoughts.

Antwoord : Juiste manier om interface uit te voeren GPIO

U bent vrij veel juist het precies, maar geworden om het voor u lichtjes verschillend te zetten:

1) Uw eerste voorgestelde methode laat u spoor van vier afzonderlijke „variabelen“ houden, elke één bekwaam om één van twee verschillende waarden (hoog of laag) over te nemen. Dit gebruikt vier spelden, en er zijn 16 mogelijke staten van uw buslijn.

2) Uw tweede voorgestelde methode laat u spoor van één enkele „variabele“ houden die één van vier verschillende waarden (00, 01, 10, of 11) kan overnemen. Er zijn 4 mogelijke staten aan uw buslijn.

Van wat u, methode#2 kostuums uw doeleinden beter beschreef. Als u het de #1 manier doet, zult u een buslijn hebben die 16 mogelijke waarden heeft, maar slechts 4 van de mogelijke 16 waarden hebben om het even welke betekenis aan u (0001, 0010, 0100 en 1000). Al het andere is ongeldig. Zodat een afval van middelen is. Dat is waarom u sparen een paarbeetjes door het te doen de methode#2 manier.

Nu is het belangrijke nota te nemen van ding dat geen kwestie die methode u, #1 gebruikt OF #2, zal u altijd de „onstabiele staats“ kwestie hebben. Er is altijd die infinitesimal hoeveelheid tijd wanneer de meester de waarde op de buslijn verandert, en als de slaaf op dat nauwkeurige ogenblik leest zal het een onjuiste lezing krijgen.

U stelde „het synchroniseren van klokbeetje“ voor dat zowel hoofd als slaaf deel. U riep dit het geldigheidsbeetje. Het klokbeetje wordt geplaatst door de meester, en door de slaaf gelezen. De meester zorgt ervoor dat op de toenemende rand van de klok de waarde op de gegevensbeetjes stabiel is. De slaaf weet het om de gegevensbeetjes te lezen slechts wanneer de klok hoog gaat. Dit kan direct in hardware op het signaalniveau (b.v. een verilog of een kring VHDL op een FPGA wordt geprogrammeerd) worden gedaan, of u kunt het op hoger niveau (b.v. een microprocessor zoals een raad Altera die een hardware heeft onderbreken geworpen wanneer dat sync beetje dat hoog gaat) doen.

Zo fundamenteel denk ik u volledig correct bent, realiseer enkel u nog 2 gpiospelden, niet alleen 1 bewaarde, omdat zelfs als u het de eerste manier deed u nog het beetje van de synchronisatieklok nodig zou hebben.
Andere oplossingen  
 
programming4us programming4us