Spørgsmål:
Brug af SPI uden at køre MISO
Fulcrum
2016-11-05 18:20:55 UTC
view on stackexchange narkive permalink

Jeg udvikler en applikation, hvor en Arduino Pro Mini kommunikerer med en 12-bit ADC over SPI. Kommunikationen er envejs, hvilket betyder, at ADC kun sender data tilbage til Arduino og ikke modtager nogen. MOSI-stiften er derfor ikke påkrævet i min ansøgning, kun SCK og MISO.

Jeg ønsker at vide, om der er en måde at få Arduino SPI-biblioteket til at ignorere MOSI-stiften og kontrollere urstiften direkte. ADC kræver 16 urcyklusser for at udføre en konvertering og sende dataene tilbage på de sidste 12 urcyklusser. Den måde, jeg har implementeret det på, er ved at bruge SPI.transfer16 () til at få 16 urcyklusser og gemme returværdien i en 16bit-variabel. Ulempen ved dette er, at MOSI-stiften er drevet, og jeg kan derfor ikke bruge den til andre formål. Jeg vil meget gerne kunne generere 16 urcykler uden behov for at køre MOSI. Eventuelle ideer?

SPI-enheder kommunikerer i fuld duplex-tilstand. Kan du ikke bruge andre grænseflader, der bruger færre ledninger i deres standard?
At skifte det til en indgang skal afbryde det fra SPI. Ellers vil det være MOSI.
Du kan altid bruge bitbanging i form af [shiftIn] (https://www.arduino.cc/da/Reference/ShiftIn).
@IgnacioVazquez-Abrams Det ville være en god løsning, hvis jeg ville bruge MOSI-stiften som input. Jeg kræver dog, at det er en output.
@Gerben Det ser levedygtigt ud. Men jeg er bange for, at det måske ikke er så pålideligt som hardwareimplementeringen.
SPI-funktionen varierer efter forskellige processorer. Arduino Pro Mini bruger en ATmega328. Enten skal du downloade de relevante SPI (og andre) biblioteker fra github og ændre dem - eller læse ATmega328-chipspecifikationen. Det kan være, at du kan styre ATmega328 MOSI-pin ved blot at bruge pinmode () -opkaldet og definere det som en output, som du vil. Eller du sidder muligvis fast i en situation, hvor ATmega328 enten er i SPI-tilstand og kontrollerer alle SPI-ben eller ikke i SPI-tilstand og giver dig mulighed for at kontrollere alle SPI-ben.
@st2000: Jeg antager, at jeg bare skal eksperimentere og se, hvad der fungerer, og hvad der ikke fungerer.
@yabbadabba: Ja, som Gerben allerede har anbefalet. Kan muligvis være en løsning.
Hardwarefunktionerne er så pæne, fordi de er implementeret i hardware. Teoretisk set ville det kræve skift af selve hardwaren. Hvis du virkelig har brug for en ekstra pin, kan du bruge en I / O-ekspander (SPI eller I2C) eller en større chip.
To svar:
Joey M
2016-12-28 03:46:21 UTC
view on stackexchange narkive permalink

I mikrokontrollere har GPIO-stifterne en multiplexer til at vælge, hvad stiften bruges til. Når du bruger Arduino SPI-biblioteket, indstiller initialiseringsfunktionen multiplexeren til MOSI for den pin. Du skal være i stand til at køre din egen initialisering for den pin og overskrive, hvad SPI-initialiseringsfunktionen gjorde. Bare sørg for at kalde din initialisering efter SPI.begin (). Dette er den enkleste løsning.

Hvis det ikke virker af en eller anden grund, kan du grave i kildekoden til Arduino SPI-biblioteket. Dette er heller ikke for svært.

Bitbanging er den sværeste løsning og burde ikke være nødvendig for din applikation.

Denne løsning fungerede for mig. Jeg ville bruge MISO-stiften til DC på en SSD1331-skærm. Jeg ændrede privat AdaFruit-bibliotekskonstruktøren for at ringe til pinMode efter SPI.begin (), og det fungerede.
Devidas
2016-11-10 17:20:42 UTC
view on stackexchange narkive permalink

Du bruger ADC, som jeg formoder, at du ikke har nogen måde at ændre firmware eller noget til at ændre protokollen.
Ifølge SPI-protokollen, når Slave modtager en byte, sender den byte slags et to skift registre i cirkulær buffer. Så selvom din ADC afslutter konverteringen, vil den ikke kommunikere beskyttende, protokollen tillader det ikke.
Hvis du har en anden ADC IC, der er programmerbar, kan du implementere din protokol, men den er ikke SPI, det vil være din egen protokol, så vær sikker på den.



Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 3.0-licens, den distribueres under.
Loading...