Hallo,
um kompatibel zum bleiben zur gegenüber liegenden HW SPI habe ich CPOL=1
und CPHA = 1 gewählt, d.h. die Daten werden auf der steigenden Flanke
gesampled und nach der fallenden Flanke aktualsiert.
Ein SPI Sniffer erkennt auch die Daten einwandfrei und stellt sie
richtig dar. Was mir noch "wahlfrei" zu seien scheint ist, dass ich mir
aktuell aussuchen kann, ob die neuen Masterdaten VOR oder NACH der
ersten fallenden Flanke aktualisiert werden und ob ich MOSI nach der
steigenden Flanke auf 0 zurück nehme oder nicht. Aktuell bleibt SDO da
wo es steht nach einem Bit und wird erst vor der neuen Flanke aufs
nächste Datum gesetzt. Setzt man es zurück sind oben nur noch Nadeln zu
sehen, statt Flächen.
Die nächste Idee wäre auf beiden Flanken zu samplen aber eines nach dem
anderen.
Gibt es da Konventionen?
1 | uint8_t spi_transmit(uint8_t data)
|
2 | {
|
3 |
|
4 | uint8_t inbyte;
|
5 | uint8_t i;
|
6 |
|
7 | STI_GPIP = STI_GPIP | SCLK; // Clock = HIGH
|
8 | inbyte = 0;
|
9 |
|
10 | CLI;
|
11 | for (i=0;i<8;i++)
|
12 | {
|
13 | // ----- Clock LOW (Slave sampled) ------
|
14 | #ifdef DELAY_ON
|
15 | delay8(PAUSE);
|
16 | #endif
|
17 | STI_GPIP = STI_GPIP & ~SCLK;
|
18 |
|
19 | // // ----- Bit out SDO ------
|
20 | if (data & 0x80)
|
21 | STI_GPIP = STI_GPIP | SDO; // "1" out
|
22 | else
|
23 | STI_GPIP = STI_GPIP & ~SDO; // "0" out
|
24 |
|
25 | // // ----- Clock HIGH ------
|
26 | #ifdef DELAY_ON
|
27 | delay8(PAUSE);
|
28 | #endif
|
29 | STI_GPIP = STI_GPIP | SCLK;
|
30 |
|
31 | // // ----- Sample Bit In SDI ------
|
32 | if (STI_GPIP & SDI) // Eine 1 Input?
|
33 | inbyte |= 0x01;
|
34 |
|
35 | // 0 muss nicht berücksichtigt werden, Inbyte = 0
|
36 |
|
37 | // Nächste Position, MSB zuletzt
|
38 | data <<= 1;
|
39 | inbyte <<= 1;
|
40 | }
|
41 | STI_GPIP = STI_GPIP & ~SDO; // "0" out
|
42 | STI_GPIP = STI_GPIP | SCLK; // SCLK = 1
|
43 |
|
44 | EI;
|
45 | return (inbyte);
|
46 | }
|