Hallo,
ich habe ein Problem mit einem Programm. Prinzipiell benötige ich eine
SoftSPI für die Anbindung weiterer Peripherie. Allerdings führt diese zu
einem Reset meiner Hardware! Ich habe das ganze mal auf wesentliche
zusammengefasst und als Anhang hochgeladen!
Anbei die Auszüge der wichtigsten Funktionen:
1 | int main()
|
2 | {
|
3 | // Erlaubt globale Interrupts
|
4 | SOFTSPI_Init();
|
5 |
|
6 | for(char i = 0; i<255; i++)
|
7 | SOFTSPI_WriteRead_Synchron(0x00, SOFTSPI_MODE_1);
|
8 |
|
9 | while(1);
|
10 |
|
11 | }
|
Setze ich einen Breakpoint auf die while-Schleife, und einen auf das
Softspi_Init, hält das Programm immer wieder an der Softspi-Stelle, das
while wird nie erreicht...
Das ist die WriteRead-Methode:
1 | unsigned char SOFTSPI_WriteRead_Synchron(unsigned char dataout, char spi_mode)
|
2 | {
|
3 | SOFTSPI_Clock_Mode(spi_mode);
|
4 | _delay_us(1);
|
5 |
|
6 | uint8_t datain=0;
|
7 | //das Byte wird Bitweise nacheinander gesendet, MSB zuerst
|
8 | for (uint8_t a=8; a>0; a--)
|
9 | {
|
10 | datain<<=1; //Schieben um das Richtige Bit zusetzen
|
11 |
|
12 | // Daten schreiben Versuch 1
|
13 | if( ( spi_mode & 0x01 ) == 0x00 ) // CPHA = 0 --> Daten rauschreiben vor 1ten Flanke!
|
14 | {
|
15 | if (dataout & 0x80)
|
16 | SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_BIT; //Set Output High
|
17 | else
|
18 | SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_BIT; //Set Output Low
|
19 | }
|
20 |
|
21 | _delay_us(1);
|
22 |
|
23 | // Erste Flanke!
|
24 | if( ( spi_mode & 0x02 ) != 0x00 ) // CPOL = 1
|
25 | SOFTSPI_SCLK_PORT &= ~SOFTSPI_SCLK_BIT; // CPHA = 1 --> Erste Flanke = Fallende Flanke
|
26 | else
|
27 | SOFTSPI_SCLK_PORT |= SOFTSPI_SCLK_BIT; // CPHA = 0 --> Erste Flanke = Steigende Flanke
|
28 |
|
29 | // Daten schreiben Versuch 2
|
30 | if( ( spi_mode & 0x01 ) != 0x00 ) // CPHA = 1
|
31 | {
|
32 | // Daten rauschreiben nach 1ten Flanke!
|
33 | if (dataout & 0x80)
|
34 | SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_BIT; //Set Output High
|
35 | else
|
36 | SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_BIT; //Set Output Low
|
37 | }
|
38 |
|
39 | _delay_us(1);
|
40 |
|
41 | // Daten lesen Versuch 1
|
42 | if( ( spi_mode & 0x01 ) == 0x00 ) // CPHA = 0
|
43 | {
|
44 | // Daten lesen nach erster Flanke!
|
45 | if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_BIT) //Lesen des Pegels
|
46 | datain |= 1;
|
47 | }
|
48 |
|
49 | // Zweite Flanke!
|
50 | if( ( spi_mode & 0x02 ) != 0x00 ) // CPOL = 1
|
51 | SOFTSPI_SCLK_PORT |= SOFTSPI_SCLK_BIT; // CPHA = 1 --> Zweite Flanke = Steigende Flanke
|
52 | else
|
53 | SOFTSPI_SCLK_PORT &= ~SOFTSPI_SCLK_BIT; // CPHA = 0 --> Zweite Flanke = Fallende Flanke
|
54 |
|
55 |
|
56 | _delay_us(1);
|
57 |
|
58 | // Daten lesen Versuch 2
|
59 | if( ( spi_mode & 0x01 ) != 0x00 ) // CPHA = 1
|
60 | {
|
61 | // Daten lesen nach erster Flanke!
|
62 | if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_BIT) //Lesen des Pegels
|
63 | datain |= 1;
|
64 | }
|
65 |
|
66 | dataout<<=1; //Schiebe um nächstes Bit zusenden
|
67 | }
|
68 |
|
69 | return datain;
|
70 | }
|
Sitze da nun schon 2 Tage dran und weiß nichtmehr weiter... Kann mir da
wer helfen?