Hoe gegevens te lezen met behulp van Arduino SPI

in de datasheet staat dat ik 32 seriële klokken moet toepassen om de 32 bits aan gegevens te krijgen. Hoe kan Ik programmeer dit is Arduino?

Reacties

  • Ik raad je aan om de voorbeelden van de SPI-bibliotheek te openen en ze te controleren. Hoe dan ook, de code zou byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); en je vindt in result de 32 bits die je nodig hebt
  • Dat heb ik al gedaan. maar de energiechip Ik gebruik is STPM10 en het suggereert dat ik simplex synchrone SPI moet gebruiken waar de MOSI niet is aangesloten. Er is alleen een timingdiagram om over te schakelen van het lezen van bytes en het schrijven van bytes. Toen ik SPI.transfer () gebruikte, zijn de gegevens niet stabiel en ik denk niet betrouwbaar
  • Hoe zegt u dat het niet betrouwbaar is? Het randapparaat is full duplex en volgens de manier waarop het werkt, is het verzenden van dummy-gegevens de enige manier om gegevens te ontvangen. niet verbonden, het maakt ‘ niet uitmerk echter op dat je ‘ de MOSI-pin niet voor andere taken kunt gebruiken. Weet je trouwens nog dat je de slaaf-selectie-pin van het andere randapparaat correct hebt ingesteld? Heb je de SS-pin op het Arduino-bord of een andere gebruikt?

Answer

Je belt SPI.transfer() vier keer, waarbij elke keer de geretourneerde waarde wordt opgeslagen in een variabele na de juiste bitverschuiving.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

Ik neem aan dat de byte wordt als eerste ontvangen. Zorg ervoor dat de SPI-modus de juiste is, zoals aangegeven in uw gegevensblad.

Als de slaaf het niet aankan om tussen bytes te worden uitgeschakeld (wat is SPI.transfer() zal doen aan het einde van de transactie), dan kun je ofwel de hardware SPI-benadering van st2000 proberen of bitbanged SPI gebruiken met shiftIn().

Reacties

  • Ik weet niet zeker of dit zal werken. We moeten echt weten hoe de SPI-slaaf werkt voordat we kunnen aannemen hoe hij zal reageren. En als de Chip Select-regel wordt bevestigd en opgeheven bij elke 8-bits SPI-transactie, hoe goed is de SPI-slaaf dan ontworpen? Dat wil zeggen, zon SPI-slaaf kan gemakkelijk niet synchroon lopen met de SPI-master. Specifiek, hoe weet je zeker welke 8 bit byte je werkelijk leest?
  • @ st2000 Het OP vond het gepast om niet genoeg details te geven; niets anders dan aannames kunnen worden gedaan totdat dat verandert.
  • Alle voorbeelden die ik ‘ heb gezien, gebruiken SPI, transfer (0) om gegevens te lezen in plaats van SPI. (0xff). Ze gebruiken ook SPI.transfer voor het schrijven van gegevens. Ik heb nog steeds ‘ t ontdekt wat SPI doet met de 0 of 0xff wanneer u feitelijk gegevens leest. Wordt dit naar de slaaf gestuurd?
  • @ S.Imp Ze ‘ zijn dummy bytes. U kunt verzenden wat u maar wilt verzenden, het apparaat aan de andere kant zal ze nog steeds weggooien, als het de gegevens zelfs maar betaalt. SPI.transfer() wordt altijd gedeeltelijk gebruikt vanwege het intrinsieke full-duplex karakter van SPI en (als resultaat van de eerste factor) gedeeltelijk vanwege de manier waarop de meeste MCUs hun SPI-randapparatuur implementeren. Zodra de klok begint te lopen, zijn er altijd ” gegevens ” op de MOSI- en MISO-lijnen, deze zijn ‘ is slechts aan elke deelnemer op de bus om het te lezen of niet, op basis van welk vooraf gedefinieerd protocol van een hogere laag dan ook of de ” gegevens ” is zinvol of niet.
  • Het zou niet ‘ t totaal onjuist zijn om te zeggen dat je ‘ t echt lezen zonder te schrijven op een SPI-bus en vice versa. Het is dus logisch om gewoon een randapparaat te ontwerpen dat een byte in het ene register nodig heeft en, 8 cycli later, een byte in een ander (of zelfs hetzelfde) register retourneert, alleen om usecases te generaliseren. Vervolgens is het ‘ aan de ‘ s applicatie van de gebruiker om te beslissen of ze ‘ opnieuw alleen geïnteresseerd in de byte die in de eerste plaats werd uitgeschreven (TX) of degene die werd teruggelezen (RX) of beide (TX en RX). Vandaar ook de dubbelzinnige naam transfer() aangezien het zowel lees- als schrijfrollen dient.

Antwoord

Sparkfun heeft een goede uitleg van wat SPI is:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

De Arduino IDE heeft een SPI-bibliotheek die bij de IDE wordt geleverd.
http://www.arduino.cc/en/Reference/SPI

De bibliotheek wordt geleverd met twee voorbeelden:
SPI gebruiken om een luchtdruksensor te lezen
Een digitale potentiometer besturen met SPI

Answer

Het doel is om 32 bits te lezen met de SPI-poort van het (onbekende) apparaat.

Als het apparaat de SPI Chip Select-lijnactiviteit tolereert (van inactief naar actief naar inactief voor elke 8 bit byte lezen), zou je in staat moeten zijn om de gewenste 32 bits aan gegevens te verkrijgen door 4 opeenvolgende 8 bit SPI leest.

Als het apparaat de bovenstaande SPI Chip Select-lijnactiviteit echter niet tolereert (dat wil zeggen, als het apparaat vereist dat de SPI Chip Select actief is voor de volledige 32-bits SPI-transactie), u kunt de 32-bits transactie niet scheiden in 4 individuele 8-bits SPI-transacties zonder controle over de SPI Chip Select-regel. Het volgende codevoorbeeld illustreert hoe dit wordt gedaan:

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

Het bovenstaande voorbeeld komt uit de Arduino SPI-bibliotheek webpagina en is een 16 bit (geen 32 bit) overdracht. Om een 32-bits overdracht te coderen, blijft u de SPI.transfer-methode aanroepen met de SPI_CONTINUE-parameter.

later toegevoegd …

Het lijkt erop dat mensen het gebruik van de DueExtendedSPI-methoden ontmoedigen . En SPISettings en SPI.beginTransaction () moeten worden gebruikt? Als dit het geval is, geeft deze pagina een voorbeeldcode weer waarbij de code expliciet de SPI Chip Select-regel bestuurt (zoek naar slaveAPin & slaveBPin). Merk op hoe de code 24 bits van slaaf A leest en 8 bits naar slaaf B schrijft. Om 32 bits in plaats van 24 bits te lezen, moeten we een segment van de code (samen met een paar andere ondersteunende wijzigingen) op deze manier wijzigen:

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

Reacties

  • We moeten echt de specificaties van het slave-SPI-apparaat zien om een meer specifiek antwoord.
  • Ik gebruik STPM10 evaluatiebord. De verbinding is een simplex synchrone SPI en de MOSI van de Arduino is nergens mee verbonden. Er is een timingdiagram om over te schakelen van alleen-lezen en alleen schrijven. Mijn probleem is het lezen van de gegevens uit de registers van de chip. Ik heb SPI.transfer gebruikt, maar ik denk niet dat ‘ de gegevens betrouwbaar zijn.
  • Het STPM10-timingdiagram op pagina 11 ervan ziet er niet uit als een standaard SPI-transactie. Ik ben geneigd te zeggen dat je de Arduino SPI-bibliotheek niet kunt gebruiken. In plaats daarvan moet je dit misschien helemaal in software uitpraten. Ik geloof bijvoorbeeld niet dat er een regel ” SYN ” in de standaard SPI-bus zit. En ik denk niet ‘ niet dat de Chip Select-regel hoog moet worden voor het einde van de SPI-transactie.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *