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