Forum: Mikrocontroller und Digitale Elektronik SPI Atmega32


von Leopold N. (leo_n)


Lesenswert?

Hallo,

ich versuche grad die SPI vom Atmega32 zum Laufen zu bringen...funzt net
Hier der Code:

void spi_init(void)
{
  sbi(DDRB, 4);
  sbi(DDRB, 5);
  cbi(DDRB, 6);
  sbi(DDRB, 7);
  sbi(SPCR, 0);
  sbi(SPCR, 4);
  sbi(SPCR, 6);
}

void spi_send(uint8_t data)
{
  SPDR = data;
  while(bit_is_clear(SPSR, 7))
  {

  }
}

int main(void)
{
  spi_init();
  while(1)
  {
    spi_send(0);
    _delay_ms(100);
  }
}


MOSI ist nun dauerhaft HIGH (mit Oszi gemessen)
SS ist dauerhaft LOW
SCk ist dauerhaft LOW

Wo ist der Fehler?

von Horst (Gast)


Lesenswert?

Leopold N. schrieb:
> SS ist dauerhaft LOW

Als Master mußt Du Dich um SS selber kümmern und sobald der SS-Pin als 
Eingang definiert ist, muß er auf High gehalten werden. Sobald er auf 
Low geht, schaltet der AVR auf Slave um.

von Leopold N. (leo_n)


Lesenswert?

Horst schrieb:
> und sobald der SS-Pin als
> Eingang definiert ist

ja aber ich habe ihn doch als Output definiert
siehe: spi_init(void) --> sbi(DDRB, 4);

von Jim M. (turboj)


Lesenswert?

Zuviele magische Zahlen in dem Source Code, und vermutlich sind eine 
oder mehrere falsch.

Für viele der Bits gäbe es sprechende Namen.
Liegt SPCR überhaupt in dem von cbi/sbi ansprechbaren Speicherbereich?

von Leopold N. (leo_n)


Lesenswert?

Hi,

hab die Lösung:

SS-Pin muss vor Beginn einer Übertragung auf LOW gezogen werden und nach 
der Übertragung auf HIGH,
dann startet auch die CLOCK mit den Datenbits.

Grüße
Leopold

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.