ATTiny / SPI Pins tauschen

OP #4008545
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
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
}
OP
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.
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.