Atmega32 und ATtiny85 über "SPI" kommunizieren lassen

OP #2198560
Hallo,

zur Zeit probiere ich mich am USI des ATtiny aus. Ich möchte gerne einen 
Atmega32 und einen ATtiny85 über SPI miteinander kommunizieren lassen. 
Es sollen uint16 daten übertragen werden. Die Kommunikation an sich 
scheint schon zu funktionieren, jedoch "springen" die Werte ständig und 
der eigentliche Wert erscheint nur selten. Ich lasse den Atmega mit 
16MHz laufen und den ATtiny mit internen 8MHz. Der Attiny ist natürlich 
slave:
1
typedef union wu{
2
  uint16_t w;
3
  uint8_t b[2];
4
}word;
5

6
volatile word v;  //ADC-Value of the voltage
7
volatile uint8_t i=1;
8
uint8_t buf=0;
9

10
ISR(USI_START_vect)
11
{
12
  USIDR=v.b[(i++)%2];
13
  if(i>255)
14
    i=1;
15
}
16

17
ISR(USI_OVF_vect)
18
{
19
  USIDR=v.b[0];
20
  buf=USIDR;
21
  //while(!(USISR&(1<<USIOIF)));
22

23
  USIDR=v.b[1];
24
  buf=USIDR;
25
  //while(!(USISR&(1<<USIOIF)));
26
  USISR|=(1<<USIOIF);        //clear 4-bit counter  //|(1<<USISIF);    //clear start bit
27
}
28

29
int main()
30
{
31
//unsigned int res;
32
//uint8_t i=0;
33

34
/*init SPI*/
35
DDRB|=(1<<PB1);                //MISO -> output
36
DDRB&=~(1<<PB0)&~(1<<PB2);        //MOSI,SCK -> input
37
PORTB|=(1<<PB0)|(1<<PB2);        //MOSI,SCK -> pull ups on
38
v.w=4000;
39
sei();
40
while(1);
41
}

Atmega:
1
void initSPI()
2
{
3
  RF_PORT=(1<<CS);
4
  RF_DDR&=~((1<<SDO));
5
  RF_DDR|=(1<<SDI)|(1<<SCK)|(1<<CS);
6
  SPCR=(1<<SPE)|(1<<MSTR);
7
}
8

9
uint16_t transAttinySPI()
10
{
11
  word val;
12
  SPDR = '8';
13
  while(!(SPSR & (1<<SPIF)));
14
  val.b[1]=SPDR;
15
  //uart_putc(val.b[1]);
16
  SPDR = '4';
17
  while(!(SPSR & (1<<SPIF)));
18
  val.b[0]=SPDR;
19

20

21
  //uart_putc((char)val.b[1]);
22
  //      uart_putc((char)val.b[0]);
23
  return val.w;        //return answer
24
}

Der Master fragt in einer Endlosschleife jede Sekunde nach Daten und 
gibt diese am LCD aus. Dabei erscheinen immer wieder die Zahlen ~3642 
und ~7738. Benötige ich ein spezielles Protokoll mit Fehlererkennung 
oder so oder lässt sich das ganze einfacher und dennoch zuverlässig 
realisieren?
#2198650
Paul P. schrieb:
> Benötige ich ein spezielles Protokoll mit Fehlererkennung
> oder so

Ja.
Üblicher Weise braucht SPI noch ein /SS (slave-select). Damit sagt der 
Master, daß ein neues Byte beginnt. Ansonsten kann der Slave ja nicht 
wissen, welches Bit der Master gerade sendet.

Daher braucht SPI insgesamt 4 Leitungen und Dein ATtiny85 hat dann nicht 
mehr viel Pins übrig.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 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.