Hallo,
ich möchte einen ADC vom Typ MCP3008 per SPI ansprechen. Dazu benutze
ich folgenden Prozess, um eine Kommunikation zu erreichen, wie sie in
FIGURE 6.1 auf Seite 21 des Datenblatts zu sehen ist:
Ich habe noch nicht ganz begriffen, wie genau die SPI-Schnittstelle des
MCP3008 arbeitet, insbesondere, weil es anscheinend einen Modus gibt,
bei dem eine Abfrage 24 Takte braucht und einen, bei dem es 16 sind.
Egal, ich habe das mit 24 Takten versucht: Hier wird also
"000000011000000000000000" zum MCP3008 geschoben. Die erste '1' ist das
Startbit. Die folgenden Bits '1000' bewirkt, dass Channel 0 single-ended
abgerufen wird. Das funktioniert auch alles einigermaßen. Allerdings ist
folgendes Problem aufgetreten: Ich habe versucht, in den Prozess direkt
dahinter eine weitere Abfrage eines anderen Channels einzubauen, also
die Anzahl der states verdoppelt und beim zweiten Durchlauf einfach die
Bits angepasst. Es sollte also immer nacheinander ...Ch0-Ch1-Ch0-Ch1...
abgefragt werden. Komischerweise kam dabei aber die Abfragesequenz
...Ch0-Ch0-Ch1-Ch0-Ch0-Ch1... raus. Ich hab absolut nicht verstanden,
wie das sein kann. Deshalb habe ich das ganze wieder auf eine einzige
sich wiederholdende Abfrage reduziert und hinter die Abfrage mit einem
counter ein delay gesetzt. Auch hier zeigt sich ein Fehler. Er ist aus
den angehängten screenshots vom LA ersichtlich: Auf dem ersten Bild ist
eine Abfrage zu sehen. Das Funktioniert grundsätzlich. Auf dem zweiten
Bild habe ich etwas herausgezoomt. Man man sieht, dass nach jedem
zweiten Durchlauf der delay nicht greift. Das kann ich mir nicht
erklären, aber ich vermute, dass es die selbe Ursache hat wie mein
Problem bei zwei Abfragen hintereinander. Was mach ich falsch?
VG
Oh je, wie peinlich. Die genaue Ursache hab ich zwar nicht gefunden,
aber die Simulation hat mich zumindest veranlasst, die ganzen
überflüssigen states zu entfernen, die ich ursprünglich zum debuggen
drin hatte. Ohne die läuft es jetzt wie es soll. Auf die Idee, den Code
zu entrümpeln hätte ich natürlich auch vorher schonmal kommen können.
Hallo!
Du scheinst dein Problem ja schon gelöst zu haben, daher kommt das
vielleicht etwas zu spät... aber vielleicht hilft Dir das trotzdem noch.
Ich habe mich vor ein paar Wochen auch selbst an einer SPI Schnittstelle
zum MCP3008 in VHDL versucht (und im Endeffekt eher Probleme mit dem
Analogteil gehabt: siehe Beitrag "SAR ADC erzeugt Spikes während AD Wandlung?"
und Beitrag "Hilfe Auslegung low-pass Filter und Verbindung zu ADC"), aber irgendwie doch
ungewollt immer ein oder zwei überflüssige States eingebaut. Schließlich
hab ich mir dann doch mal den Referenz-Code zu meinem Board angesehen
und nach ausführlichem Studium jeder einzelnen Code-Zeile bin ich zu dem
Schluss gekommen, dass ich es wohl nicht smarter und kürzer selbst
aufschreiben kann (vielleicht kann Lothar es doch, er scheint ja ein
Meister darin zu sein ;)).
Beispielweise bin ich eingangs nicht selbst auf so etwas simples wie
dies hier, obwohl es natürlich nur eine klassische
Shiftregister-Beschreibung ist (quasi bis zum vollständigen DAC Wert
"ungueltige" Werte weiter zu schieben, aber den momentanen adc_miso Wert
direkt in Q abzulegen, so dass dann mit dem letzten Hineintakt-State,
ohne im Anschluss eine weitere Kopie von Q irgendwo "abzulegen", in
einem anderen Prozess Q direkt übernommen werden kann, ...), da hätte
ich wieder extra-states verschenkt:
1
-- MISO shift register (rising edge)
2
shift_in:process(adc_clock)
3
begin
4
ifadc_clock'eventandadc_clock='1'then
5
ifstate='1'then
6
Q(0)<=adc_miso;
7
Q(9downto1)<=Q(8downto0);
8
endif;
9
endif;
10
endprocess;
Oder beispielweise auch, das invertierte "state"-Bit direkt als CS
Ausgangssignal zu benutzen...
Vermutlich muss ich mir noch mehr solcher Implementationen ansehen, um
solche Konstrukte in Zukunft wie ein Template einfach aus dem Kopf holen
zu können.
Der vollständige MCP3008/SPI VHDL Code ist zu finden hier:
https://www.micro-nova.com/resources/ unter "Tutorials & Example Code",
"On-board ADC Reference Design" (ich wollte die ZIP-Datei jetzt nicht
einfach so verlinken).
Viele Grüße,
Ingo
Hallo Ingo,
ja, der Codeschnipsel sieht in der Tat elegant aus. Das merk ich mir auf
jeden Fall. Wobei ich aber eigentlich ohnehin nie abschätzen kann, was
das Synthesetool am Ende aus meinem Code macht. Da fehlt mir definitiv
die Erfahrung. Deine beiden threads hab ich übrigens schon gesehen und
gebookmarked. Die wollte ich auch durchgehen, wenn ich beim
Antialiasing-Filter angekommen bin. Ich rechne mit einigen Problemen,
über die du dann zu meinen Glück vielleicht schon gestolpert bist.
VG
Eine eigene Frage?
Dieser Thread ist über 8 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.