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:
1 | //SPI (die Zuordnungen sind korrekt, sind eigene Defines aus einer .h-Datei
|
2 | gpio_enable_module_pin(AVR32_SPI_MISO_PIN, AVR32_SPI_MISO_FUNCTION);
|
3 | gpio_enable_module_pin(AVR32_SPI_MOSI_PIN, AVR32_SPI_MOSI_FUNCTION);
|
4 | gpio_enable_module_pin(AVR32_SPI_SCK_PIN, AVR32_SPI_SCK_FUNCTION);
|
5 | gpio_enable_module_pin(AVR32_SPI_NPCS0_PIN, AVR32_SPI_NPCS0_FUNCTION);
|
6 | gpio_enable_module_pin(AVR32_SPI_NPCS1_PIN, AVR32_SPI_NPCS1_FUNCTION);
|
7 | gpio_enable_module_pin(AVR32_SPI_NPCS2_PIN, AVR32_SPI_NPCS2_FUNCTION);
|
8 | gpio_enable_module_pin(AVR32_SPI_NPCS3_PIN, AVR32_SPI_NPCS3_FUNCTION);
|
9 |
|
10 | static const spi_options_t SPI_OPTIONS =
|
11 | {
|
12 | .reg = SPI_CS_AT8, //=1
|
13 | .baudrate = 35000, //Verhaltnis zu FOSC0(8MHz) ist kleiner 255
|
14 | .bits = 8,
|
15 | .spck_delay = 10,
|
16 | .trans_delay = 10,
|
17 | .stay_act = 0,
|
18 | .spi_mode = 0,
|
19 | .modfdis = 1
|
20 | };
|
21 |
|
22 | spi_enable(&AVR32_SPI);
|
23 |
|
24 | if (spi_initMaster(&AVR32_SPI, &SPI_OPTIONS) != SPI_OK)
|
25 | usart_putchar(&AVR32_USART1, 'E');
|
26 |
|
27 | if (spi_selectionMode(&AVR32_SPI, 0, 0, 10) != SPI_OK)
|
28 | usart_putchar(&AVR32_USART1, 'f');
|
29 |
|
30 | if (spi_setupChipReg(&AVR32_SPI, &SPI_OPTIONS, FOSC0) != SPI_OK)
|
31 | usart_putchar(&AVR32_USART1, 'F');
|
32 |
|
33 | while(1)
|
34 | {
|
35 | if (spi_selectChip(&AVR32_SPI, SPI_CS_AT8) != SPI_OK)
|
36 | usart_putchar(&AVR32_USART1, 'H');
|
37 |
|
38 | if (spi_write(&AVR32_SPI, 2) != SPI_OK)
|
39 | usart_putchar(&AVR32_USART1, 'I');
|
40 |
|
41 | spi_unselectChip(&AVR32_SPI, SPI_CS_AT8);
|
42 | delay_ms(1000);
|
43 | }
|
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.