Forum: Mikrocontroller und Digitale Elektronik MMC Lib vom Holger Klabunde


von Anton (Gast)


Angehängte Dateien:

Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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

von Anton (Gast)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nö.
Guck mal ins Datenblatt.

von Anton (Gast)


Lesenswert?

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
}

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
}

von Anton (Gast)


Lesenswert?

ahh ok jetz hats klick gemacht
danke mochmal füt den Denkanstoß

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
Noch kein Account? Hier anmelden.