Arduino Uno & ADG714 via SPI funktioniert nur sporadisch

OP #4983364
Hallo zusammen,

ich habe einen ADG714 via SPI mit dem Arduino Uno verbunden und in 
Betrieb genommen. Momentan hängen an dem Analog Switch nur 8 LEDs. die 
SPI Übertragung funktioniert, zumindest habe ich auf dem Oszi ein Clock 
und SS Signal. Die LEDs leuchten auch, jedoch nur wenn ich mit meinem 
Finger das ADG714 berühre oder mich mit dem Oberkörper über die 
Schaltung beuge, das selbe gilt auch für den Arduino, sobald ich mit dem 
Finger etwas auf dem Board berühre leuchten die LEDs ansonsten tut sich 
nichts, trotz korrektem CLK und SS Signal auf dem Oszi. Woran kann das 
liegen ?
Mein Code:
1
#include <SPI.h>
2

3
void setup() 
4
  {
5
  digitalWrite(SS, HIGH);  
6
  SPI.begin (); 
7
  }
8
void loop() 
9
{
10
sw1();
11
sw2();
12
sw3();
13
sw4();
14
sw5();
15
sw6();
16
sw7();
17
sw8();
18
alloff();
19
}
20

21
void alloff()
22
{
23
  digitalWrite(SS, LOW);    
24
  byte test = B00000000;
25
  SPI.transfer (test);
26
  digitalWrite(SS, HIGH);
27
  delay(500);
28
  SPI.endTransaction ();
29
}
30
void sw1()
31
{
32
  digitalWrite(SS, LOW);    
33
  byte test1 = B10000000;
34
  SPI.transfer (test1);
35
  digitalWrite(SS, HIGH);
36
  delay(500);
37
  SPI.endTransaction ();
38
}
39
void sw2()
40
{
41
  digitalWrite(SS, LOW);    
42
  byte test2 = B01000000;
43
  SPI.transfer (test2);
44
  digitalWrite(SS, HIGH);
45
  delay(500); 
46
  SPI.endTransaction ();
47
}
48
void sw3()
49
{
50
  digitalWrite(SS, LOW);    
51
  byte test3 = B00100000;
52
  SPI.transfer (test3);
53
  digitalWrite(SS, HIGH);
54
  delay(500);
55
  SPI.endTransaction ();
56
}
57
void sw4()
58
{
59
  digitalWrite(SS, LOW);
60
  byte test4 = B00010000;
61
  SPI.transfer (test4);
62
  digitalWrite(SS, HIGH);
63
  delay(500);  
64
  SPI.endTransaction ();
65
}
66
void sw5()
67
{
68
  digitalWrite(SS, LOW);
69
  byte test5 = B00001000;
70
  SPI.transfer (test5);
71
  digitalWrite(SS, HIGH);
72
  delay(500);
73
  SPI.endTransaction ();
74
}
75
void sw6()
76
{
77
  digitalWrite(SS, LOW);
78
  byte test6 = B00000100;
79
  SPI.transfer (test6);
80
  digitalWrite(SS, HIGH);
81
  delay(500);
82
  SPI.endTransaction ();
83
}
84
void sw7()
85
{
86
  digitalWrite(SS, LOW);
87
  byte test7 = B00000010;
88
  SPI.transfer (test7);
89
  digitalWrite(SS, HIGH);
90
  delay(500);
91
  SPI.endTransaction ();
92
}
93
void sw8()
94
{
95
  digitalWrite(SS, LOW);
96
  byte test8 = B00000001;
97
  SPI.transfer (test8);
98
  digitalWrite(SS, HIGH);
99
  delay(500);  
100
  SPI.endTransaction ();
101
}

Die Verkabelung ist auch korrekt:

D13(CLK) ----> Pin1   ADG714 SCLK
D12(MISO)---> Pin3   ADG714 DIN
D11(MOSI)---> Pin22 ADG714 DOUT
D10(SS) -----> Pin24 ADG714 /SYNC

An dem Analog Switch habe ich jeweils an Source eine 5v Spannung (Selbe 
Leitung die auch den IC versorgt) angeschlossen und die LEDs hängen mit 
330Ohm Vorwiderständen jeweils an Drain.
Anbei das Datenblatt zum Analog Switch.

Jemand eine Idee ?
Angehängte Dateien:
Gast
Arduino F. schrieb:
> Schon mal daran gedacht, SS zum OUTPUT zu machen?

SS ist doch Standardmässig ein Output?

