www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Modus mit 3 Slaves, programmiert in C


Autor: Sebastian B. (m0nkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich bin leider gerade etwas überfordert mit dem Verständnis der Funktion 
des SPI mit meherern Slaves. Folgende Situation, ich steuere über den 
SPI eine MMC Karte an, dafür verwende ich den Code und die Schaltung von 
Ulrich Radig. Als µC verwende ich eine ATMega16 der mit 16Mhz läuft.
Jetzt möchte ich allerdings noch einen DAC über den SPI ansteurn, da 
eine Softwarelösung keine guten Ergebnisse bringt. Ich weiß das ich 
dafür mehere /SS Leitungen brauche. Soweit ich das verstehe, muss ich 
dann für jewals eine Slave einen PIN des ATMega16 als /SS Pin 
definieren, welche ist egal oder?
Jetzt kann ich mir nicht vorstellen wie das funktiniert wenn ich MMC und 
DAC an einer MISO Leitung angschlossen habe, woher wissen die Slaves 
denn das die gesendet Daten für den einen Slave und nicht für den 
anderen sind. Ich hab leider auch keine für mich aufschlussreichen 
Beispielschaltungen gefunden. Wenn die beiden Slaves einen /SS als 
Eingang haben, wäre das ja kein Problem, der DAC (ich verwende einen 
LTC1257) hat so wie ich das sehe keinen /SS Pin, sondern nur einen /LOAD 
eingang. Bei der MMC Karte bin ich mir überhaupt nicht im klaren ob ich 
die per /SS Stuern kann. Theoretisch, denke ich schon das ich die 
Funktionsweise des SPI mit meheren Slaves verstehe, nur praktisch krieg 
ich einfach nix auf die Reihe.
Außerdem möchte ich auch noch eine Onboard pProgrammierschnittstelle 
einbauen, dafür muss ich dann ja nochmal über den SPI gehen oder?

Das nächste Problem was sich mir stellt, die niedrigste Frequenz des CLK 
des SPI ist CPU/128, bei meinen 16MHz wären das dan 125kHz, was schon 
zuviel für den DAC der bei mir eine CLK von 96kHz brauch.

Ich hoffe ihr könnt mir helfen, ich steck total fest bei dieser Sache.

Gruß Sebastian

Autor: Michael L. (-mic-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo sebastian.

> Hi,
> ich bin leider gerade etwas überfordert mit dem Verständnis der Funktion
> des SPI mit meherern Slaves. Folgende Situation, ich steuere über den
> SPI eine MMC Karte an, dafür verwende ich den Code und die Schaltung von
> Ulrich Radig. Als µC verwende ich eine ATMega16 der mit 16Mhz läuft.
> Jetzt möchte ich allerdings noch einen DAC über den SPI ansteurn, da
> eine Softwarelösung keine guten Ergebnisse bringt. Ich weiß das ich
> dafür mehere /SS Leitungen brauche. Soweit ich das verstehe, muss ich
> dann für jewals eine Slave einen PIN des ATMega16 als /SS Pin
> definieren, welche ist egal oder?

richtig. solange du ihn als output konfigurieren kannst.

> Jetzt kann ich mir nicht vorstellen wie das funktiniert wenn ich MMC und
> DAC an einer MISO Leitung angschlossen habe, woher wissen die Slaves
> denn das die gesendet Daten für den einen Slave und nicht für den
> anderen sind.

normalerweise übernimmt nur der slave daten, dessen /SS-leitung LOW ist.

> Wenn die beiden Slaves einen /SS als
> Eingang haben, wäre das ja kein Problem,

genau.

> der DAC (ich verwende einen
> LTC1257) hat so wie ich das sehe keinen /SS Pin, sondern nur einen /LOAD
> eingang.

dieser DAC läßt sich ja auch nicht über SPI steuern (oder wo steht das 
im datenblatt?), sondern über eine serielle 3-Draht-Schnittstelle.
wenn's SPI wäre, hätte er auch einen /SS eingang.

dein problem ist, daß du den baustein nicht wie einen normalen 
SPI-baustein ansteuern kannst, weil er sofort bei LOAD = LOW die daten 
aus dem schieberegister übernimmt. wenn du dann grad am reinschieben 
bist (was bei "richtigem" SPI so wäre!) hättest du für 12 clockzyklen 
blödsinn im latch stehen, nämlich genau die letzten 1,5 byte (wg. 12bit 
register) der letzten übertragung zum zuletzt angesprochenen slave.
soweit klar?

> Außerdem möchte ich auch noch eine Onboard pProgrammierschnittstelle
> einbauen, dafür muss ich dann ja nochmal über den SPI gehen oder?

ja, es soll leute geben, die das schon mal gemacht haben.

> Das nächste Problem was sich mir stellt, die niedrigste Frequenz des CLK
> des SPI ist CPU/128, bei meinen 16MHz wären das dan 125kHz, was schon
> zuviel für den DAC der bei mir eine CLK von 96kHz brauch.

wo hast du denn das her? in meinem datenblatt für deinen DAC steht eine 
maximale frequenz von 1.4 MHz

gruß

michael

Autor: Sebastian B. (m0nkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael R. wrote:
> hallo sebastian.
>
>> Hi,
>> ich bin leider gerade etwas überfordert mit dem Verständnis der Funktion
>> des SPI mit meherern Slaves. Folgende Situation, ich steuere über den
>> SPI eine MMC Karte an, dafür verwende ich den Code und die Schaltung von
>> Ulrich Radig. Als µC verwende ich eine ATMega16 der mit 16Mhz läuft.
>> Jetzt möchte ich allerdings noch einen DAC über den SPI ansteurn, da
>> eine Softwarelösung keine guten Ergebnisse bringt. Ich weiß das ich
>> dafür mehere /SS Leitungen brauche. Soweit ich das verstehe, muss ich
>> dann für jewals eine Slave einen PIN des ATMega16 als /SS Pin
>> definieren, welche ist egal oder?
>
> richtig. solange du ihn als output konfigurieren kannst.
>

danke. :)

>> Jetzt kann ich mir nicht vorstellen wie das funktiniert wenn ich MMC und
>> DAC an einer MISO Leitung angschlossen habe, woher wissen die Slaves
>> denn das die gesendet Daten für den einen Slave und nicht für den
>> anderen sind.
>
> normalerweise übernimmt nur der slave daten, dessen /SS-leitung LOW ist.
>
>> Wenn die beiden Slaves einen /SS als
>> Eingang haben, wäre das ja kein Problem,
>
> genau.
>

Da, der DAC keinen /SS Pin hat, hat sich das für mich ja erledigt...

>> der DAC (ich verwende einen
>> LTC1257) hat so wie ich das sehe keinen /SS Pin, sondern nur einen /LOAD
>> eingang.
>
> dieser DAC läßt sich ja auch nicht über SPI steuern (oder wo steht das
> im datenblatt?), sondern über eine serielle 3-Draht-Schnittstelle.
> wenn's SPI wäre, hätte er auch einen /SS eingang.
>
> dein problem ist, daß du den baustein nicht wie einen normalen
> SPI-baustein ansteuern kannst, weil er sofort bei LOAD = LOW die daten
> aus dem schieberegister übernimmt. wenn du dann grad am reinschieben
> bist (was bei "richtigem" SPI so wäre!) hättest du für 12 clockzyklen
> blödsinn im latch stehen, nämlich genau die letzten 1,5 byte (wg. 12bit
> register) der letzten übertragung zum zuletzt angesprochenen slave.
> soweit klar?
>

Naja, ich wollte das mit SPI machen, weil mir das mehrfach hier im Fourm 
gesagt wurde. Was hab ich denn noch für eine Wahl wenn ich SPI nicht 
verwenden kann. Im Moment versuche ich über die PWM, CLK und LOAD für 
den DAC zu generieren, nur klappt das eher schlecht als recht mit dem 
Schieben der Bits.

>> Außerdem möchte ich auch noch eine Onboard pProgrammierschnittstelle
>> einbauen, dafür muss ich dann ja nochmal über den SPI gehen oder?
>
> ja, es soll leute geben, die das schon mal gemacht haben.
>

Danke, dafür hab ich auch schon die Lösung gefunden, ich verwende 
einfach einen PIN Header mit der PIN Belegung des SDT500.

>> Das nächste Problem was sich mir stellt, die niedrigste Frequenz des CLK
>> des SPI ist CPU/128, bei meinen 16MHz wären das dan 125kHz, was schon
>> zuviel für den DAC der bei mir eine CLK von 96kHz brauch.
>
> wo hast du denn das her? in meinem datenblatt für deinen DAC steht eine
> maximale frequenz von 1.4 MHz
>

Ja, das ist die Maximale Frequenz. Da ich die Daten aber mit 8kHz 
abgetastet habe und 12Bit in den DAC geschoben werden müssen, komm ich 
auf 8kHz mal 12 gleich 96kHz, damit auch genauso schnell abgespielt wie 
aufgenommen wurde.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Baier wrote:

>>
>
> Naja, ich wollte das mit SPI machen, weil mir das mehrfach hier im Fourm
> gesagt wurde. Was hab ich denn noch für eine Wahl wenn ich SPI nicht
> verwenden kann. Im Moment versuche ich über die PWM, CLK und LOAD für
> den DAC zu generieren, nur klappt das eher schlecht als recht mit dem
> Schieben der Bits.
>

dann nimm halt einen anderen DAC, es gibt doch genug DAC mit 
SPI-Interface..zB AD5722...

Autor: Michael L. (-mic-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Naja, ich wollte das mit SPI machen, weil mir das mehrfach hier im Fourm
> gesagt wurde.

geht ja an sich auch:
du schiebst deine 12-bit-werte in zwei 8bit-übertragungen (MSB first!!!) 
raus. die ersten vier bits landen dabei im nirwana, d.h. der abtastwert 
darf nicht in diesen bits liegen.
dann gibst du einen LOW-puls auf den /LOAD-eingang und das war's.

aber es ist eben kein "richtiges" SPI ;-)

> Ja, das ist die Maximale Frequenz. Da ich die Daten aber mit 8kHz
> abgetastet habe und 12Bit in den DAC geschoben werden müssen, komm ich
> auf 8kHz mal 12 gleich 96kHz, damit auch genauso schnell abgespielt wie
> aufgenommen wurde.

das is doch wurscht. je schneller du den nächsten wert in den DAC 
schiebst, umso besser (im rahmen der spezifikationen natürlich).
du mußt nur dafür sorgen, daß dein /LOAD-impuls im 8kHz-raster kommt. 
und den mußt du ohnehin zu fuß erzeugen.

oder kommt's dir wirklich auf's bit-timing an??

gruß

michael

Autor: Sebastian B. (m0nkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael R. wrote:
>> Naja, ich wollte das mit SPI machen, weil mir das mehrfach hier im Fourm
>> gesagt wurde.
>
> geht ja an sich auch:
> du schiebst deine 12-bit-werte in zwei 8bit-übertragungen (MSB first!!!)
> raus. die ersten vier bits landen dabei im nirwana, d.h. der abtastwert
> darf nicht in diesen bits liegen.
> dann gibst du einen LOW-puls auf den /LOAD-eingang und das war's.
>
> aber es ist eben kein "richtiges" SPI ;-)
>

Warum in 2 8Bit werten? ein 16 Bit würde doch auch gehen. Ok, müsste 
dann halt nurnoch daran denken das kein LOAD kommt, wenn ich auf die MMC 
Karte schreiben, sonst Wandelt er die MMC Daten. Da ich momentan einen 
Timer verwende um CLK und LOAD zu generieren, würde ich bei Benutzung 
von SPI die manuelle CLK generierung nicht mehr benötigen. Da ich aber 
mit dem selben Timer über PWM sowohl CLK und LOAD generiere, würde ich 
bei Nutzung von SPI nichts einsparen. Ich hab allerdings keine Ahnung 
wie ich ich per PWM so ein LOAD Signal mit 8kHz wie es mein DAC brauch, 
generiere.

>> Ja, das ist die Maximale Frequenz. Da ich die Daten aber mit 8kHz
>> abgetastet habe und 12Bit in den DAC geschoben werden müssen, komm ich
>> auf 8kHz mal 12 gleich 96kHz, damit auch genauso schnell abgespielt wie
>> aufgenommen wurde.
>
> das is doch wurscht. je schneller du den nächsten wert in den DAC
> schiebst, umso besser (im rahmen der spezifikationen natürlich).
> du mußt nur dafür sorgen, daß dein /LOAD-impuls im 8kHz-raster kommt.
> und den mußt du ohnehin zu fuß erzeugen.
>
> oder kommt's dir wirklich auf's bit-timing an??
>
> gruß
>
> michael

Hast ja recht, nochmal danke. :D Ich schau mal ob das bei mir 
funktioniert und/oder sinnvoll ist.

Gruß Sebastian

Autor: Michael L. (-mic-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> geht ja an sich auch:
>> du schiebst deine 12-bit-werte in zwei 8bit-übertragungen (MSB first!!!)
>> raus. die ersten vier bits landen dabei im nirwana, d.h. der abtastwert
>> darf nicht in diesen bits liegen.
>> dann gibst du einen LOW-puls auf den /LOAD-eingang und das war's.
>>
>> aber es ist eben kein "richtiges" SPI ;-)
>>
>
> Warum in 2 8Bit werten? ein 16 Bit würde doch auch gehen.

nein, die SPI-schnittstelle überträgt nur 8bit-werte (die du natürlich 
aus einer 16-bit-variable holen kannst - keine frage).

> Ok, müsste
> dann halt nurnoch daran denken das kein LOAD kommt, wenn ich auf die MMC
> Karte schreiben, sonst Wandelt er die MMC Daten.

genau.

> Da ich momentan einen
> Timer verwende um CLK und LOAD zu generieren, würde ich bei Benutzung
> von SPI die manuelle CLK generierung nicht mehr benötigen.

richtig.

> Da ich aber
> mit dem selben Timer über PWM sowohl CLK und LOAD generiere, würde ich
> bei Nutzung von SPI nichts einsparen.

doch. gegenüber einer timerlösung sparst du 10 interrupts.

> Ich hab allerdings keine Ahnung
> wie ich ich per PWM so ein LOAD Signal mit 8kHz wie es mein DAC brauch,
> generiere.

ich würd's so machen:
übertragung per SPI, wie oben gesagt.
nach jedem zweiten SPI-interrupt generierst du in der SPI-ISR deinen 
LOAD-puls und stößt die übertragung für den nächsten sample-wert an.

triggern läßt du die SPI-übertragung per timer-interrupt mit 8kHz.
gute idee?

gruß

michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.