SPI-Einstellungen im Betrieb ändern

Gast #1444732
Hallo,
ich habe folgendes Problem. Ich wollte 2 SPI-Slaves an den atmega32 
anschließen: enc28j60(Netzwerk) und mlx90316(Winkelgeber).
enc28j60 läuft mit f/2, CPHA=0 und mlx90316 nur mit f/16,CPHA=1.
Wäre es möglich dass ich zum Winkelauslesen eine Interrruptroutine 
benutze, bei der zuerst die SPI-Parameter richtg einstelle, und danach 
wieder auf den alten Wert (Frequenz/CPHA) setze?
Gast
>Wäre es möglich dass ich zum Winkelauslesen eine Interrruptroutine
>benutze, bei der zuerst die SPI-Parameter richtg einstelle, und danach
>wieder auf den alten Wert (Frequenz/CPHA) setze?

Das wäre äußerst kontraproduktiv wenn die
Interruptroutine die SPI Routinen vom ENC unterbricht.
Dann kommt nur noch Müll dabei raus.
Gast
Und nacheinnander? Es wird nicht oft unterbrochen, alle 3-4 Minuten für 
ca. 40 sec. Die Ausgabe von dem Webserver in der Unterbrechungs-Phase 
nicht kritisch.
Gast
Hallo sasa,

ich stehe gerade vor einen rätzel ich, ich versuche die ganze Zeit den 
mlx90316 über SPI auszuwerten aber bekomme leider nur Mull raus, 
entweder Nullen oder Einsen, als µc benutze ich einen atmega168, und 
einen npn-transistor(BC547), mein relevante stückCode Sieht So aus:

//*******************************************************

    DDRB  &=  ~(1 << MISO);
    DDRB  |=  ( (1 << MOSI) | (1 << SCK)| (1 << CS) );
    PORTB &=  ~((1 << MOSI) | (1 << MISO) | (1 << SCK));  //
  PORTB |= (1<<CS); //CS auf High
SPCR |= (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(1<<CPHA)|(1 << SPR1 )|( 0<< SPR0);
SPSR &= ~(1 << SPI2X);


PORTB &=~(1<<CS);
_delay_us(10);

  SPDR = 0xaa;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x0  = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x1  = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x2 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x3 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x4 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x5 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x6 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x7 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x8 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x9 = SPDR;
  _delay_us(10);

PORTB|=(1<<CS);
_delay_ms(1);



habe ich was falsches dabei gemacht, ohne es zu merken?
ich bin für jede Art hilfe dankbar.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.