mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR32 SPI Problem (gelöst)


Autor: Thomas Decker (t0mmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab seit kurzem einen AT32UC3B1256 auf einer eigenen Platine in betrieb. 
Serielle Schnittstelle zum PC funktioniert, ich bekomme aber das 
SPI(-Interface) nicht zum laufen.
Benutze das AVR32 Studio und die mitgelieferten "Treiber" von Atmel.

Der verantwortliche Code sieht so aus:
//SPI (die Zuordnungen sind korrekt, sind eigene Defines aus einer .h-Datei
gpio_enable_module_pin(AVR32_SPI_MISO_PIN, AVR32_SPI_MISO_FUNCTION);
gpio_enable_module_pin(AVR32_SPI_MOSI_PIN, AVR32_SPI_MOSI_FUNCTION);
gpio_enable_module_pin(AVR32_SPI_SCK_PIN, AVR32_SPI_SCK_FUNCTION);
gpio_enable_module_pin(AVR32_SPI_NPCS0_PIN, AVR32_SPI_NPCS0_FUNCTION);
gpio_enable_module_pin(AVR32_SPI_NPCS1_PIN, AVR32_SPI_NPCS1_FUNCTION);
gpio_enable_module_pin(AVR32_SPI_NPCS2_PIN, AVR32_SPI_NPCS2_FUNCTION);
gpio_enable_module_pin(AVR32_SPI_NPCS3_PIN, AVR32_SPI_NPCS3_FUNCTION);
  
static const spi_options_t SPI_OPTIONS =
{
  .reg     = SPI_CS_AT8,  //=1
  .baudrate   = 35000,  //Verhaltnis zu FOSC0(8MHz) ist kleiner 255
  .bits   = 8,
  .spck_delay     = 10,
  .trans_delay  = 10,
  .stay_act = 0,
  .spi_mode = 0,
  .modfdis = 1
};
  
spi_enable(&AVR32_SPI);
  
if (spi_initMaster(&AVR32_SPI, &SPI_OPTIONS) != SPI_OK)
  usart_putchar(&AVR32_USART1, 'E');

if (spi_selectionMode(&AVR32_SPI, 0, 0, 10) != SPI_OK)
  usart_putchar(&AVR32_USART1, 'f');

if (spi_setupChipReg(&AVR32_SPI, &SPI_OPTIONS, FOSC0) != SPI_OK)
  usart_putchar(&AVR32_USART1, 'F');

while(1)
{
  if (spi_selectChip(&AVR32_SPI, SPI_CS_AT8) != SPI_OK)
    usart_putchar(&AVR32_USART1, 'H');

  if (spi_write(&AVR32_SPI, 2) != SPI_OK)
    usart_putchar(&AVR32_USART1, 'I');

  spi_unselectChip(&AVR32_SPI, SPI_CS_AT8);
  delay_ms(1000);
}

So und hier meldet mit die USART 1x pro Sekunde ein 'I', also ein 
TimeoutError beim schreiben. Die Initialisierunng funktioniert jedoch 
(inzwischen, hatte den Takt am Anfang zu gering).
CLK ist ständig low, SPI_CS_AT8 und MOSI high. Da ändert sich nix. Das 
sieht ja soweit ganz korrekt aus, nur das eben nicht gesendet wird.

So und hier die Problemlösung:
spi_enable(&AVR32_SPI); erst nach der Initialisierung aufrufen, also bei 
mir vor der while(1)-Schleife.

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.