www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AVR32] spi_write klappt nur einmal


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen alle zusammen,
ich versuche zur Zeit einen Funk-Chip (RFM12B) über das SPI-Interface 
mit meinem AVR32-Board (EVK1101) zu verbinden.

Ich initialisiere SPI folgendermaßen:
static const gpio_map_t SPI_GPIO_MAP =
{
  {SCK, 0 }, //GPIO15, Function A // SPI Clock.
  {MISO, 0 }, //GPIO25, Function A // MISO.
  {MOSI, 0 }, //GPIO14, Function A // MOSI.
  {NSEL, 0 }, //GPIO16, Function A // CS0
};


// SPI options.
static const spi_options_t spi_options =
{
  .reg = 0, //! The SPI channel to set up.
  .baudrate = 500000,
  .bits = 8, //! Number of bits in each character (8 to 16).
  .spck_delay = 0, //! Delay before first clock pulse after selecting slave.
  .trans_delay = 4, //! Delay between each transfer/character.
  .stay_act = 0, //! Sets this chip to stay active after last transfer to it.
  .spi_mode = 1, //! Which SPI mode to use when transmitting.
  .modfdis = 0, //! Disables the mode fault detection.
}; 

void init_spi()
{
 // Assign I/Os to SPI.
 if(gpio_enable_module(SPI_GPIO_MAP, sizeof(SPI_GPIO_MAP) / sizeof(SPI_GPIO_MAP[0])) != GPIO_SUCCESS)
  show_error();

 // Initialize as master.
 if(spi_initMaster(&AVR32_SPI, &spi_options) != SPI_OK)
  show_error();

 // Set selection mode: variable_ps, pcs_decode, delay.
 if(spi_selectionMode(&AVR32_SPI, 0, 0, 0) != SPI_OK)
  show_error();

 if(spi_selectChip(&AVR32_SPI, 0) != SPI_OK)
  show_error();

 if(spi_setupChipReg(&AVR32_SPI, &spi_options, 20000000) != SPI_OK)
  show_error();

 // Enable SPI.
 spi_enable(&AVR32_SPI);

} 

Und jetzt würde ich gerne per spi_write() befehle an meinen Chip senden.
Allerdings ist nur das erste Senden erfolgreich, alle anschliessenden 
spi_write() liefern SPI_ERROR_TIMEOUT zurück:
while(1)
{
 spi_status_t status = spi_write(&AVR32_SPI, a);
 if(status == SPI_OK)
  LED_On(0b00001000);
 else if(status == SPI_ERROR_TIMEOUT)
  show_error();
 else
  show_error2();
} 

Merkwürdigerweise funktioniert es aber wenn ich vor jedem write erneut 
ein init ausführe.
Hat jemand eine Idee was ich falsch mache?

gruß Oliver

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.