Forum: Mikrocontroller und Digitale Elektronik SPI mit AT90USB162


von Eugen.S (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich sitze schon eine Weile an diesem Problem und komme einfach nicht zum 
Ergebnis.
Ich möchte den Controlle AT9 USB162 mit 74HC165 um 8 Eingänge erweitern, 
da ich keinen anderen Controlle verwende kann und die Eingänge benötige. 
Ich habe das Datenblatt studiert und hoffe die Initialisierung richtig 
gemacht zu haben.
Mein Problem ist, dass ich kein SCK-Signal messe und daher 
wahrscheinlich doch in der Initialisierung was falsch sein müsste.

Könnte einer bitte einen Blick drauf werfen.

Danke im Voraus.

von holger (Gast)


Lesenswert?

>ich sitze schon eine Weile an diesem Problem und komme einfach nicht zum
>Ergebnis.

Kein Wunder wenn du dir dauernd selber ein Bein stellst.
1
  SPDR = sData;
2
  /* Wait for transmission complete */
3
  while(!(SPSR & (1<<SPIF)))
4
  {
5
    SPDR = sData;

Was soll der Quatsch mit dem zweiten  SPDR = sData;?
Wenn Transfer nicht beendet prügel noch mehr Daten in SPDR?

1
void SPI_SlaveInit(void)
2
{
3
  /* Set MISO output, Set SS output, all others input */
4
  DDRB = (1<<DD_MISO)|(1<<DD_SS);
5
  // Set SS to high
6
  PORTB = (1<<PB0);
7
  /* Enable SPI */
8
  SPCR = (1<<SPI_ENABLE);
9
}

MISO ist ganz sicher kein Ausgang. Master In, Slave Out.
Dann schaltest du im SPCR den Mastermode wieder ab.

von Eugen.S (Gast)


Lesenswert?

holger schrieb:
> Was soll der Quatsch mit dem zweiten  SPDR = sData;?
> Wenn Transfer nicht beendet prügel noch mehr Daten in SPDR?

Damit wollte ich erreichen, dass die Daten durchgängig gesendet werden. 
Das dabei nur Müll raus kommt war mir bewusst. Der Aufruf er Funktion in 
der main sollte das kontinuierliche Sende ja machen, aber anscheinend 
geht es nicht.
Auch wenn ich das zwei SPDR = sData entferne, kann ich an der LED sehen, 
dass das Programm hier while(!(SPSR & (1<<SPIF))) hängen bleibt, weil 
das Flag anscheinend nicht gesetzt wird. Trotzdem habe ich keine Daten 
an Mosi und kein SCK.

holger schrieb:
> MISO ist ganz sicher kein Ausgang. Master In, Slave Out.

Danke für den Tipp ;-).

von holger (Gast)


Lesenswert?

Dann versuchs mal so:
1
void SPI_MasterInit(void)
2
{
3
  /* Set MOSI, SS and SCK output, all others input */
4
  DDRB = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);
5
  // Set SS to high
6
  PORTB |= (1<<PB0);
7
8
  /* Enable SPI, Master, set clock rate fck/16, LSB first */
9
  SPCR = (1<<SPI_ENABLE)|(1<<SPI_MASTER)|(1<<SPI_FREG_16)|(1<<SPI_LSB);
10
}
11
12
uint8_t SPI_MasterTransmit(uint8_t sData)
13
{
14
  /* Start transmission */
15
  SPDR = sData;
16
  /* Wait for transmission complete */
17
  while(!(SPSR & (1<<SPIF)));
18
19
  return SPDR;
20
}
21
22
int main(void)
23
{
24
  uint8_t sData = 0xFF;
25
  uint8_t rData = 0x00;
26
  
27
  uc_init();
28
  SPI_MasterInit();
29
  
30
   while(1)
31
   {
32
     PORTD = (1<<LED_PORT);
33
     _delay_ms(1000);
34
     PORTD &= ~(1<<LED_PORT);
35
     _delay_ms(1000);
36
    
37
     PORTB |= (1<<PB0);
38
     PORTB &= ~(1<<PB0);
39
40
     rData = SPI_MasterTransmit(sData);
41
   }
42
}

SS muss ein Ausgang werden bevor man den SPI Master aktiviert.

von Eugen.S (Gast)


Lesenswert?

werde ich versuchen, danke!

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.