mikrocontroller.net

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


Autor: Uwe K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr32/io.h>
#include "compiler.h"
#include "board.h"
#include "pm.h"
#include "gpio.h"
#include "spi.h"
#include "sd_mmc_spi.h"
#include "intc.h"

//!PBA clock frequency (Hz)
#define PBA_HZ                    16000000

#define SD_MMC_SPI                  (&AVR32_SPI0)
#define SD_MMC_SPI_NPCS             1

int main(void)
{
 // Switch the main clock to the external oscillator 0
 pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);

 // Initialize Interrupt Controller
 INTC_init_interrupts();

 // Initialize SD/MMC driver resources: GPIO, SPI and SD/MMC.
 gpio_enable_module_pin(10, 0);  //NPCS[0]
 gpio_enable_module_pin(11, 0);  //MISO
 gpio_enable_module_pin(12, 0);  //MOSI
 gpio_enable_module_pin(13, 0);  //CLK

 gpio_enable_pin_pull_up(10);
 gpio_enable_pin_pull_up(11);
 gpio_enable_pin_pull_up(12);
 gpio_enable_pin_pull_up(13);

 // SPI options.
 spi_options_t spiOptions =
 {
   .reg          = SD_MMC_SPI_NPCS,
   .baudrate     = 125000,
   .bits         = 8,
   .spck_delay   = 0,
   .trans_delay  = 0,
   .stay_act     = 0,
   .spi_mode     = 0,
   .modfdis      = 1
 };

 // Initialize as master.
 spi_initMaster(SD_MMC_SPI, &spiOptions);

 // Set SPI selection mode: variable_ps, pcs_decode, delay.
 spi_selectionMode(SD_MMC_SPI, 0, 0, 0);

 // Enable SPI module.
 spi_enable(SD_MMC_SPI);

 // Initialize SD/MMC driver with SPI clock (PBA).
 spi_setupChipReg(SD_MMC_SPI, &spiOptions, PBA_HZ);

int i;
 //while (1)
  {
  spi_selectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS); //CS Low/ON
  for (i = 0; i < 100;i++);
  spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS); //CS High/OFF
  for (i = 0; i < 100;i++);
  }
  // Initialize the SD/MMC controller.
while ( sd_mmc_spi_internal_init() != OK );
  return 0;
}
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

Autor: Uwe K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.