SPI-Einstellungen im Betrieb ändern

Gast #1444732
Lesenswert?

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 #1444747
Lesenswert?

>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 #1942129
Lesenswert?

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

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