mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 SPI Senden


Autor: Timo Boettcher (spida)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche mit einem AT91SAM7X512 (ARM7) SPI zu senden. Allerdings 
kommt aus den SPI-PINs des uC nichts heraus, nichtmal ein Takt (mitm 
Oszi nachgesehen). Als GPIO kann ich die PINs ansteuern, also ist (sehr 
wahrscheinlich) weder der uC kaputt, noch irgendeine Leitung 
kurzgeschlossen/unterbrochen. Was hab ich da übersehen? Verwendeter Code 
siehe unten.

Ein paar defines:
#define BOARD_SPI1_CS           AT91C_PIO_PA21 | AT91C_PIO_PA25
#define BOARD_SPI1_PINS         AT91C_PIO_PA22 | AT91C_PIO_PA23 | AT91C_PIO_PA24
#define BOARD_SPI1_BASE         AT91C_BASE_SPI1
#define BOARD_SPI1_ID           AT91C_ID_SPI1
#define BOARD_SPI1_CONFIG       AT91C_SPI_MSTR | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MODFDIS
#define BOARD_SPI1_POT_CONFIG   AT91C_SPI_CSAAT | (AT91C_SPI_BITS & AT91C_SPI_BITS_16) | ((255<<8) & AT91C_SPI_SCBR)
#define BOARD_SPI1_POT_CS       AT91C_PIO_PA21
#define BOARD_SPI1_DF_CONFIG    AT91C_SPI_CSAAT | (AT91C_SPI_BITS & AT91C_SPI_BITS_8) | ((1<<24) & AT91C_SPI_SCBR
#define BOARD_SPI1_DF_CS        AT91C_PIO_PA25

SPI initialisieren:
void AT91_spi_init() {
    AT91C_BASE_PIOA->PIO_PER = BOARD_SPI1_CS;
    AT91C_BASE_PIOA->PIO_OER = BOARD_SPI1_CS;
    AT91C_BASE_PIOA->PIO_PPUDR = BOARD_SPI1_CS;
    AT91C_BASE_PIOA->PIO_SODR = BOARD_SPI1_CS;

    AT91C_BASE_PIOA -> PIO_ASR = BOARD_SPI1_PINS;
    AT91C_BASE_PIOA -> PIO_PDR = BOARD_SPI1_PINS;

    BOARD_SPI1_BASE -> SPI_CR = AT91C_SPI_SPIDIS;
    AT91C_BASE_PMC -> PMC_PCER = (1 << BOARD_SPI1_ID);
    BOARD_SPI1_BASE -> SPI_CR = AT91C_SPI_SPIDIS;

    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SWRST;
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SWRST;
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SPIEN;

    BOARD_SPI1_BASE -> SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MODFDIS;
    BOARD_SPI1_BASE -> SPI_CSR[0]  = AT91C_SPI_CPOL | AT91C_SPI_BITS_8;
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SPIEN;
}

Daten senden:
void AT91_spi_write(unsigned long outgoing) {
    AT91C_BASE_PIOA->PIO_CODR = BOARD_SPI1_POT_CS;
    BOARD_SPI1_BASE -> SPI_TDR = outgoing;
    AT91C_BASE_PIOA->PIO_SODR = BOARD_SPI1_POT_CS;
}

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.