Sari la conținut
ELFORUM - Forumul electronistilor

16F877A - MSSP - nu se reseteaza BF (SSPSTAT<0>) dupa citire SSPBUF


Postări Recomandate

Salut.

La utilizarea modulului MSSP, in cazul meu comunicatie SPI, datasheet-ul spune ca:

 

Once the eight bits of data have been received, that byte is moved to the SSPBUF register. Then, the Buffer Full detect bit, BF (SSPSTAT<0>), and the interrupt flag bit, SSPIF, are set.

 

When the SSPBUF is read, the BF bit is cleared.

 

Doar ca simulat in Proteus dar si in realitate BF-ul nu este niciodata resetat. Mai mult desi in datasheet este marcat ca ReadOnly dar el poate fi pus pe zero din cod (manual).

 

Nu am gasit pe google referinte catre aceasta situatie. V-ati lovit de asa ceva?

 

Merci.

 

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

Top autori în acest subiect

Top autori în acest subiect

Am scris in subiect. Este vorba de 16F877A, modul MSSP, problema este ca nu se reseteaza BF (SSPSTAT<0>) dupa citire SSPBUF.

Codul este compilat cu MikroC.

TRISC.B5=0; //SDOTRISC.B3=0; //SCKSSPCON.SSPM3=0;SSPCON.SSPM2=0;SSPCON.SSPM1=1;SSPCON.SSPM0=0;SSPCON.SSPEN=1; //Enable serial portPORTB.B0=0; //nSELSSPBUF=bit1;do{} while(SSPSTAT.BF==0);rx1=SSPBUF;PORTB.B0=1; //nSEL//SSPSTAT.BF este in continuare 1SSPSTAT.BF=0; //Reset manual
Link spre comentariu

SSPCON1 este registru de control ptr MSSP

SSPSTAT.BF=0; //Reset manual 

nu se poate scrie BF

 

verifica daca nu primesti date in SSPBUF prea repede decit citesti SSPBUF

 

Asa as fi zis si eu, dar in practica se poate. Si Proteus ca simulator reactioneaza la fel. 

- Citesc SSPBUF

- Citesc BF si este 1

- Scriu BF=0

- Citesc BF si este 0

 

Am pus delay-uri peste tot tocmai pentru a elimina posibilitatea reactiei intarziate.

 

Dispozitivul este master asa ca nu se pune problema de primit date in SSPBUF mai repede decat comanda acesta.

Link spre comentariu

In primul rand BF se seteaza doar in receive mode in cazul unei receptii complete ; in codul tau vad ca faci mai intai o transmisie dar nu verifici daca transmisia este completa PIR1.SSPIF inainte de a citi BF ceea ce nu este OK , dealtfel si in data sheet spune :Generally, the MSSP interrupt is used to determine when the transmission/reception has completed. Incearca sa testezi PIR1.SSPIF in loc de BF si ai sa vezi ca merge (atentie acesta va trebui sa-l stergi manual , nu se sterge la citirea SSPBUF).

Link spre comentariu

In primul rand BF se seteaza doar in receive mode in cazul unei receptii complete ; in codul tau vad ca faci mai intai o transmisie dar nu verifici daca transmisia este completa PIR1.SSPIF inainte de a citi BF ceea ce nu este OK , dealtfel si in data sheet spune :Generally, the MSSP interrupt is used to determine when the transmission/reception has completed. Incearca sa testezi PIR1.SSPIF in loc de BF si ai sa vezi ca merge (atentie acesta va trebui sa-l stergi manual , nu se sterge la citirea SSPBUF).

 

Da, intentia mea era sa nu folosesc intreruperi. Daca te iei dupa litera manualului nu ar trebui sa conteze daca folosesti intreruperi sau un loop software.

 

Once the eight bits of data have been received, that byte is moved to the SSPBUF register then, the Buffer Full detect bit, BF (SSPSTAT<0>), and the interrupt flag bit, SSPIF, are set. 

 

Buffer Full bit, BF (SSPSTAT<0>), indicates when SSPBUF has been loaded with the received data (transmission is complete).

 

 If the interrupt method is not going to be used, then software polling can be done to ensure that a write collision does not occur.

Link spre comentariu

SSPIF e setat indiferent daca intreruperile sunt activate sau nu. Poti sa faci polling dupa flagul asta daca ti se pare ca functioneaza mai bine.Pe asta trebuie sa-l stergi de mana, nu se intampla automat.Poti sa mai testezi si WCOL, poate de fapt ai alte probleme.

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