Forum: Mikrocontroller und Digitale Elektronik AVR32 problem mit SPI


von Stefan (Gast)


Lesenswert?

Hallo Leute,

habe ein kleines Problem mit dem SPI beim AVR32. Nach der 
Initialisierung des SPI0 ist erst mal wie gewünscht MOSI und SCK auf 
High, wenn ich jedoch daten in das TDR Register schreibe passiert 
einfach nichts. Auch im Statusregister SR ist immer nur zu entnehmen, 
dass die Daten nicht gesendet worden sind.

Hier mal mein c-code.
1
...
2
void SPI_Configuration()
3
4
{
5
6
  AVR32_PM.pbamask |= (1<<5);
7
8
9
10
  AVR32_GPIO.port[0].gper &= ~((1 << 11)|(1 << 12)|(1 << 13)); //Set IO Pins disable for the GPIO Controller
11
12
  //Set The Periperial Multiplexer for SPI0
13
14
  AVR32_GPIO.port[0].pmr0 &= ~((1 << 11)|(1 << 12)|(1 << 13));
15
16
  AVR32_GPIO.port[0].pmr1 &= ~((1 << 11)|(1 << 12)|(1 << 13));
17
18
19
20
  AVR32_SPI0.mr |= ((1<<0) ); //Master mode),
21
22
  AVR32_SPI0.csr0 |= ((1<<0)|(1<<3) | (1<<8));
23
24
  AVR32_SPI0.cr |= (1<<0); //Enable SPI0
25
26
27
28
  int i=0;
29
30
  i= AVR32_SPI0.csr0;
31
32
}
33
34
35
36
int main(void)
37
38
{
39
40
  fcpu_fpba_configure();
41
42
43
44
  SPI_Configuration();
45
46
47
48
  unsigned int i=0;
49
50
51
52
  while(1)
53
54
  {
55
56
    while( !(AVR32_SPI0.sr & (1<<1)))
57
58
        {
59
60
61
62
        }
63
64
65
66
    AVR32_SPI0.tdr = 0x000000ff;
67
68
69
70
71
72
  }
73
74
75
76
  return 0;
77
78
}

Vermute mal das es an den Teilern für MCK liegt, aber andere Werte für 
größere Teiler bringen leider auch keine änderung.
Wäre nett wenn mir jemand sagen kann was ich bei den Registern falsch 
gemacht habe.
Gruß
Stefan

von Phil S. (zippi)


Lesenswert?

Hi,

interresand wäre noch zu wissen, welchen avr32 du hast.

Auf anhieb seh ich jetzt keinen fehler, welchen CS nutzt du genau?

Hier ist mal mein Code:
1
  AVR32_SPI0.mr = 1 << AVR32_SPI_MR_MSTR_OFFSET |                  // SPI0 mode 0 = slave  1 = master
2
          1 << AVR32_SPI_MR_MODFDIS_OFFSET ;                // SPI0 mode fault detection  0 = enable  1 = disable
3
4
5
  int  csr =   0 << AVR32_SPI_CSR0_CPOL_OFFSET |                   // inactive clock is 0;
6
        1 << AVR32_SPI_CSR0_NCPHA_OFFSET |                   // Active Edge == rising
7
        0 << AVR32_SPI_CSR0_CSAAT_OFFSET |                   // deselect device
8
        8 << AVR32_SPI_CSR0_BITS_OFFSET |                   // (BITS+8)Bits per transfer
9
        2 << AVR32_SPI_CSR0_SCBR_OFFSET |                    // clk == MCLK / scbr;
10
        0 << AVR32_SPI_CSR0_DLYBS_OFFSET |                   // 0 = 1 clk delay when chip selected
11
        0 << AVR32_SPI_CSR0_DLYBCT_OFFSET;                   // 0 = No delay between 2 transfers.AVR32_SPI.csr0 = csr;
12
13
  AVR32_SPI0.csr0 = csr;
14
  AVR32_SPI0.csr1 = csr;
15
  AVR32_SPI0.csr2 = csr;
16
  AVR32_SPI0.csr3 = csr;
17
18
  AVR32_SPI0.cr = AVR32_SPI_CR_SPIEN_MASK;                    // Enable SPI0
19
20
  while((AVR32_SPI0.sr & AVR32_SPI_SR_SPIENS_MASK)!= AVR32_SPI_SR_SPIENS_MASK);  // Wait for enable status

Der geht bei mir aufjedenfall.

gruß
Zippi

von Stefan (Gast)


Lesenswert?

Mal danke für die schnelle Antwort, werd mal deinen Code gleich 
ausprobieren.

verwende einen AT32UC3A1512, und verwende den CS0

von Phil S. (zippi)


Lesenswert?

Stefan schrieb:
> Mal danke für die schnelle Antwort, werd mal deinen Code gleich
> ausprobieren.
>
> verwende einen AT32UC3A1512, und verwende den CS0

Ah ok schon. Der code ist auch für einen AT32UC3A1512. Für das CS habe 
ich aber ein GPIO genommen, trozdem sollte es auch so gehen.

Hier mal meine Sende routine:
1
AVR32_SPI0.tdr =data[0];
2
3
while((AVR32_SPI0.sr & AVR32_SPI_SR_TDRE_MASK)==0);    // The last data written in the Transmit Data Register has been transferred to the serialize

data[] ist ein char array.

gruß

von Stefan (Gast)


Lesenswert?

Also code funktioniert, meiner eigentlich auch. Hatte nur vergessen, das 
die Übertragung einfach nicht funktioniert wenn man im Step modus durch 
den code geht.

Gruß
Stefan

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.