Verständnisfrage SPI

Gast #3600101
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
...
Gast #3600110
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
Gast #3600167
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.