Sari la conținut
ELFORUM - Forumul electronistilor

Convert 1 byte to 8 bit BASCOM / SPI comunication


Postări Recomandate

  • Răspunsuri 62
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

Cred c-ai inteles gresit rolul pinului SS. Este pinul care activeaza modulul SPI indiferent daca pentru transmisie sau receptie.

Citat

SS

Slave Select. Pin is the pin number to use such as PORTB.2

 

Use NONE when you do not want the SS signal to be generated. See remarks. Or as an alternative you can use : NOSS=1.

 

Am gresit citatul despre SS, l-am luat pe cel de la Soft SPI. Cel de la Hard SPI e mai jos (da' zice acelasi lucru):

Citat

NOSS

1 or 0. Use 1 when you do not want the SS signal to be automatically generated in master mode.

 

Si daca ne uitam la remarks:

Citat

BASCOM will automatically set the SS pin to logic level 0 when you use a SPI command. And when the SPI command has executed, it will set the SS pin back to a logic 1.

When the slave chip has in inverted SS pin (it requires a 1 to be active) you can not use this automatic SS signal generation.

When you want to address multiple slaves with the software SPI you need multiple pins to select the different slave chips. In this case you also can not use the automatic SS signal generation.

The solution is to specify NONE for SS. This will eliminate the automatic SS signal generation. But it also means that you as a user need to handle this. In practice this means :

- choose a port pin to serve as SS pin

- set it to output and to the right logic level (1 in most cases to disable the slave)

- before using a SPI statement, select the slave by making SS logic 0.

- after the SPI statement, set the SS logic level back to 1.

 

Cu alte cuvinte, pui Noss = 1 (sau SS = NONE) daca vrei sa "comanzi" de mana starea lui SS (la master).

 

La slave pinul asta (de obicei tras la 0) activeaza modului SPI si slave-ul incepe sa primeasca datele.

LE: Am zis prostii, la slave nu conteaza, se foloseste numai modului hard, cu SS activat, asa ca daca-s conectate bine (SS master cu SS slave, ar trebui sa mearga).

 

Cum ai conectat cele 2 Arduino unul la celalat? Ai legat semnalele SS impreuna?

 

Uite si descrierea din foaia de catalog a lui ATMEGA328P:

Citat

19.3.1 Slave Mode

When the SPI is configured as a Slave, the Slave Select (SS) pin is always input. When SS is held low, the SPI is activated, and MISO becomes an output if configured so by the user. All other pins are inputs. When SS is driven high, all pins are inputs, and the SPI is passive, which means that it will not receive incoming data. Note that the SPI logic will be reset once the SS pin is driven high.The SS pin is useful for packet/byte synchronization to keep the slave bit counter synchronous with the master clock generator. When the SS pin is driven high, the SPI slave will immediately reset the send and receive logic, and drop any partially received data in the Shift Register.

Am ingrosat eu informatiile referitoare la functionarea semnalului SS.

Editat de Liviu M
Link spre comentariu

Am incercat si nu sa imbunatatit nimic, din contra ca clipocesc valorile.

Sunt conectate pin la pin, singurul lucru ce pot spune este ca firele de MISO MOSI SCK si SS sunt rasucite intre ele, sa fie asta o problema? distanta dintre MCU circa 5cm.

Editat de Cilibiu
Link spre comentariu

Nu inteleg de ce ar clipoci valorile de pe afisorul slave-ului cand master-ul trimite cu pauze.

Pauza (waitms) o pui in codul de la master, dupa transmisie, da?

Do
  A(1) = 248
  A(2) = 128
  A(3) = 200
  A(4) = 116
  Spiout A(1) , 4

  Waitms(300)
Loop

 

Pe de alta parte, de ce nu folosesti modul hardware si la master? Ca vad ca folosesti pinii dedicati.

 

 

Link spre comentariu

Da exact asa am facut cu delay.

Am folosit masterul si ca harwere spi , merge ok dar doar 1 byte, daca trimit 2 byte si dau refersh de mai multe ori isi schimba ordinea afisari. Daca trimit 3 sau 4 byte afisarea clipoceste, nu am reusit sa o fac stabila decat cu spi soft.

Editat de Cilibiu
Link spre comentariu

LE Cumva-cumva am postat unele chestii de doua ori, sorry.

 

Daca merge cate un octet, trimite-i pe rand:

Spiout A(1), 1
Waitus(100)
Spiout A(2), 1
Waitus(100)
...

De receptionat ii receptionezi tot pe rand.
 

Pe a treia parte, cred ca nu se potriveste modul ales la hard SPI (slave, CPOL=1, CPHA=0) cu formatul ales la soft SPI (master, mode=1). Daca te uiti in help-ul BASCOM, o sa vezi c-ar trebui (dupa parerea mea) mode = 2 la soft SPI (master).

De-aia zic, foloseste hard SPI (cu aceleasi setari, mai putin modul - la master il pui MASTER).

 

Pe de ultima parte, in help-ul de la config spi la Bascom (nu pot pune link) mai scrie si ca

Citat

When using a processor for both the master and slave : Take in mind that the SPI master processor clock frequency must be 1/4 of the SPI slave processor frequency.

Habar n-am cum sa "traduc" informatia asta.

 

Editat de Liviu M
Link spre comentariu

Exact ca in help am facut. Iar la ultimul citat am observat ca atunci cand trimiteam doar 2 byte clock pe master il aveam 128 si pe slave 16 si mergea bine, in schimb cand am trecut pe 4 byte nu am reusit sa il fac sa mearga cum trebuie.

Hai ca incerc din nou in 15 min varianta asta, poate am omis eu ceva.

Mersi oricum de toate solutiile oferite.

Help-ul bascomului lam rasfoit de mia sarit capacele.

Link spre comentariu
Acum 9 minute, Cilibiu a spus:

clock pe master il aveam 128 si pe slave 16

N-am inteles ce vrei sa zici.

Oricum, cum zicea si @djvas, e clar o problema de timing. Scoate transmisia din do .. loop (transmite/receptioneaza) si trimite datele o singura data. Pana nu obtii in modul asta o transmirie curata, n-are rost sa insisti. Eventual foloseste hard SPI si activeaza intreruperile la receptie.

Editat de Liviu M
Link spre comentariu

Mam gandit sa folosesc intreruperile dar la ce viteza am eu nevoie de refresh cred ca imi va provoca intarzieri enorme in loop. Al doilea slave care va contine main program si va comanda outputurile , monitorizeaza statusurile porturilor trimise de master si in caz ca ceva nu este in regula cu porturile trimise de master sau pica comunicatia slave-ul trebuie sa treaca toate outputurile in 0 cat mai repede posibil.

Link spre comentariu

Hm, nu stiu ce sa zic. Mie  oricum mi se pare ca folosesti SPI-ul "invers". Pentru ca slave-urile nu pot initia transmisia (numai masterul trage ss la masa, sa activeze cate un slave si genereaza clk), de obicei master e modulul care controleaza si cere date de la slave-i cand (crede ca) e cazul.

Ca sa "ceara cuvantul", slave-urile au eventual cate un pin extra cu care semnalizeaza masterului sa le ia la intrebari.

 

Da' mai ai pana acolo. Trebuie sa faci comunicatia 1:1 sa mearga intai.

Editat de Liviu M
Link spre comentariu
Acum 35 minute, Liviu M a spus:

When using a processor for both the master and slave : Take in mind that the SPI master processor clock frequency must be 1/4 of the SPI slave processor frequency.

Am incercat si asta si tot nu merge.

Clock pe master este 1mhz si pe slave 4mhz.

 

 

Master :


Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 16 , Noss = 0

 

Slave:


Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 1  

L.E Mam jucat si cu comunicatia SPI master-slave cu cere de informatie, pe 1 byte merge perfect, trimit si cer de la slave care imi ofera informatiile, dar cand trec peste 2 byte treburile o iau razna.

Ca sa trimita slave informatie NOSS=0 si configurat PORTB.4= output.

Iar in master folosesti comanda SPIIN a,1

 

Editat de Cilibiu
Link spre comentariu

Am trimis o singura data informatiile din master catre slave cu codurile de mai jos si afisarea este corecta indiferent cate refresh dau la master sau la slave nu se schimba ordinea.

Acum cum fac sa pot trimit informatiile acestea cat mai repede posibil fara sa se decaleze???

 

Master :


 

$regfile = "m328pdef.dat"
$crystal = 16000000

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 16 , Noss = 0
'Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = None , Clock = Portb.5 , Spiin = 0 , Mode = 0 , Speed = 1 , Setup = 1
Spiinit
Enable Spi

Dim A(4) As Byte                                            'Status Sursa pozitiva canal R

A(1) = 248
A(2) = 128
A(3) = 200
A(4) = 116

Spiout A(1) , 4


End

 

Slave:

 


$regfile = "m328pdef.dat"
$crystal = 16000000


Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 16 , Noss = 1
Spiinit
Enable Spi

$lib "glcdra6963.lib"

Config Graphlcd = 240 * 128 , Dataport = Portd , Controlport = Portc , Cd = 1 , Rd = 3 , Wr = 4 , Ce = 0 , Reset = 2 , Fs = 5 , Mode = 8

Cursor Off Noblink
Cls

Dim A(4) As Byte                                            'Status Sursa pozitiva canal R


Do

Spiin A(1) , 4


Locate 8 , 2
Lcd A(1)
Locate 9 , 2
Lcd A(2)


Locate 10 , 2
Lcd A(3)
Locate 11 , 2
Lcd A(4)

Waitms 10

Loop

End

 

 

Link spre comentariu

Cum ziceam, citatul ala nu stiu cum sa-l interpretez, ca dupa parerea mea se refera la clockul ATMega, nu la clock-ul SPI.

Da' atata timp ca receptionezi corect datele trimise, diferind doar ordinea, nu cred ca e cazul sa umbli la frecvente.

 

Cum zicea @djvas, nu se sicronizeaza bine si asta trebuie sa vezi de ce. De-aia ziceam - incearca intai cu o singura transmisie, pentru ca tu nu stii pe care (a cata) din transmisii o afisezi, nici daca in timp ce afisezi una din transmisii modulul spi nu receptioneaza (fara sa-ti spuna) date de la urmatoarea transmisie suprascriind ce ai tu in A() la receptie.

 

Ai scris intre timp c-ai facut testul asta si merge.

Editat de Liviu M
Link spre comentariu

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.
Notă: Postarea ta va necesita aprobare moderator înainte de a fi vizibilă.

Vizitator
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Răspunde la acest subiect...

×   Alipit ca text avansat.   Restituie formatare

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.




×
×
  • 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