ATTiny / SPI Pins tauschen

#4008545
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
#4009568
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
}
#4011165
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
}
#4011438
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.
#4011475
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.

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