Sari la conținut
ELFORUM - Forumul electronistilor

comunicatie SPI


adynis

Postări Recomandate

Folsoest CodeVisionAVRM-ar interesa sa comunic intre 2 microcontrolere atmega8 prin SPI, unul fiind master, celalalt slave; De fapt am reusit sa fac masterul sa transmita prin spi unul sau mai multi bytes catre slave, si slave-ul i-a recunoscut, dar am inteles ca atunci cand masterul initiaza o comunicatie, slave-ul poate "raspunde" si el cu un byte pe care sa-l primeasca masterul. Asa ceva n-am reusit... Defapt, daca am inteles bine, nu stiu cum sa fac.In CVAvr este functia spi(char data) sau asa ceva, pe care cand o apelez in master trimite byte-ul data prin spi; In slave se apeleaza o intrerupere care-mi trece intr-o variabila similara byte-ul primit; Cum pot face ca si slave-ul sa-i spuna "ceva" masterului ... ?Multumesc.

Link spre comentariu
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • adynis

    2

Top autori în acest subiect

Vizitator ltdor

Cei doi registri SPDR (unul master si unul slave) din cele doua microcontrolere formeaza impreuna un registru circular de 16 biti. La sfarsitul fiecarei transmisii de 8 biti, vei avea byte-ul din master mutat in slave si cel din slave in master. Astfel ca cea mai simpla metoda ca slave-ul sa trimita ceva de maximum un byte, este ca mesajul slave-ului sa fie deja incarcat in SPDR inaintea transmisiei.Daca mesajul slave-ului este mai lung de un byte, sau mesajul slave-ului este conditionat logic de ceea ce masterul a transmis (deci un anumit raspuns la o anumita comanda care nu poate fi prevazuta), atunci treaba devine mai complicata si se rezolva prin transmiterea in continuare de catre master a unor dummy bytes fara semnificatie dupa mesajul util (1,2,10 sau cati sunt necesari pana cand slave-ul isi determina si compune raspunsul), dar care ofera slave-ului clock-ul necesar pentru a-si transfera mesajul de mai multi bytes. Problema in acest caz este ca slave-ul trebuie sa-si puna raspunsul in SPDR exact dupa ce ultimul bit din byte-ul curent a fost shiftat, iar pentru a prinde acest moment trebui sa urmaresti bitul SPIF din registrul SPSR sau sa exploatezi intreruperea data de SPI dupa fiecare 8 shiftari, iar pentru asta ai la dispozitie cel mult jumatate din perioada clock-ului SPI generat de master, sau un sfert daca vrei sa fii sigur ca nu apar probleme.In cazul tau, o varianta este sa mergi cu raspunsuri de un byte gata pregatite din partea slave-ului, pe care le incarci in SPDR atunci cand nu exista comunicatie pe SPI sau imediat dupa ce ai citit mesajul master in rutina de intrerupere (deci la finele unei sesiuni de comunicatie precedente).Daca solutia nu se potriveste aplicatiei tale si ai nevoie sa formulezi un raspuns pe mai multi bytes si eventual functie de comanda master-ului, atunci comanda masterului trebuie sa fie si ea pe mai multi bytes - unul (primul) util si restul, dummiesSa luam cazul in care ai nevoie sa returnezi 2 bytes care sunt functie de comanda master-ului. In acest caz este nevoie ca masterul sa trimita mesaje pe 4 bytes (un byte de comanda si trei dummies)Imediat dupa receptia primului byte, slave-ul in analizeaza, decodifica comanda si isi formuleaza raspunsul pe doi bytes in timp ce al doilea byte al master-ului (deci primul dummy) este transferat. Cand acest al doilea byte (primul dummy) este transferat, deci la a doua intrerupere (si prima care urmeaza comenzii), incarci in SPDR primul byte ce constituie raspunsul slave-ului (nu te mai intereseaza sa citesti ce a trimis master-ul). La a treia intrerupere (a doua care urmeaza comenzii), incarci in SPDR al doilea byte din raspuns si treaba-i gata. A patra intrerupere o ignori.Problema in acest caz este daca ai timpul necesar sa decodifici comanda si sa formulezi raspunsul pe doi bytes in timp ce al doilea byte (primul dummy) este transferat. Estimarea asta nu o poti face decat tu, iar in caz ca timpul nu prea ajunge, inserezi inca un dummy (deci comanda pe 5 bytes) si rezervi un timp dublu pentru decodificarea comenzii si formularea raspunsului.

Link spre comentariu

Mersi frumos ltdor, Am sa incerc. In mod special cred ca m-ar ajuta pe scurt asta:

In cazul tau, o varianta este sa mergi cu raspunsuri de un byte gata pregatite din partea slave-ului, pe care le incarci in SPDR atunci cand nu exista comunicatie pe SPI sau imediat dupa ce ai citit mesajul master in rutina de intrerupere (deci la finele unei sesiuni de comunicatie precedente).

Pentru ca deja facusem masterul sa trimita 5 bytes catre salve, deci daca mi-ar merge asta in Cvavr, atunci imi voi permite sa raspund chiar si cu 5 bytes ... :d Dar aici cred ca greseam, ca eu incercam sa fac simultan treburile ... defapt, puneam datele in slave dupa ce se apela intreruperea ... Dar voi incerca si cum ai spus !
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări