Forum: Mikrocontroller und Digitale Elektronik ATTiny / SPI Pins tauschen


von Jan Christian H. (jhaddorp)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Hardware- durch Software-SPI ersetzen. Ist bei einem Slave aber nur bei 
niedrigem SPI-Takt realistisch.

von Oliver R. (orb)


Lesenswert?

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.

von Jan Christian H. (jhaddorp)


Lesenswert?

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.

von Felix P. (fixxl)


Lesenswert?

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
}

von Jan Christian H. (jhaddorp)


Lesenswert?

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
}

von Felix P. (fixxl)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jan Christian H. (jhaddorp)


Lesenswert?

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.

von alaf (Gast)


Lesenswert?

Jan Christian Haddorp schrieb:
> Pins nochmal nachzählen. Die Nummerierung ist leider nicht immer
> wirklich intuitiv.

.. sondern etwa der Reihe nach?

von Jan Christian H. (jhaddorp)


Lesenswert?

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
Noch kein Account? Hier anmelden.