Hallo,
ich stehe irgendwie total auf dem Schlauch! Möchte gerne in einer Klasse
eine SPI durch eine Soft-SPI ersetzen.
Mit HW-SPI funktioniert alles tadellos und die Sendefunktion ist
definiert als:
1 | static void spiSend(uint8_t b)
|
2 | {
|
3 | SPDR = b;
|
4 | while (!(SPSR & (1 << SPIF)));
|
5 | }
|
Initialisiert wird die HW-SPI durch:
1 | SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
|
MOSI, SCLK und SS sind als Ausgänge deklariert und MISO als Eingang.
Nun will ich mit den gleichen PINs, also ohne etwas an der HW zu ändern
Soft-SPI machen. Das klappt aber leider nicht. Dabei habe ich nur die
Funktion "spiSend" geändert in:
1 | static void spiSend(uint8_t b)
|
2 | {
|
3 | for(uint8_t i=7;i<=0;i--)
|
4 | {
|
5 | if( b & (1<<i) )
|
6 | {
|
7 | PORTB |= (1<<3); // B3:MOSI
|
8 | }
|
9 | else
|
10 | {
|
11 | PORTB &= ~(1<<3); // B3:MOSI
|
12 | }
|
13 |
|
14 | _delay_us(1);
|
15 |
|
16 | PORTB |= (1<<5); // B5:CLK high
|
17 | _delay_us(50);
|
18 |
|
19 | PORTB &= ~(1<<5); // B5:CLK low
|
20 | _delay_us(50);
|
21 | }
|
22 | }
|
Also entweder sehe ich den Wald vor lauter Bäumen nicht oder ich habe
'nen prinzipiellen Denkfehler!? Die HW würde ich aus ausschließen, da
ich an der ja nix mache.
Besten Dank für sachdienliche Hinweise!! (Und bitte keine Vorschläge das
ich viell. doch die HW-SPI nutzen sollte, weil die ja ein BUS ist usw.)
Danke!