Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 28-06-2006, 15.31.27   #1
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
Interfacciare schede SD & PIC

Ciao...non ricordo se si era già parlato di interfacciare SD card con un PIC!

Cmq...vorrei provare a memorizzare dei dati su un scheda SD! sul sito della microchip ho trovato un prodotto interessante per fare le prime prove, è una scheda di prova denominata PICtail Board for SD and MMC cards. Nel sito si trova un pò di documentazione a riguardo ma... o sono scemo io o la microchip non vuole che la gente impari a fare certe cose !...non si capisce na mazza!

Qualcuno ha già sperimentato qualcosa di simile? e se si, mi potrebbe dare una mano?

Qualunque tipo di link è ben accetto!

ciao e grazie!
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 28-06-2006, 16.01.46   #2
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Credo che più che dalla microchip dovresti cercare informazioni dai produttori di schede.
Se non sbaglio le SD e le MMC dialogano in I2C e organizzano i dati come una filesystem FAT32.
Quindi per il protocollo di comunicazione ti basta usare il modulo I2C integrato nel pic, mentre per sapere "cosa" scrivere devi trovare della documentazione tipica di una scheda.
__________________

Tu non sai niente, Jon Snow!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 28-06-2006, 16.49.20   #3
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
mmmm... modulo I2C! ... ho capito, Non si finisce mai di studiare (imparare ), dove trovo un po di info su I2C? sul datasheet? hai qualche esempio di comunicazione?
Ciao e grazie!
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 28-06-2006, 20.00.26   #4
Kill the fight !
 
L'avatar di  Beppe82
 

Iscritto da: 07-09-2001
Messaggi: 8,757
Feedback: (0)
le sd le puoi anche usare raw ossia senza nessun file system, semplicemente indirizzando le varie locazioni che cmq vanno scritte a blocchi

per info usa google, si trova di tutto di +, solo che devi selezionare tra le montagne di roba che c'è

PS: nn dirmi che ti sei comprato una scheda della microchip quando con 5 pezzi di filo, un po di carta di chwingum e una graffetta puoi realizzare un efficentissimo connettore per SD
Beppe82 Non in Linea   Rispondi Citando
Vecchio 28-06-2006, 20.05.08   #5
Kill the fight !
 
L'avatar di  Beppe82
 

Iscritto da: 07-09-2001
Messaggi: 8,757
Feedback: (0)
allora ricordavo bene , le SD comunicano con il SPI (che cmq se nn ricordo male puoi rimaneggiare con il controller I2C)


cmq


http://www.k9spud.com/sdcard/


prego
Beppe82 Non in Linea   Rispondi Citando
Vecchio 28-06-2006, 22.26.36   #6
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
Quote:
PS: nn dirmi che ti sei comprato una scheda della microchip quando con 5 pezzi di filo, un po di carta di chwingum e una graffetta puoi realizzare un efficentissimo connettore per SD
... non ancora! ma il mio Prof di Tesi vuole asssooooolutamente comprarla!
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 29-06-2006, 20.05.45   #7
Kill the fight !
 
L'avatar di  Beppe82
 

Iscritto da: 07-09-2001
Messaggi: 8,757
Feedback: (0)
com'è che diceva totò?



ah, si...



e io paaago




Beppe82 Non in Linea   Rispondi Citando
Vecchio 14-09-2006, 23.04.34   #8
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
Ok!! Ciao a tutti!! tempo fà avevo aperto questo topic pieno di domande e di dubbi e ora ho + dubbi di prima ..... skerzo ... ed ora dopo + di un mese di lavoro, studio, Testate date al muro ... finalmente ci son riuscitooooooooooooo!!!!!!!!!

Il sistema che vi presento permette di acquisire un segnale analogico al Pin RA0 di un pic18F4550 (fatto variare per mezzo di un trimmer), i segnali convertiti vengono memorizzati nella RAM del Pic e successivamente scritti nella SD.
Per ora non stò usando una formattazione di dati (FAT16 o FAT32) e i byte vengono scritti barbaricamente nella card...ma ci stò lavorando!
Il tutto Viene alimentato con i 5V forniti dalla porta USB, tramite un regolatore di tensione LM1086 la "passo" a 3.3V e con questa tensione alimento sia il PIC che la scheda!
Non ho ancora testato la velocità di scrittura e lettura della card ma presto vi faccio sapere...devo solo settare bene un registro della SPI del pic per ottimizzare il tutto.
Per ora è tutto...vi lascio alle splendide immagini del mio Hardware e presto vi darò nuove notizie! (naturalmente se siete interessati! )...


TOP VIEW:



BOT VIEW:






P.S. Un Grazie a Ziko per l'aiuto ... e scusami se su msn ti stressavo!
P.S.S. http://mossproject.altervista.org/SD.htm
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}

Ultima Modifica di lentz : 14-09-2006 23.40.59.
lentz Non in Linea   Rispondi Citando
Vecchio 15-09-2006, 06.00.04   #9
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Ottimo lavoro lentz
Mi sa che anche questo topic diventerà un punto di riferimento
__________________

Tu non sai niente, Jon Snow!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 15-09-2006, 17.22.08   #10
Registered User
 

Iscritto da: 16-08-2005
Messaggi: 475
Feedback: (0)
complimenti!! non ho ben capito per cosa usi la porta usb, e poi vorrei sapere se si potesse usare un pic piu normale diciamo, un normale 16f628 nn reggerebbe?
pinello88 Non in Linea   Rispondi Citando
Vecchio 15-09-2006, 18.39.53   #11
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
La porta USB ha 2 scopi principali:
1) Fornisce l'alimentazione al circuito prelevandola dall'hub usb.
2) In fase di debug la uso per inviare al PC dei byte corrispondenti alle risposte che la scheda SD mi restituisce, questo è molto importante per capire come stà lavorando la card. Infatti la scheda, ad ogni mio "ordine" mi risponde in maniera differente e se si verificano errori di comunicazione Pic <-> SD o SD <-> Pic lo capisco dal valore del Byte di risposta.

Quote:
vorrei sapere se si potesse usare un pic piu normale diciamo, un normale 16f628 nn reggerebbe?
... Nel Pic che sto usando è presente il modulo per la comunicazione SPI (e I2C), il firmware è scritto per sfruttare questo tipo di trasmissione dati. Guarda il datasheet del 16f628 e vedi se supporta tale comunicazione! poi fammi sapere!
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 15-09-2006, 18.51.05   #12
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
Qualche consiglio prima di iniziare:

Leggetevi un po di documentazione prima di iniziare a lavorarci sopra (sempre se siete interessati)!!
Intanto vi do qualche link, poi nei prossimi giorni (appena avrò un po di tempo) vi posterò un po del mio codice e qualche info.



Una introduzione di programmazione:
http://www.standardics.philips.com/s...0card%20spi%22

Utilissimo:
http://forum.microchip.com/tm.aspx?m=58980&mpage=1

Raccolta di link:
http://pic18fusb.online.fr/wiki/wikka.php?wakka=MsDrive

SCONSIGLIATO PER INIZIARE (chi ha scritto quel codice non è umano!! ):
http://www.microchip.com/stellent/id...param=en024412
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 15-09-2006, 22.57.25   #13
Registered User
 

Iscritto da: 16-08-2005
Messaggi: 475
Feedback: (0)
ok grazie di nuovo i complimenti per tutto il progetto
pinello88 Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 00.01.45   #14
Registered User
 

Iscritto da: 22-03-2005
Locazione: Genova
Messaggi: 503
Feedback: (0)
Se non ricordo male il pic16f628a supporta il protocollo i2c (ha una USART integrata) ma non lo spi.
Per utilizzare lo spi occorre la serie 18...
X Lentz ma tu hai usato lo SPI o I2C?
aduri Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 00.46.16   #15
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
La SD è preddisposta per la comunicazione SPI.
... ho usato la SPI!
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 12.06.07   #16
Registered User
 

Iscritto da: 15-05-2006
Messaggi: 62
Feedback: (0)
Quote:
Originariamente inviato da aduri
Per utilizzare lo spi occorre la serie 18...

Il 16F87X supporta SPI.

DI sicuro devi passare a 28 pin
cristiano2004 Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 15.55.53   #17
B&M Coasterman
 
L'avatar di  Matro
 

Iscritto da: 06-12-2003
Locazione: Padova
Messaggi: 8,294
Feedback: (0)
Bel lavoro lentz!
__________________
Matro Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 20.49.11   #18
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
Finalmente son riuscito a finire il mio progettino! Come promesso cercherò di spiegare un po’ come ho fatto .
In effetti nn so da dove iniziare e non mi và di buttarvi li il codice e basta! Ok…dai, ci provo!

Prima di poter utilizzare una scheda SD, essa necessita di una serie di procedure di inizializzazione, con la premessa che utilizzeremo la modalità SPI.
La modalità SPI fà uso di 4 linee per effettuare il dialogo con il modo esterno: 2 per i dati (1 Input e 1 Output), 1 per il clock, 1 per l’abilitazione dlla periferica di interesse (CS – chip select).
Per inizializzare la card sarà necessario realizzare un firmware che esegua 3 fasi fondamentali chiamate:
1° fase: Dummy Clock ( ciclo stupido)
2° fase: Reset (invio di CMD0)
3° fase: Avvio inizializzazione (invio di CMD1)

N.B. Tenderò ad usare una nomenclatura il più possibile simile a quella presente nelle specifiche SanDisk. Con i termini CMDx intendo indicare una particolare serie di byte che servono per la comunicazione tramite SPI con la SD.

Quando la card viene inserita nel suo slot e dopo aver ricevuto l’alimentazione, essa si porta nello stato di Idle. Dopo di che andremo ad eseguire le tre fasi precedenti.
Nella prima vengono inviati 74 cicli di clock a vuoto (v. specifiche SanDisk), successivamente viene abilitata la linea CS e viene inviato il CMD0. Ora, se la card mi risponde con un valore pari a 1 (in decimale) si potrà passare all’ultima fase, ovvero l’invio di CMD1 e affinché la card venga finalmente inizializzata sarà necessario aspettarsi una risposta dalla card pari a 0 (in decimale).

Bene questa in effetti è la parte più importante di tutto il firmware. Sembra una cosa banale ma in realtà le risposte che la SD mi restituisce possono essere molto diverse tra loro e realizzare un firmware in grado di interpretare le varie risposte è molto importante per capire le fonti di errore!

Iniziamo a vedere come ho realizzato il firmware. Come compilatore ho usato il C18 e il progetto di partenza è quello presente nel topic “Volete interfacciare il pic18f4550 al pc??”.

Iniziamo a presentare i prototipi del programma:

Codice:
// Prototipi per la comunicazione con la scheda SD
void InizializzaSPI(void);		// Inizializza il modulo SPI
void InizializzaSD(void);		// Inizializza la scheda SD(CMD0 & CMD1)
void Lunghezza_Blocco(void);	// Iposto la lunghezza del blocco che voglio scrivere (512Byte)
void Test_Scittura(void);		// Scrivo settori
void Test_Lettura(void);		// Leggo settori scritti
void Att_Disatt(void);		// Procedura di attivazione e disattivazione scheda durante la 
					// lettura e la scrittura (necessaria v. specifiche SD)

void Set_ADC(void);			// Qui vado a settare i regitri ADCON1 e 2 per acquisire 
					// un unico segnale al pin RA0.

void Nome_File(void);		// Imposto i dati del file da scrivere nella root-directory
void FAT(void);			// Creo la forattazione dela FAT
Questi invece sono i prototipi per la comunicazione SPI:

Codice:
void SPIWrite(unsigned char data);
unsigned char SD_WriteCommand(unsigned char* cmd);
unsigned char SPIRead(void);
unsigned char Scrivi_Data(unsigned char*);
unsigned char SD_Read_Block(unsigned long addr, unsigned char *buf);

Ad ogni CMDx la sua funzione:

Codice:
Definizioni per la scheda:

Tratto dal manuale delle SD section 5.2.2.1 (page 91 of PDF)
http://www.sandisk.com/pdf/oem/ProdManualSDCardv1.9.pdf

 0  - GO_IDLE_STATE: Resetta il dispositivo e lo mette in stato di IDLE

 1  - SEND_OP_COND: Attiva il processo di inizializzazione del dispositivo

 9  - SEND_CSD: Richiede il CSD del dispositivo (Card Specific Data - lungo 128Byte). Contiene le informazioni di configurazione per accedere al dispositivo:
- MID: ID Produttore [8B], OID: OEM/ID Applicazione [16], PNM: Nome Produttore [40B], PRV: Versione Prodotto [8B], PSN: Numero Seriale Prodotto [32B], - Riservato [4B], MDT: Data Produzione [12], CRC: Check Sum [7B], - Non usato=1 [1B];

10 - SEND_CID: ARichiede il CID al Dispositivo. CID: Card Identification Number [128B]

12 - STOP_TRANSMISSION: Termina un'operazione di lettura multipla.

13 - SEND_STATUS	: Richiede il registro di stato al dispositivo in cui indirizzo viene passato come argomento.

16 - SET_BLOCKLEN: Permette di stabilire la lunghezza di un Blocco di dati che varrà per tutte le operazioni successive di lettura/scrittura.

17 - READ_SINGLE_BLOCK: Legge un blocco dati di lunghezzapari a SET_BLOCKLEN

18 - READ_MULTIPLE_BLOCK:  La card continua ad inviare blocchi di dati finchè non si esegue un CMD12.

24 - WRITE_BLOCK: Scrive un blocco dati di lunghezza pari a SET_BLOCKLEN

25 - WRITE_MULTI_BLOCK:  La card continua a scrivere blocchi di dati finchè non si esegue un CMD12.


LA MODALITà SPI E' CNTROLLATA DA 2 REGISTRI, DI SEGUITO VENGONO RIPORTATE LE CONFIGURAZIONI DI TALI REGISTRI E DELLE PORTE USATE

Codice:
// Linee dedicate alla counicazione SPI

TRISCbits.TRISC7 = 0;	// Linea SDO - Output Master
TRISBbits.TRISB0 = 1;	// Linea SDI - Input Master
TRISBbits.TRISB1 = 0;	// Linea SCK - Output Master Clock
TRISAbits.TRISA4 = 0;	// Linea CS (o SS) - Output Master, Abilitazione dispositivo Slave

Impostazioni registro SSPSTAT:
 bit7:	SMP 	- "Data Saple Timing" - messo a 0 per alta veocità.
 bit6:	CKE 	- "Clock Edge Select" - Controlla quando i dati vengono trasmessi in relazione al SCK.
 bit5:	D/A 	- "Data/Address mode" - In modalità aster è un bit riservato.
 bit4:	P	- "Stop bit"		  - ??
 bit3:	S	- "Start bit"
 bit2:	R/W 	- "Read/Write"		  - << Solo per la modalità Slave >>
 bit1:	UA	- "Update Address"	  - << Solo per la modalità Slave >>
 bit0:  	BF  	- "Buffer Full"       - Si setta quando il trasferiento/ricezione è copletato!

	SSPSTAT = 0b00000000;		

Impostazioni registro SSPSTAT:
 bit7:	WCOL	- "Write Collision Detector bit"	 -  
 bit6:	SSPOV	- "Synchronous Serial Port Overflow" - Si setta quando si verificano errori di Overflow - Deve essere mantenuto a 0.								- Es. Si setta quando ci si dientica di leggere SSBUF dopo la trasissione. 
 bit5:	SSPEN 	- "SS Port Enable"	- Se a 1 abilita il odulo SSP.
 bit4:	CKP		- "Clock Polarity Selection"		 
 bit3-0:	SSPM	- "SS Port Mode Select bits"	- vedere datasheet						
	SSPCON1 = 0b00110001;

…. La prima Puntata termina qui, non ho riletto bene quello che ho scritto, spero di non aver fatto troppi errori di grammatica ! Prossimamente posterò lo schema circuitale! A presto!



P.S.
Quote:
Bel lavoro lentz!
... grazie Matro!
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}
lentz Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 22.36.24   #19
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Questo topic va a finire dritto nella sezione "Best of..."
__________________

Tu non sai niente, Jon Snow!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 19-09-2006, 23.42.04   #20
Registered User
 
L'avatar di  lentz
 

Iscritto da: 30-08-2005
Locazione: Cagliari
Messaggi: 291
Feedback: (0)
Come promesso ho preparato lo schematico! controllate se ci sono errori...





Naturalmente il pin SDO della SD và connessa al pin SDI del pic e viceversa!! Il pic è il master e la sd lo slave!
ciao ciao
__________________
#include <stdio.h>
main()
{
printf("\n http://mossproject.altervista.org/ ");
getchar();
}

Ultima Modifica di lentz : 19-09-2006 23.44.09.
lentz Non in Linea   Rispondi Citando
Rispondi Per le vostre immagini su questo forum potete usare PcTunerUp!
Iscriviti gratuitamente alla nostra newsletter.


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori)
 
Strumenti Discussione
Modalità Visualizzazione

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +1. Attualmente sono le 09.24.50.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0