SPI mit AT90USB162

Gast #4164017
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.
Angehängte Dateien:
Gast #4164134
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.
Gast #4164750
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 ;-).
Gast #4164791
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.

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