PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI bei 2 ATMega8



Hero_123
22.01.2019, 16:47
Hallo

Ich habe 2 ATMega8 (1*myAVR Board MK2 USB, 1*myAVRBoard Light), gemeinsame Spannungsversorgung und lasse sie per SPI kommunizieren; in jeder SPI-Leitung ist ein 1kOhm Serienwiderstand.
Der Datenaustausch fkt auch (es werden 8 Bytes ausgetauscht), den korrekten Empfang der Daten lasse ich mir am PC per USART und hTerm anzeigen.
Der Master sendet/empfängt die Daten gepollt (im main); der Slave per Interrupt.
Bei der Sende/Empfangsfkt "void SPI_write( uint8_t *sen_buf, uint8_t *empf_buf, uint8_t buf_size )" des Masters muss ich aber ein _delay_us(50) einfügen, sonst stehen im Empfangspuffer des Master die Werte des Sendepuffers und nicht die Sendewerte des Slave (nach Einfügen des delays speichert der Master korrekt die Sendewerte des Slave)- ein delay ist ja die schlechteste Möglichkeit ...


Außerdem muß ich den Slave auch flashen, wenn ich den Master geflasht habe, obwohl beim Slave nichts geändert worden ist - woran kann das liegen?

Anbei das Master- und Slave File

mfg
Hero_123

Holomino
23.01.2019, 12:06
Musst Du den Slave wirklich flashen oder nur resetten? (Kann man beim 6 pol. Original-ISP-Stecker mit nem Jumper, da liegen Reset und GND nebeneinander).
Wenns nur der Reset ist, tippe ich mal auf eine falsche Neuinitialisierung (z.B. könnte das i_spi im SPI-ISR nach Neustart des Masters ohne Timeout beim Slave nicht mehr synchron laufen).


BTW: Du könntest auch mal bei den Variablendeklarationen direkt den Initialwert dranschreiben:
static volatile uint8_t i_spi; /* Zaehler der SPI- Bytes */
==>
static volatile uint8_t i_spi = 0; /* Zaehler der SPI- Bytes */

Das macht zwar beim AVR im Kaltstart keinen Unterschied, liest sich aber besser (und spätestens im init_SLAVE_INT wäre eine Initialisierung der intern benötigten Zustände/Zähler von der Logik her schon fast zwingend).

Hero_123
23.01.2019, 15:17
Hallo Holomino

Vielen Dank für Deine Antwort!

Ich muss den Slave wirklich flashen; ein Betätigen des RESET - Tasters am "myAVRBoard Light" (geht direkt auf PC6 des ATMega8 ) bringt nichts (SPI läuft nicht, erkennbar daran, dass keine Daten ausgetauscht werden), obwohl die LED PORTD PD4 toggelt (ist quasi ein "Lebend" Signal).

Initialwert direkt an Variablendeklarationen schfreiben - gute Idee, werde ich machen ;)

mfg
Hero_123

Hero_123
25.01.2019, 08:43
Problem erledigt, Thread kann geschlossen werden