Forum: Mikrocontroller und Digitale Elektronik AVR32 SPI Problem (gelöst)


von Thomas D. (t0mmy)


Lesenswert?

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.

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.