Wenn das dass problem wäre, dürfte gar nichts klappen. Ich sehe mein SS 
ja auf dem Oszi es tut auch was es soll. Der fehler muss eigentlich an 
der Schaltung liegen.
Gast
Kord Friemel schrieb:
> SS ist doch Standardmässig ein Output?
Das hast du dir doch nur ausgedacht.

Hättest du dich über AVR SPI informiert, wüsstest du, dass SPI in den 
SlaveMode schaltet, wenn SS ein Input und LOW ist.

Also:
Fachbuch auf den Tisch und 5 Stunden nachsitzen.
Gast
>SS ist doch Standardmässig ein Output?

Nein.

>Wenn das dass problem wäre, dürfte gar nichts klappen. Ich sehe mein SS
>ja auf dem Oszi es tut auch was es soll.

Du siehst wie der interne Pullup ein/ausgeschaltet wird.
OP
Ich habe mir die Schaltung an meinem Arduino Mega aufgebaut. Mein Code 
sieht nun so aus:
1
#define SS 53
2

3
#include <SPI.h>
4

5
void setup() 
6
  {
7
  pinMode(48, OUTPUT); //Reset
8
  pinMode(SS, OUTPUT); 
9
  digitalWrite(SS, HIGH); 
10
  digitalWrite(48, HIGH);
11
  SPI.begin (); 
12
  }
13

14
void loop() 
15
{
16
alloff();
17
sw1();
18
}
19

20
void alloff()
21
{
22
  digitalWrite(SS, LOW);   
23
  byte test = B00000000;
24
  SPI.transfer (test);
25
  digitalWrite(SS, HIGH);
26
  delay(500);
27
}
28
void sw1()
29
{
30
  digitalWrite(SS, LOW);    
31
  byte test1 = B11111111;
32
  SPI.transfer (test1);
33
  digitalWrite(SS, HIGH);
34
  delay(500);
35
}

doch jetzt tut sich gar nichts mehr...
Gast
(MOSI) ist der Master Output
(DOUT) ist der Slave Output

Output arbeitet gegen Output.
Rauch droht!

Kord F. schrieb:
> Die Verkabelung war auf dem Arduino Uno ja auch nicht anders.
Dann ist sie da auch schon falsch gewesen.

Haben nur alle übersehen, incl. meiner Wenigkeit.
OP
Oh, Danke !

Ein erneuter blick ins Datenblatt:

Serial Data Output. This allows a number a parts to be daisy chained.
Data is clocked out of the input shift register on the rising edge of 
SCLK. DOUT is an open-drain output that should be pulled to the supply 
with an external pull-up resistor.

Wie groß sollte der Pull Up sein ?
OP
Ich habe nochmals die Verkabelung überprüft alles iO. Mein CLK und SS 
Signal sehen auf dem Oszi auch gut aus, was mich jedoch stutzig macht 
ist das MISO Signal. Das müssten doch 5V sein ?
Bzw. der Bitfolge entsprechen die gesendet wird.
Mein Code:
1
#include <SPI.h>
2
int reset = 9;
3
void setup() 
4
  {
5
  pinMode(SS, OUTPUT);
6
  pinMode(MISO, OUTPUT);
7
  pinMode(reset, OUTPUT);
8
  SPI.begin();
9
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
10
  digitalWrite(SS, HIGH); 
11
  digitalWrite(reset, HIGH);
12
  }
13

14
void loop() 
15
{
16
  SPI.begin();
17
  digitalWrite(SS, LOW);   
18
  SPI.transfer(B10101010);
19
  digitalWrite(SS, HIGH);
20
}

Anbei ein Bild vom Oszi:

Gelb: CLK
Grün: SS
Blau: MOSI
Angehängte Dateien:
Gast
Kord F. schrieb:
> was mich jedoch stutzig macht
> ist das MISO Signal.
...
> Blau: MOSI

?


---

Wofür ist das beginTransaction, wenn du doch gar keine Transactions 
brauchst?

Auch hätte ich erwartet, dass CS sofort wieder hoch geht, aber das fehlt 
auf deinem Bild.
OP
Sorry, das sollte natürlich beides mal MOSI heißen.
Das MOSI Problem ist mittlerweile auch behoben, nur tut sich leider am 
Analog Switch IC immer noch nichts.
Anbei das aktuelle Oszi Signal.

Gelb= CLK
Blau= MOSI
Grün= SS

Das beginTransaction habe ich benutzt um die SPI Modi zu variieren, weil 
ich die Vermutung hatte das vielleicht nicht der korrekte SPI Mode 
eingestellt war.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.