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 | }
|