Mar Postat Martie 2, 2011 Partajează Postat Martie 2, 2011 Am inceput sa testez comunicatia prin SPI a unui eeprom (25C080) cu un 18F452. Am testat programul de mai jos si nu pot sa scriu si sa citeasc memoria. Am verificat pe osciloscop si in timpul comunicatiei am SCK si date pe SI dar memoria tot analfabeta este. Nu stiu insa daca memoria a fost scrisa dar nu poate fi citita sau daca memoria este citita bine dar nu am nimic in locatia de memorie. Va rog daca ati reusit comunicatia cu 25CXXX prin SPI sa imi citeva sfaturi.Va multumescCBLOCK 0x000 ; alocare memorie High_Add Low_Add outbyte out_data ENDC bsf CS (Chip select este pe RC2) movlw 0x80 movwf SSPSTAT clrf SSPCON1 movlw 31h movwf SSPCON1 movlw 00h movwf High_Add movlw 03h movwf Low_Add bcf CS movlw 06h ;write enable movwf outbyte call write_byte bsf CS call delay_01 bcf CS movlw 02h ;write command movwf outbyte call write_byte movf High_Add,0 movwf outbyte call write_byte movf Low_Add movwf outbyte call write_byte movlw 32h ; scriu cifra 0 la locatia 3 de memorie movwf outbyte call write_byte call delay_01 bsf CS ;;;;;;;;;;;;;;;;;;;;;;;;;;; bcf CS movlw 03h ;read enable movwf outbyte call read_byte movf High_Add,W movwf outbyte call read_byte movf Low_Add,W movwf outbyte call read_byte bsf CS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;write_byte movf outbyte,W movwf SSPBUF loop btfss SSPSTAT, BF bra loop returnread_byte movf outbyte,W movwf SSPBUF loop1 btfss SSPSTAT, BF bra loop1 movf SSPBUF,W ;copiez din SSPBUF in acumulator movwf out_data return Link spre comentariu
kit Postat Martie 2, 2011 Partajează Postat Martie 2, 2011 poate te ajuta asta: http://www.microchip.com/stellent/idcpl ... e=en535706 de ce nu incerci sa folosesti C? Link spre comentariu
Liviu M Postat Martie 3, 2011 Partajează Postat Martie 3, 2011 Sters, ca era o prostie. LE Cred ca ai probleme la citire, nu "clockuiesti" suficient ca sa si citesti datele. Cred ca secventa de citire (cu functiile tale) ar fi: bcf CSmovlw 03h ;read enablemovwf outbytecall write_bytemovf High_Add,Wmovwf outbytecall write_bytemovf Low_Add,Wmovwf outbytecall write_byte ;pana aici "comanzi" memoriacall read_byte ; abia aici citesti efectivbsf CS cu read_byte ceva mai "scurta" (aproximativ, ca nu stiu prea bine asm); ideea e sa-i dai clock memoriei atunci cand ea ar vrea sa verse datele: read_bytemovf 0,W ;aici poate sa fie oricemovwf SSPBUFloop1 btfss SSPSTAT, BFbra loop1movf SSPBUF,W ;copiez din SSPBUF in acumulatormovwf out_datareturn Link spre comentariu
Mar Postat Martie 3, 2011 Autor Partajează Postat Martie 3, 2011 Am citit datele alea technice si am inteles ca trebuie sa fac urmatorii pasi ca sa scriu o memorie.CS low trimit WREN (06h)CS highDelay 5msCS lowtrimit WRITE (02h)trimit High_Addrestrimit Low_Addrestrimit dateledelay 5ms (deoarece trebuie 5ms sa scrie memoria)CS highPentru a citi o memorie situatia e ma simplaCS lowtrimit READ (03h)trimit High_Addrestrimit Low_AddresCS highSi pe SO voi primi datele de la memorieSpune-mi te rog daca am inteles bine Link spre comentariu
Liviu M Postat Martie 3, 2011 Partajează Postat Martie 3, 2011 Eu cred ca la delay 5ms poate fi dupa CS high. CS low trimit WREN (06h) CS high Delay 5ms CS low trimit WRITE (02h) trimit High_Addres trimit Low_Addres trimit datele CS high delay 5ms (deoarece trebuie 5ms sa scrie memoria) Pe de alta parte, la citire CS TREBUIE sa fie LOW pe toata durata comunicatiei, inclusiv la citire.De asemenea, cum ziceam si mai sus, daca te uiti la formele de unda in cazul citirii din memorie (data sheet pagina 8, fig. 3.1), dupa ce trimiti adresa trebuie sa mai generezi 8 pulsuri de ceas, pulsuri pe care vin datele din memorie. Pentru asta, dupa ce scrii Low_Address trebuie sa faci picul sa mai clockuiasca de 8 ori - comanda ta read. Asa ca mie-mi da (ca in postul meu de mai sus) Pentru a citi o memorie situatia e ma simpla CS low trimit READ (03h) trimit High_Addres trimit Low_Addres generezi 8 pulsuri pe SCK - call read_byte - si pe SO vei primi datele de la memorie CS high Link spre comentariu
Mar Postat Martie 3, 2011 Autor Partajează Postat Martie 3, 2011 DA, am vazut figura indicata de tine dar ma gindesc ca protocolul SPI functioneaza la fel ca si RS232 (nu ne intereseaza cum transmite datele sau daca trebuie sa dam clock un alt pentru a transmite datele). Important este sa respectam datele technice ale memoriei. Link spre comentariu
Liviu M Postat Martie 3, 2011 Partajează Postat Martie 3, 2011 Nu ti-am inteles ideea de mai sus. 3.2 Read Sequence The device is selected by pulling CS low. The 8-bit READ instruction is transmitted to the 25XX080 followed by the 16-bit address, with the six MSBs of the address being "don’t care" bits. After the correct READ instruction and address are sent, the data stored in the memory at the selected address is shifted out on the SO pin. The data stored in the memory at the next address can be read sequentially by continuing to provide clock pulses. Citatul e din data-sheetul memoriei.Cu alte cuvinte memoria sta de vorba cu tine (read/write) cat timp are CS low. Memoria e dispozitiv slave. Face ce trebuie sa faca atata timp cat are clock (pe sck). Clockul il genereaza masterul - adica picul. Nu-l are, nu face nimic. Oricum, nu e nevoie sa ma crezi. Incearca si zi-mi si mie cum a functionat. Sunt chiar curios, pentru ca desi cu SPI m-am mai jucat, cu PIC si SPI nu m-am jucat inca. Link spre comentariu
Mar Postat Martie 3, 2011 Autor Partajează Postat Martie 3, 2011 In secventa de program postata prima data (asa cum este setat SPI) pot obtine clock pe SCL (pin 18) si datele pe SO de la PIC.Asta am verificat cu osciloscopul pina acum. Din cite am observat semnalul de clock apare numai cind transmiti sau receptionezi date, nu este permanent asa cum arata in figura 3.1. De exemplu daca am 4 octeti de trimis la memorie (write, High_Addres, Low_Addres, date) voi vedea pe osciloscop 4 pachete de clock care se trimit la memorie.Deocamdata cercetam .. Link spre comentariu
Liviu M Postat Martie 3, 2011 Partajează Postat Martie 3, 2011 Pai fix de aia-ti zic ca trebuie ca dupa ce trimiti comanda si cei doi bytes de adresa trebuie sa mai trimiti si un pachet de date "fake" (acel *read* din posturile mele anterioare), ca sa generezi clockul necesar memoriei ca sa puna datele pe SDO-ul ei (SDI la pic). Memoria va ignora datele pe care tu i le trimiti in pachetul fake (ea stie acum ca are de de trimis date, asa ca nici nu se uita la SDI-ul ei/SDO-ul pic-ului).LE Si nu conteaza ca CLK are pauze; din punctul de vedere al memoriei, cat timp nu are clock, timpul "sta pe loc" (ce bine ar fi sa fie si la noi la fel). Link spre comentariu
Mar Postat Martie 6, 2011 Autor Partajează Postat Martie 6, 2011 Da, se pare ca ai avut dreptate. Functioneaza memoria. Link spre comentariu
Liviu M Postat Martie 6, 2011 Partajează Postat Martie 6, 2011 Cu placere!Gata, mesajul e acum destul de lung. 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