Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 SPI Senden


von Timo B. (spida)


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:
1
#define BOARD_SPI1_CS           AT91C_PIO_PA21 | AT91C_PIO_PA25
2
#define BOARD_SPI1_PINS         AT91C_PIO_PA22 | AT91C_PIO_PA23 | AT91C_PIO_PA24
3
#define BOARD_SPI1_BASE         AT91C_BASE_SPI1
4
#define BOARD_SPI1_ID           AT91C_ID_SPI1
5
#define BOARD_SPI1_CONFIG       AT91C_SPI_MSTR | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MODFDIS
6
#define BOARD_SPI1_POT_CONFIG   AT91C_SPI_CSAAT | (AT91C_SPI_BITS & AT91C_SPI_BITS_16) | ((255<<8) & AT91C_SPI_SCBR)
7
#define BOARD_SPI1_POT_CS       AT91C_PIO_PA21
8
#define BOARD_SPI1_DF_CONFIG    AT91C_SPI_CSAAT | (AT91C_SPI_BITS & AT91C_SPI_BITS_8) | ((1<<24) & AT91C_SPI_SCBR
9
#define BOARD_SPI1_DF_CS        AT91C_PIO_PA25

SPI initialisieren:
1
void AT91_spi_init() {
2
    AT91C_BASE_PIOA->PIO_PER = BOARD_SPI1_CS;
3
    AT91C_BASE_PIOA->PIO_OER = BOARD_SPI1_CS;
4
    AT91C_BASE_PIOA->PIO_PPUDR = BOARD_SPI1_CS;
5
    AT91C_BASE_PIOA->PIO_SODR = BOARD_SPI1_CS;
6
7
    AT91C_BASE_PIOA -> PIO_ASR = BOARD_SPI1_PINS;
8
    AT91C_BASE_PIOA -> PIO_PDR = BOARD_SPI1_PINS;
9
10
    BOARD_SPI1_BASE -> SPI_CR = AT91C_SPI_SPIDIS;
11
    AT91C_BASE_PMC -> PMC_PCER = (1 << BOARD_SPI1_ID);
12
    BOARD_SPI1_BASE -> SPI_CR = AT91C_SPI_SPIDIS;
13
14
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SWRST;
15
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SWRST;
16
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SPIEN;
17
18
    BOARD_SPI1_BASE -> SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MODFDIS;
19
    BOARD_SPI1_BASE -> SPI_CSR[0]  = AT91C_SPI_CPOL | AT91C_SPI_BITS_8;
20
    BOARD_SPI1_BASE -> SPI_CR  = AT91C_SPI_SPIEN;
21
}

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.