Guten abend, Ich nutze die MMc-Card Lib von Holger Klabunde Funktioniert auch Hervorragend. So nun hab ich noch ein SPI-Display von XV-Display mit am SPI-Bus. Beide sachen wenn sie am SPI-Bus einzeln angechlossen sind Funktionieren. Display und MMC-Card geht nicht zusammen. Display CS=PB0 MMC CS=PB7 Vielleicht könnte mir einer weiterhelfen was ich Falsch mache mfg
Tjo, da nutzen wohl beide Geräte nen unterschiedlichen SPI Mode. -> Bei der SD Lib alles beim alten lassen und vor jedem Zugriff aufs Display: -SPI Statusregister retten -SPI für Display einstellen -Display routinen -SPI Statusregister wiederherstellen
Wenn ich in der mmc_spi.h den #define SPI_PRESCALER 2 //Choose SPI Speed here. You can use 2,4,8,16,32,64,128. 2 is fastest in #define SPI_PRESCALER 8 //Choose SPI Speed here. You can use 2,4,8,16,32,64,128. 2 is fastest ändere habe ich doch den gleichen SPI Mode oder irre ich mich da
Martin Wende schrieb: > Tjo, da nutzen wohl beide Geräte nen unterschiedlichen SPI Mode. > > -> Bei der SD Lib alles beim alten lassen und vor jedem Zugriff aufs > Display: > -SPI Statusregister retten > -SPI für Display einstellen > -Display routinen > -SPI Statusregister wiederherstellen An der mmc Lib hab ich alles sogelassen Das Display zeigt leider nur bis DisplayText_F(65, 140, PSTR("xv-display.de")); an weiter passiert nichts mehr
1 | int main (void) |
2 | {
|
3 | uint8_t tmp_SPSR; // temporärer Speicher für Statusregister |
4 | |
5 | MMC_IO_Init(); |
6 | |
7 | tmp_SPSR = SPSR; // Statusregister sichern |
8 | cli(); // Interrupts global deaktivieren |
9 | // damit Methode nicht unterbrochen wird
|
10 | SPI_Init(); // Init DisplayInterface |
11 | |
12 | SPSR = tmp_SPSR; // Statusregister wieder herstellen |
13 | sei(); |
14 | |
15 | |
16 | _delay_ms(100); |
17 | |
18 | while (DISPLAY_BUSY) {nop(); } |
19 | |
20 | |
21 | |
22 | |
23 | tmp_SPSR = SPSR; // Statusregister sichern |
24 | cli(); // Interrupts global deaktivieren |
25 | // damit Methode nicht unterbrochen wird
|
26 | |
27 | SetPenColor(0, 0, 0); // Pen Color black |
28 | SetBrushColor(255, 255, 255);// Brush Color white |
29 | SetFont(1); // Text and Number Font 1 |
30 | |
31 | FillScreen_BrushColor(); |
32 | // DebugMode(1); // DebugMode on
|
33 | SetBacklightIntensity(255); // Backlight brightness 100% |
34 | |
35 | DisplayText_F(65, 140, PSTR("xv-display.de")); |
36 | |
37 | SPSR = tmp_SPSR; // Statusregister wieder herstellen |
38 | sei(); |
39 | |
40 | if(GetDriveInformation()!=F_OK) // get drive parameters |
41 | {
|
42 | |
43 | // Gib hier eine Fehlermeldung raus
|
44 | tmp_SPSR = SPSR; // Statusregister sichern |
45 | cli(); // Interrupts global deaktivieren |
46 | // damit Methode nicht unterbrochen wird
|
47 | |
48 | DisplayText_F(65, 140, PSTR("FEHLER")); |
49 | |
50 | SPSR = tmp_SPSR; // Statusregister wieder herstellen |
51 | sei(); |
52 | while(1); |
53 | }
|
54 | |
55 | tmp_SPSR = SPSR; // Statusregister sichern |
56 | cli(); // Interrupts global deaktivieren |
57 | // damit Methode nicht unterbrochen wird
|
58 | |
59 | DisplayText_F(65, 140, PSTR(" ok ")); |
60 | |
61 | SPSR = tmp_SPSR; // Statusregister wieder herstellen |
62 | sei(); |
63 | |
64 | |
65 | while (1) |
66 | {
|
67 | /*
|
68 | SetPenColor(0, 0, 0); // Pen Color black
|
69 | SetBrushColor(255, 255, 255);// Brush Color white
|
70 | SetFont(1); // Text and Number Font 1
|
71 | SetBacklightIntensity(255); // Backlight brightness 100%
|
72 | |
73 | FillScreen_BrushColor();
|
74 | DisplayText_F(70, 120, PSTR("xv-display.de"));
|
75 | DisplayText_F(65, 140, PSTR("Display Module"));
|
76 | SetFont(0);
|
77 | DisplayText_F(15, 160, PSTR("Demonstration of Instruction Set"));
|
78 | SetFont(1);
|
79 | |
80 | _delay_ms(5000);
|
81 | |
82 | |
83 | Demo_System();
|
84 | Demo_TextGlobal();
|
85 | Demo_Graphics();
|
86 | Demo_Numerical();
|
87 | Demo_TouchPanel();
|
88 | Demo_UserMemory();
|
89 | |
90 | |
91 | DrawRect_BrushColorFill(0, 0, 239, 319);
|
92 | DisplayText_F(5, 5, PSTR("Repeating Demonstration ..."));
|
93 | _delay_ms(2000);
|
94 | */
|
95 | |
96 | }
|
97 | |
98 | |
99 | |
100 | return 0; |
101 | }
|
Na das muss in die Lib fürs Display rein, da wo die Hardware angesprochen wird. Außerdem: jedesmal retetste SPSR und stellst es wieder her, ABER stellst es nie ein für das Display. Daher erscheint das erste aufm Display, dann machste was mit der SD karte und da rummst das dann. Noch ne ganz andere Lösung: Display an Soft SPI. Hier mal was wo ne SD Karte und ein MP3 Decoder am SPI hängen (Data des Decoders kann im gleichen Mode wie SD umgestellt werden, nur Befehle haben nen festen Modus):
1 | void VS_write_instruction(uint8_t register_adress, uint16_t dataword){ |
2 | //Data bits are read at the rising edge, [...] Bytes are always send MSb first.
|
3 | |
4 | //SPCR retten
|
5 | uint8_t SPCR_temp = SPCR; |
6 | //SCI SPI Mode aktivieren
|
7 | SPCR = SCI_MODES | SPI_FREQ; |
8 | |
9 | VS_wait_DREQ(); |
10 | |
11 | //XCS LOW
|
12 | VS_SPI_PORT &= ~(1<<VS_SPI_XCS); |
13 | |
14 | //bytes senden
|
15 | VS_write_byte(REGISTER_WRITE); |
16 | VS_write_byte(register_adress); |
17 | VS_write_word(dataword); |
18 | |
19 | //XCS HIGH
|
20 | VS_SPI_PORT |= (1<<VS_SPI_XCS); |
21 | |
22 | //SPCR wiederherstellen
|
23 | SPCR = SPCR_temp; |
24 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.