Sari la conținut
ELFORUM - Forumul electronistilor

Nu pot sa comunic cu eeprom prin SPI


Mar

Postări Recomandate

Am scris urmatorul asm cod ca sa comunic cu un 25C080 si 18F452 dar nu pot sa scriu si sa citesc din locatia de memorie 10 (0Ah). Programul trebiue sa scrie la adresa de memorie 0Ah cifra 2 (32h) si apoi sa afiseze pe LCD. Va rog sa va uitati peste el si sa-mi spuneti unde gresesc.Pic-ul utilizeaza un rezonator (quartz) 10MHz, este probabil prea rapid pentru eeprom deoarece nu afiseza nimic pe LCD? :sparge: :sparge: :sparge: :sparge: movlw 90hmovwf 0xF94 ; set input TRISC ( RX and SDI)movlw 80hmovwf 0xFC7 ; SMP=1 from SSPSTATmovlw 31hmovwf 0xFC6 ; SSPEN=1, ckp=1, FC/16 from SSPCON1write_10bcf 0xF83, 1 ; low chip selectmovlw 01h ; write status register (WRSR)call outputmovlw 06h ; enable write operation (WREN)call outputmovlw 02h ; write data to memory ...(WRITE)call outputmovlw 00h ; write MSB addresscall outputmovlw 0Ah ; write LSB addresscall outputmovlw 33h ; write datacall outputbsf 0x F83, 1 ; high chip selectbcf 0xF83, 1 ; low chip selectmovlw 04h ; disable write operation (WRDI)call outputbsf 0xF83,1 ; high chip selectcall delay ; 5ms delayreturnread_10bcf 0xF83, 1 ; low chip selectmovlw 05h ; read status register (RDSR)call outputmovlw 03h ; read data from memory (READ)call outputmovlw 00h ; read MSB addresscall output movlw 0Ah ; read LSB addresscall outputmovwf label ; RAM memorybsf 0xF83,1 ; high chip selectreturnoutputmovwf 0xFC9 ; SSPBUF registerloopbtfss 0xFC7, 0 ; test buffer full status bitbra lopretlw 0 Multumesc

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

Top autori în acest subiect

  • Mar

    4

  • Liviu M

    3

  • vsurducan

    1

Doua chestiuni imi mai aduc aminte la SPI: doar SDI este configurat automat prin intializarea modului SPI, SDO si SCK nu, deci astea trebuie initializate din TRIS,verifica in datasheet ca-i asa si la PIC-ul tau.Apoi sunt situatii cand trebuie sa trimiti un caracter dummy ca sa initializezi comunicatia. Apoi nu se vede ce-i cu CKP si CKE.Cand faci hi-lo un pin IO fara macar un nop intre instructiuni nu-i prea in regula...Daca ai programat bine SMP nu-i prea repede, uita-te pe "oscioloscop"

Link spre comentariu
Vizitator blacksword

C18 - main.c

 

#include "p18f452.h"#include "delays.h"#include "spi.h"#define LCD_RW   PORTBbits.RB6 #define LCD_RS   PORTBbits.RB5 #define LCD_E    PORTBbits.RB4 #define SPI_CS   PORTCbits.RC2#pragma config OSC = HSvoid afisare(unsigned int);void comanda(unsigned int);void lcd_initializare(void);void main(){	int i;//port lcd		TRISB=0;	PORTB=0;//tris CS	TRISCbits.TRISC2 = 0;//spi	SPI_CS = 0;		OpenSPI(SPI_FOSC_4, MODE_00, SMPMID);	SPI_CS = 1;//scrie	SPI_CS = 0;		putcSPI(SPI_WREN);	SPI_CS = 1;	SPI_CS = 0;		putcSPI(2);		putcSPI(0x00);		putcSPI(0x0A);		putcSPI(0x32);		SPI_CS = 1;	//delay 5ms	Delay100TCYx(125);//citeste	SPI_CS = 0;		putcSPI(3);		putcSPI(0x00);		putcSPI(0x0A);		i = getcSPI();	SPI_CS = 1;	//lcd	lcd_initializare();	afisare(i);	while(1){	};}void lcd_initializare(void){LCD_E = 0;LCD_RS = 0;LCD_RW = 0;Delay10KTCYx(10);comanda(0b00000010);comanda(0b00101000);comanda(0b00001100);comanda(0b00000001);comanda(0b00000010);}//afisare pe 4 bitivoid afisare(unsigned int caracter){PORTB=caracter >> 4;LCD_RS = 1;LCD_E = 1;LCD_E = 0;LCD_RS = 0;PORTB=caracter & 0x0f;LCD_RS = 1;LCD_E = 1;LCD_E = 0;LCD_RS = 0;Delay100TCYx(625);}//comenzi pe 4 bitivoid comanda(unsigned int comanda){PORTB=comanda >> 4;LCD_E = 1;LCD_E = 0;PORTB=comanda &0x0f;LCD_E = 1;LCD_E = 0;Delay1KTCYx(10);}
Link spre comentariu

Din TRIS am setat SDI pe input si SDO si SCK pe output.Spune-mi te rog ce este caractedul dummy?Am verificat pe osciloscop si pic-ul trimite SCK si SDO dar nu primeste nimic de la memorie.Acu ori nu e initializarea memoriei corecta desi cred ca am respectat toate instructiunile de initializare ori viteza e prea mare. Dar nici asa nu inteleg de ce nu primesc ceva de la memorie deoarece am testat memoria la diferite viteze (Fosc/ 4 si Fosc/16) .

Link spre comentariu

Frecventa maxima (pentru 5V) e 3 MHz. FC/16 e, zic eu, suficient de mic.Chip select (CS) e legat/setat bine (o schema cu legaturile poate n-ar strica)? Face ce trebuie (se duce in 0) pe perioada comunicatiei (asta verificat cu osciloscopul pe pinul CS al memoriei)?Pinul HOLD cum il tii?SCK cate pulsuri da (SO-memorie e activ in ultimii tacti (24-31))?Hai, baga mai multe date, poate iese ceva.

Link spre comentariu

1. In pdf nu vad nici un 18F452. Chiar ma interesa schema folosita de tine.2. N-ai zis nimic de CS (chip select). Esti sigur ca asta face ce-i trebuie? Simptomele descrise de tine (nici un raspuns) seamana a circuit "neadresat" (de asta se ocupa CS).

Link spre comentariu

Din fisierul pdf , schema de conectare a eepromului am utilizat-o ca referinta.De asemenea formasemnalului din fisierul atasat le obtin si eu pe osciloscop, dar nu si semnalul SDI de la eeprom.Acest lucru ma face sa cred ca nu am initializat bine memoria, insa nu stiu ce nu e bine.Probabil WREN, WRDI, WRSR, RDSR etc. trebiue puse in alta ordine.In locul procesorului de acolo am inlocuit pic-ul meu (18F 452) si am schimbat pinii SCK,SDI si SDO.Adica: SCK de la eeprom -> pin 18 (RC3) SCK 18F452 SDI de la eeprom -> pin 24 (RC5) SDO 18F452 SDO de la eeprom -> pin 23 (RC4) SDI 18F452Secventa de program de mai sus este facuta de mine pentru PIC18F452.Pentru CS am ales pinul 20 (RD1) si l-am setat pe low in timpul comunicatiei, dar pentru comoditate se poate seta orice alt pin.

Link spre comentariu

Si pana la urma, CS se duce in 0 sau nu? Te-ai uitat si la el cu osciloscopul?Ca restul de semnale par in regula (banui ca HOLD si WP le-ai legat ca in PDF).Si pana la urma SDO memorie e chiar in three-state (undeva intre 0 si 1), sau e stabil in 0/1?In rest, nu prea vad ce ai putea sa setezi in memorie ca sa nu raspunda chiar deloc (am vazut ca poti inhiba scrierea, da' citirea nu; recunosc, n-am citit toata documentatia memoriei).

Link spre comentariu
Vizitator blacksword

Am scris urmatorul asm cod ca sa comunic cu un 25C080 si 18F452 dar nu pot sa scriu si sa citesc din locatia de memorie 10 (0Ah). Programul trebiue sa scrie la adresa de memorie 0Ah cifra 2 (32h) si apoi sa afiseze pe LCD. Va rog sa va uitati peste el si sa-mi spuneti unde gresesc.Pic-ul utilizeaza un rezonator (quartz) 10MHz, este probabil prea rapid pentru eeprom deoarece nu afiseza nimic pe LCD? :sparge: Multumesc

Posteaza, te rog, tot codul folosit.(daca C-u' nu este agreat) :limb:
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