Hallo, habe eine kleine Platine zum Anschluss eines SPI Slave Devices erstellt. Leider wurden am SPI Anschluss die Pins für MISO und MOSI vertauscht. Mittels Kabel schnell korrigiert, aber schlecht, wenn es direkt auf der Platine aufgelötet werden soll. Frage ist daher, ob sich die Pins softwareseitig tauschen lassen? Wenn ich mir den Code ansehe, kann ich leider nicht erkennen, ob/wie dies klappen könnte. Z.B.: https://code.google.com/p/arduino/source/browse/trunk/libraries/SPI/SPI.cpp Gibt es hierzu Erfahrung? Ziel wäre das Vertauschen von MISO und MOSI in der SPI Lib. Viele Grüße Jan Christian
Hardware- durch Software-SPI ersetzen. Ist bei einem Slave aber nur bei niedrigem SPI-Takt realistisch.
Nein, das geht nicht, in dem Code wird die Hardware-SPI des Chips benutzt. Du müsstest eine Software(Bitbanging)SPI-Routine schreiben, so ist die Belegung der Pins vorgegeben.
Hallo, vielen Dank für die Infos und Tips. Ist eine einfachee SPI Software Lib für ATTiny bekannt? Bisher gefundene Libs sind leider recht umfangreich oder kompilieren nicht mit dem ATTiny.
Eine Soft-SPI ist nicht allzu schwer zu schreiben. Man muss lediglich die Ports entsprechend initialisieren und definieren (Also die PORT-, PIN- und DDDR-Register zuweisen, MOSI, SCK und NSEL als Ausgänge, MISO als Eingang setzen), der Transfer ist dann schnell erledigt. Hier mal ein Beispiel für den Transfer für CPOL=0 und CPHA=0 mit MSB-first-Übertragung:
1 | uint8_t soft_spi(uint8_t spibyte) { |
2 | SCK_PORT &= ~(1 << SCK); |
3 | NSEL_PORT &= ~(1 << NSEL); |
4 | for (uint8_t i = 8; i; i--) { |
5 | if (spibyte & 0x80) { |
6 | MOSI_PORT |= (1 << MOSI); |
7 | }
|
8 | else { |
9 | MOSI_PORT &= ~(1 << MOSI); |
10 | }
|
11 | spibyte <<= 1; |
12 | SCK_PORT ^= (1 << SCK); |
13 | if (MISO_PIN & (1 << MISO)) spibyte |= 0x01; |
14 | SCK_PORT ^= (1 << SCK); |
15 | }
|
16 | NSEL_PORT |= (1 << NSEL); |
17 | return spibyte; |
18 | }
|
Hallo und vielen Dank! Leider bin ich mit der direkten Port-Adressierung noch nicht so vertraut. Habe den Code zunächst mal entsprechend meiner Pins angepasst. Es kompiliert, funktioniert aber nicht erkennbar. Das Debugging des ATTiny ist ohne weitere Ausstattung recht beschrängt. Sieht der Code generell ok aus oder habe ich irgendwo grob etwas falsch gemacht?
1 | SPIClass SPI; |
2 | |
3 | // these depend on the core used (check pins_arduino.h)
|
4 | // this is for jeelabs' one (based on google-code core)
|
5 | #define DI 5 // PA6
|
6 | #define DO 4 // PA5
|
7 | #define USCK 6 // PA4
|
8 | #define SS 3 // PA7
|
9 | |
10 | void SPIClass::begin() { |
11 | digitalWrite(SS, HIGH); |
12 | pinMode(USCK, OUTPUT); |
13 | pinMode(DO, OUTPUT); |
14 | pinMode(SS, OUTPUT); |
15 | pinMode(DI, INPUT); |
16 | }
|
17 | |
18 | byte SPIClass::transfer(byte b) { |
19 | PORTA &= ~(1 << USCK); |
20 | PORTA &= ~(1 << SS); |
21 | for (uint8_t i = 8; i; i--) { |
22 | if (b & 0x80) { |
23 | PORTA |= (1 << DO); |
24 | } else { |
25 | PORTA &= ~(1 << DO); |
26 | }
|
27 | b <<= 1; |
28 | PORTA ^= (1 << USCK); |
29 | if (PINA & (1 << DI)) b |= 0x01; |
30 | PORTA ^= (1 << USCK); |
31 | }
|
32 | PORTA |= (1 << SS); |
33 | return b; |
34 | }
|
Der Code sieht für mich - zumindest was die Transfer-Funktion angeht - gut aus. Entscheidend ist, dass du Ein- und Ausgänge wirklich richtig setzt bzw. dir bewusst bist, von welcher Seite aus du die Pins DI und DO betrachtest: Was am Master (hier der ATTiny) ein Ausgang ist, muss am Slave ein Eingang sein und umgekehrt, so dass die Bezeichnungen DO und DI für eine Seite verdreht erscheinen.
Jan Christian Haddorp schrieb: > Hallo, habe eine kleine Platine zum Anschluss eines SPI Slave Devices > erstellt. Leider wurden am SPI Anschluss die Pins für MISO und MOSI > vertauscht. Mittels Kabel schnell korrigiert, aber schlecht, wenn es > direkt auf der Platine aufgelötet werden soll. Wer, das Kabel? Es gibt nichts, was man nicht mit einem scharfen Messer und etwas Lackdraht direkt auf der Platine umrouten könnte. Dein aufzulötendes Kabel wird ja wohl nicht direkt auf die Prozessorpins gelötet, sondern da sind Leiterbahnen dazwischen. Mit dem Messer unterbrechen und mit dem Lackdraht neu und korrekt verkabeln.
Vielen Dank! Das mit dem Kabel anlöten bzw. Leiterbahnen abkratzen wäre sicherlich möglich. Nicht mein Favorit, aber ein guter Tipp. Software SPI funktioniert nun. Danke für das Code Beispiel! Musste die Pins nochmal nachzählen. Die Nummerierung ist leider nicht immer wirklich intuitiv.
Jan Christian Haddorp schrieb: > Pins nochmal nachzählen. Die Nummerierung ist leider nicht immer > wirklich intuitiv. .. sondern etwa der Reihe nach?
Genau ;-) Nur gibt es bspw. die Port A/B Nummerierung und dann eine durchgehende (hier mit D). Und diese Nummerierung läuft halt nicht synchron... Aber passt schon... http://cdn.instructables.com/FPB/X0HO/HJKBY3MS/FPBX0HOHJKBY3MS.MEDIUM.jpg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.