Forum: Mikrocontroller und Digitale Elektronik AVR32 UC3A SPI/MMC Problem - CS bleibt high


von Uwe K. (Gast)


Lesenswert?

Hallo zusammen!

Die Suche hat leider nicht direkt was Passendes ausgespuckt
...wahrscheinlich ist mein Problem einfach zu trivial.

Ich versuche momentan mit einem AVR32 UC3A1 via SPI eine MMC
zum Laufen zu kriegen, bislang leider vergeblich.

Die Situation ist folgende:

Der UC3A wird momentan über ein STK600 betrieben. Der MMC-Slot mit
der Karte ist über ein Flachbandkabel mit dem entsprechenden Port
auf dem Board verbunden. Die Leitungen kann ich wahlweise mit den
internen Pullups des µC oder über eine Lochrasterkarte mit Pullups
beschalten.

Die Spannungsversorgung erfolgt über das STK mit stabilen 3,28V=
(wahlweise auch ein Netzteil mit passender Vcc einsetzbar). Eine Pegel-
wandlung ist wegen der 3,3V Betriebsspannung und max. Ausgangspegel
des UC3A nicht notwendig.

Das SPI des µC als solches funktioniert auch, Befehle über MOSI werden
einwandfrei gesendet, das Clocksignal geht auch sauber über die Leitung.
Nur bleibt die MMC auf MISO durchgängig auf High.
Was ich auch festgestellt habe, ist, das auch das CS Signal durchgängig
auf High-Pegel bleibt, was schonmal Mist ist.

Entweder ist da jetzt ein fundamentaler Fehler in der simplen
Beschaltung, oder etwas stimmt am Programmcode nicht.

Für den Code habe ich als Vorlage das vom Framework gelieferte Beispiel
benutzt. Verwendet werden soll SPI0 und NPCS0 als CS-Leitung.

Zum De-/Selektieren der CS-Leitung wird das im Beispiel über die Methode
selectChip und unselectChip geregelt.  Die Methoden schalten die
Verwendung des CS im Mode Register an bzw. aus.
Nun sollte man meinen, das dies zumindest einen Einfluss auf den Pegel
am  Ausgangspin des µC haben sollte, aber selbst das An-/Ausschalten im
Schleifendurchlauf hat anscheinend gar keinen Effekt.
Das pcs-Register direkt zu setzen hab ich auch schon versucht, leider
ohne Änderung des Problems.


So sieht das Codestück aus:
1
#include <avr32/io.h>
2
#include "compiler.h"
3
#include "board.h"
4
#include "pm.h"
5
#include "gpio.h"
6
#include "spi.h"
7
#include "sd_mmc_spi.h"
8
#include "intc.h"
9
10
//!PBA clock frequency (Hz)
11
#define PBA_HZ                    16000000
12
13
#define SD_MMC_SPI                  (&AVR32_SPI0)
14
#define SD_MMC_SPI_NPCS             1
15
16
int main(void)
17
{
18
 // Switch the main clock to the external oscillator 0
19
 pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
20
21
 // Initialize Interrupt Controller
22
 INTC_init_interrupts();
23
24
 // Initialize SD/MMC driver resources: GPIO, SPI and SD/MMC.
25
 gpio_enable_module_pin(10, 0);  //NPCS[0]
26
 gpio_enable_module_pin(11, 0);  //MISO
27
 gpio_enable_module_pin(12, 0);  //MOSI
28
 gpio_enable_module_pin(13, 0);  //CLK
29
30
 gpio_enable_pin_pull_up(10);
31
 gpio_enable_pin_pull_up(11);
32
 gpio_enable_pin_pull_up(12);
33
 gpio_enable_pin_pull_up(13);
34
35
 // SPI options.
36
 spi_options_t spiOptions =
37
 {
38
   .reg          = SD_MMC_SPI_NPCS,
39
   .baudrate     = 125000,
40
   .bits         = 8,
41
   .spck_delay   = 0,
42
   .trans_delay  = 0,
43
   .stay_act     = 0,
44
   .spi_mode     = 0,
45
   .modfdis      = 1
46
 };
47
48
 // Initialize as master.
49
 spi_initMaster(SD_MMC_SPI, &spiOptions);
50
51
 // Set SPI selection mode: variable_ps, pcs_decode, delay.
52
 spi_selectionMode(SD_MMC_SPI, 0, 0, 0);
53
54
 // Enable SPI module.
55
 spi_enable(SD_MMC_SPI);
56
57
 // Initialize SD/MMC driver with SPI clock (PBA).
58
 spi_setupChipReg(SD_MMC_SPI, &spiOptions, PBA_HZ);
59
60
int i;
61
 //while (1)
62
  {
63
  spi_selectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS); //CS Low/ON
64
  for (i = 0; i < 100;i++);
65
  spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS); //CS High/OFF
66
  for (i = 0; i < 100;i++);
67
  }
68
  // Initialize the SD/MMC controller.
69
while ( sd_mmc_spi_internal_init() != OK );
70
  return 0;
71
}
Die internal_init() Funktion ist die aus dem Framework und arbeitet
im Prinzip lediglich den Init-Prozess der Karte ab. Vor jedem
Senden eines Befehls wird selectChip und nach dem Senden wieder 
unselectChip ausgeführt ...nur das sich halt scheinbar nichts tut.

Vielleicht kann mir ja jemand von Euch weiterhelfen.

schonmal danke,
Uwe

von Uwe K. (Gast)


Lesenswert?

Es liegt tatsächlich am Quellcode und da muss irgendwas am Pin-Mapping
quer liegen. Nehme ich nämlich einfach einen anderen Pin als CS und
lasse den umschalten, funktioniert die Initalisierung der Karte.

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.