ohamoha Postat Iulie 15, 2015 Partajează Postat Iulie 15, 2015 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
sofian Postat Iulie 15, 2015 Partajează Postat Iulie 15, 2015 trebuie sa ne spui si cum este programat modulul SPI si PIC-ul folosit Link spre comentariu
ohamoha Postat Iulie 15, 2015 Autor Partajează Postat Iulie 15, 2015 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
sofian Postat Iulie 15, 2015 Partajează Postat Iulie 15, 2015 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 Link spre comentariu
ohamoha Postat Iulie 17, 2015 Autor Partajează Postat Iulie 17, 2015 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
masterpic77 Postat Iulie 17, 2015 Partajează Postat Iulie 17, 2015 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
ohamoha Postat Iulie 17, 2015 Autor Partajează Postat Iulie 17, 2015 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
Liviu M Postat Iulie 17, 2015 Partajează Postat Iulie 17, 2015 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum