Jump to content
ELFORUM - Forumul electronistilor

Nu pot sa comunic cu eeprom prin SPI


Mar

Recommended Posts

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 to comment
  • Replies 9
  • Created
  • Last Reply

Top Posters In This Topic

  • 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 to comment
Guest 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 to comment

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 to comment

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 to comment

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 to comment

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 to comment

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 to comment
Guest 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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines