Arduino DUE und SPI - Schnittstelle, MOSI mit Oszi messen

Gast #5293489
Lesenswert?

Liebe Leute, anbei eine Frage, die ich bis dato selbst nicht klären 
konnte.

Ich möchte über meine SPI Schnittstelle vom DUE ein bestimmtes Byte 
rausschicken (MOSI), z.B. 10101010.

Bevor ich irgendein SLAVE anschließe, möchte ich jedoch erst mal 
schauen, ob das Bitmuster auch wirklich so rausgegeben wird.

Also messe ich einfach nur an meine MOSI-Leitung gegen Masse und stelle 
da fest, dass wir entweder nur HIGH oder LOW haben, nichts 
alternierendes.

Mache ich da ein Messfehler oder habe ich ein logischen Fehler?

Ich poste euch den kurzen Code mal dazu:

======================================================

#include <SPI.h>

SPISettings settingsA(1000000, MSBFIRST, SPI_MODE1);

void setup() {
  // put your setup code here, to run once:
 pinMode (4, OUTPUT);

SPI.begin();

}


void loop() {
  // put your main code here, to run repeatedly:

 byte A=0b01010101; // Das Bitmuster möchte ich an MOSI schicken
 byte B=0b00110010; // Im Anschluss soll das Bitmuster direkt 
losgeschickt werden

SPI.beginTransaction(settingsA);

digitalWrite(4,LOW); // Ziehe SlaveSelect auf LOW
SPI.transfer(A);     // Sende nun die ersten 8 Bit
SPI.transfer(B);     // Sende nun die zweiten 8 Bit
digitalWrite(4,HIGH); // Setze SS auf HIGH
SPI.endTransaction();
delay(1000);
}


======================================================


Über Anregungen, Tipps, etc. wäre ich euch sehr dankbar.
#5293503
Lesenswert?

@ Benjamin Nels (Gast)

>Also messe ich einfach nur an meine MOSI-Leitung gegen Masse und stelle
>da fest, dass wir entweder nur HIGH oder LOW haben, nichts
>alternierendes.

Oszi richtig benutzt? Trigger auf Normal eingestellt? Richtiger Kanal 
als Triggerquelle, Triggerlevel?

>Über Anregungen, Tipps, etc. wäre ich euch sehr dankbar.

Da du so oder so ein Chip Select Signal brauchst, solltest du auch das 
in deinem Arduino ansteuern und mit einem 2. Kanal anzeigen. Das kann 
man dann auch wunderbar als Triggerquelle für die Messung nutzen.
Gast #5293702
Lesenswert?

Falk B. schrieb:
> Da du so oder so ein Chip Select Signal brauchst, solltest du auch das
> in deinem Arduino ansteuern und mit einem 2. Kanal anzeigen.

... oder als Hilfestellung mal das

delay(1000);

auf 1ms reduzieren damit die Wiederholrate gross genug ist.
Dann sieht man (leichter) auch auf einem analogen Oszilloskop
die Daten- bzw Clock-Pakete.
Gast #5293730
Lesenswert?

Marco H. schrieb:
> Dann lege mal den CS auf und dann schau mal wo der bei 10MHZ ist ? Das
> meinte ich mit Nachlesen. Dann mit einen Device funktionierte dies
> vermutlich dann nicht mehr.

Bevor du hier weiteren unverständlichen Mist schreibst solltest
du vielleicht erst mal öffentlich einsehen dass dein erster
Beitrag hier im Thread schon Mist ist.
#5293740
Lesenswert?

Nicht verständlich geschriebenen das der DUE einige Besonderheiten mit 
sich bringt. Genau das steht da nämlich drin.. Das Verhalten kam 
vermutlich vom falschen Trigger. Trotzdem wird es nicht funktionieren, 
der CS sollte von der Hardware betätigt werden. Selbst bei 1MHZ kann das 
mit dem Arduino schon nicht mehr funktionieren da das Pin Umschalten 
erheblich viel Code anschiebt wie man das auf Register Ebene erledigen 
würde.

Leg doch mal den CS auf ? Schraube den Clock von 1MHZ auf 10MHZ und 
schaue wie der im Signal liegt. digitalWrite() dürft nicht warten bis 
der Pin den zustand erreicht hat.
Gast #5293789
Lesenswert?

Marco H. schrieb:
> Trotzdem wird es nicht funktionieren,
> der CS sollte von der Hardware betätigt werden.

Höre endlich auf deinen geistigen Dünnschiss hier abzulassen.

Ich benutze den Soft-CS seit ewigen Zeiten und er funktioniert
einwandfrei, auch im Code-Beispiel des TOs. Siehe auch
Screenshot.

Ich wollte hier deine einzelnen Dünnschisse widerlegen aber
das ist mir zu mühsam diesem offensichtlichen Mist zu
widersprechen.
Angehängte Dateien:
#5293795
Lesenswert?

Na dann wenn nichts dran hängt dann braucht er den SPI Port ja auch 
nicht. Scherz beiseite, da kommt aber etwas rann. Schau dir von SPI 
Devices die Spezifikation an. Dann kommen wir auf den CS zurück... Das 
Problem ist beim Soft CS das die Daten schon ausgebenden werden obwohl 
der CS nicht unten ist. Das Datensignal wird zum Anfang verschluckt. 
Weil das Umschalten des Pins zu lange dauert. Bei 1MHZ funktioniert das 
ewt. noch, bei 10MHZ nicht mehr. Jetzt könnte man ein delay zwischen 
packen das ginge, ist aber unschön und mindert die Framerate.

Der Frust warum nichts brauchbares zurück kommt ist ihm sicher.
Über den Rest kann man streiten, es schadet nie ins Manual zu schauen.
#5293811
Lesenswert?

Na dann macht mal... mit euren Soft CS schau mal bei 10MHZ oder 25MHZ 
und ziehe dir die Spezifikation einen SPI Devices zu rate.

Aus Erfahrung kann ich der sagen das beim SAM21D ab 5MHZ mit einen Soft 
CS nichts mehr funktioniert. Tja mit ASM braucht man deutlich weniger 
Takte. Das ist eben der Dünnschiß aus der Praxis.

Und warum das eben so schön funktioniert hat steht auch da drin.
"NB : once SPI.begin() is called, the declared pin will not be available 
as a general purpose I/O pin"

Dein digitalWrite() ist wirkungslos weil der MUX schon auf dem Hardware 
SS geschaltet wurde. Ehrlich zugegeben das ist mir auch gerade 
eingefallen, weil das Signal so sauber aussah ;). Benutze mal einen 
anderen PIN und dann schau nochmal nach auch bei höheren Clock.
Gast #5294469
Lesenswert?

Danke für eure Antworten liebe Leute, aber streitet doch bitte nicht.

Falk B. schrieb:
> Oszi richtig benutzt? Trigger auf Normal eingestellt? Richtiger Kanal
> als Triggerquelle, Triggerlevel?

Wozu eine Triggerquelle? Ich sende das Bitmuster doch eig. in der 
Loop-schleife, d.h. das Bitmuster wird immer wieder neu ausgegeben, 
dadurch reicht mir doch eine normale Messung am Oszi ohne irgendwelche 
Trigger.

Marco H. schrieb:
> https://www.arduino.cc/en/Reference/SPI nachlesen !
>
> besonders hier https://www.arduino.cc/en/Reference/DueExtendedSPI
>
> Der DUE ist eben ein ARM und der funktioniert etwas anders ;).

Was will man mir hiermit sagen? Entweder hilfreiche Antworten oder lass 
es einfach. Die beiden Seiten kenne ich.

Due Mitläufer schrieb:
> delay(1000);
>
> auf 1ms reduzieren damit die Wiederholrate gross genug ist.
> Dann sieht man (leichter) auch auf einem analogen Oszilloskop
> die Daten- bzw Clock-Pakete.

Das werde ich mal probieren.


Aber wie gesagt, meiner Meinung nach muss ich doch keine bestimmten 
OSZI-Einstellungen treffen, oder? Der Normal-Modus sollte doch 
ausreichen, oder muss ich triggern? Triggern müsste ich doch nur, wenn 
das Bitmuster nur ein einziges mal ausgegeben wird. Da ich jedoch in der 
void loop() Funktion den Code eingefügt habe, wiederholt er sich doch 
die ganze Zeit, ähnlich einer for-schleife. Von daher sollte das 
Bitmuster doch immer wieder neu gesendet werden nach einem Takt.

Daher reicht meiner Meinung nach nur ein Normal-Modus.

Vielen Dank für eure Antworten.
Gast #5294484
Lesenswert?

Benjamin Nels schrieb:
> Vielen Dank für eure Antworten.

Mit deiner Reaktionszeit wird es vielen schwerfallen weiter
auf dich einzugehen.

Benjamin Nels schrieb:
> Triggern müsste ich doch nur, wenn
> das Bitmuster nur ein einziges mal ausgegeben wird.

Müssen tut man nur sterben. Aber es ist wesentlich leichter
mit einer Triggerschwelle zu arbeiten. Dass du deinen Trigger-
Pegel auf das eingespeiste Signal selbst richten kannst hast
du noch gar nicht verstanden.

Also:

- Trigger auf intern schalten.
- Trigger Quelle auf den Kanal den du betrachten willst
- Trigger Level auf 1/2 Logikpegel also ca 1.6V
Gast #5294694
Lesenswert?

Benjamin Nels schrieb:
> Was will man mir hiermit sagen? Entweder hilfreiche Antworten oder lass
> es einfach. Die beiden Seiten kenne ich.

Na, na na...
Nicht so schnell...

Lesen und Verstehen, sind oftmals 2 paar Schuhe.

Wenn du den Default SS verwendest, gibts keine Extrawurst zu backen.
Aber hier will Pin 4 als CS genutzt werden.
Und dann ist der Artikel doch schon interessant!

Merksatz:
PinMode und DigitalWrite sind Gift für den DUE SPI

Dieses funktioniert mit Pin 4 als CS:
1
#include <SPI.h>
2

3
const byte CS = 4;
4

5
void setup() 
6
{ 
7
  SPI.begin(CS);
8
  SPI.setClockDivider(CS,84);
9
}
10

11

12
void loop() 
13
{
14
 byte A=0b01010101; // Das Bitmuster möchte ich an MOSI schicken
15
 byte B=0b00110010; // Im Anschluss soll das Bitmuster direkt losgeschickt werden
16

17
 SPI.transfer(CS,A,SPI_CONTINUE);     // Sende nun die ersten 8 Bit
18
 SPI.transfer(CS,B);     // Sende nun die zweiten 8 Bit
19
}
Gast #5294713
Lesenswert?

Marco H. schrieb:
> Selbst bei 1MHZ kann das mit dem Arduino schon nicht mehr funktionieren
> da das Pin Umschalten erheblich viel Code anschiebt wie man das auf
> Register Ebene erledigen würde.

Auch beim Arduino Due steht es jedem frei, einen Pin direkt über die 
Register zu steuern, so wie es ihn am besten deucht.
Beitrag #5294870 wurde von einem Moderator gelöscht.
Gast #5295206
Lesenswert?

Du kannst machen, was du für richtig hältst!
Aber jammere bitte nicht rum, wenn dir die Brocken auf die Füße fallen.

Kann auch gut sein, dass dich das nicht interessiert, dass da noch ein 
anderer  CS Pin (der Default SS Pin) völlig sinnbefreit rum zappelt...
Alles gut. Das musst du noch nicht einmal ignorieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren