|
|||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||
|
||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
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! |
|
|
|
|
|
#2 |
|
Super Moderator
|
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! |
|
|
|
|
|
#3 |
|
Registered User
|
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! |
|
|
|
|
|
#4 |
|
Kill the fight !
|
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 ![]() ![]() |
|
|
|
|
|
#5 |
|
Kill the fight !
|
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 ![]() |
|
|
|
|
|
#6 | |
|
Registered User
|
Quote:
![]() |
|
|
|
|
|
|
#8 |
|
Registered User
|
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 Ultima Modifica di lentz : 14-09-2006 23.40.59. |
|
|
|
|
|
#11 | |
|
Registered User
|
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:
![]() |
|
|
|
|
|
|
#12 |
|
Registered User
|
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 |
|
|
|
|
|
#15 |
|
Registered User
|
La SD è preddisposta per la comunicazione SPI.
__________________... ho usato la SPI! ![]() |
|
|
|
|
|
#17 |
|
B&M Coasterman
|
Bel lavoro lentz!
__________________ |
|
|
|
|
|
#18 | |
|
Registered User
|
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 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:
![]() |
|
|
|
|
|
|
#20 |
|
Registered User
|
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 Ultima Modifica di lentz : 19-09-2006 23.44.09. |
|
|
|
![]() |
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 | |
|
|