AVR32 problem mit SPI

Gast #1537224
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
#1537245
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
#1537373
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren