Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage SPI


von Spinat (Gast)


Lesenswert?

hallo Forum!

Bin gerade dabei mit einen Master(AVR) mit einem SPI-Slave kommunizieren 
zu lassen.

Dazu eine Verständnis-Frage. Mal angenommen der Slave antwortet nicht, 
dann kann der Master das hardwaremäßig gar nicht feststellen, außer dass 
der SLAVE immer nur 0x00 sendet? D.h. das Programm auf dem Master sollte 
auch ohne angesteckten Slave laufen!

Anbei der Code:

void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(0<<SPR1)|(1<<SPR0); 
//1/8 FCPU
  SPSR = 1<<SPI2X;

}

uint8_t SPI_MasterTransmit(uint8_t cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)));
  return SPDR;

}

  PORTC &= ~(1<<PC0); //cs auf low

main:
...
PORTC |= (1<<PC0); //cs auf low
USART_Transmit(SPI_MasterTransmit(0x05));
USART_Transmit(SPI_MasterTransmit(0x00));
USART_Transmit(SPI_MasterTransmit(0x00));
PORTC |= (1<<PC0); //cs auf high
...

von Der Rächer der Transistormorde (Gast)


Lesenswert?

Spinat schrieb:
> Dazu eine Verständnis-Frage. Mal angenommen der Slave antwortet nicht,
> dann kann der Master das hardwaremäßig gar nicht feststellen, außer dass
> der SLAVE immer nur 0x00 sendet?

Das ist nicht festgelegt. Was der Master ohne Slave Empfängt hängt von 
der Hardware ab. Das können Zufallsmuster oder eben ein fester Pegel 
sein.

Wenn du diesen Zustand detektieren willst musst du dies selbst machen 
(z.B. mit einem Pullup Widerstand).

> D.h. das Programm auf dem Master sollte
> auch ohne angesteckten Slave laufen!

Ja, per Design kann sich ein SPI Bus kann nicht aufhängen

von Spinat (Gast)


Lesenswert?

Hab glaub ich den Fehler gefunden.

This bit selects Master SPI mode when written to one, and Slave SPI mode 
when written logic zero. If SSis configured as an input and is driven 
low while MSTR is set, MSTR will be cleared, and SPIF in SPSR will 
become set.
The user will then have to set MSTRto re-enable SPI Master mode.

Das Master-Flag wird also gelöscht, wenn der SS-Pin als Eingang gesetzt 
ist, und auf Low gezogen wird.

Habe jetzt den SS-Pin als Ausgang definiert und jetzt läuft das Programm 
durch.

Danke für die Antworten!

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.