Il mio problema è abbastanza semplice: non riesco a raggiungere la velocità massima dell'SPI scrivendo su una SDHC. Scriverò qui tutti i calcoli e le considerazioni che ho fatto per escludere i vari problemi. Inanzitutto la SDHC ha una velocità sufficientemente alta, mentre il valore minimo è dato dal uC, che è 25 Mb/s. Questo è scritto nella prima pagina del data sheet, ma anche nelle specifiche elettriche di pagina 384, dove il minimo periodo del clock SPI è 40 ns, quindi appunto 25 MHz, e ci si ritrova col dato precedente.
Il clock del SPI è dato da una serie di divisori: tramite un primo registro divisore, SPIxBRG, il clock SPI è ottenuto a partire dal PBCLK, che è il clock del bus delle periferiche. A sua volta questo clock è ottenuto da un dvisore a partire dal SYSCLK, cioè il clock di sistema. Tutte queste cose le dico non per tediarvi ma perché ho effettutato accuratamete i debug per vedere se i valori di questi parametri sono corretti. Io ho impostato (e verificato) che PBCLK=SYSCLK e che SPICLK=PBCLK/8 (attenzione, questo non vuol dire che SPIxBRG è 8, perché c'è una formula di mezzo, presente a pagina 29 del reference SPI). Quindi, facciamo due calcoli per vedere effettivamente a quanto devo andare: con un SYSCLK di 80 MHz, ho un SPICLK di 10 MHz, ovvero 10 Mbps, cioè 1,25 MBps. Questo è la velocità che avrei dovuto ottenere con le impostazioni che ho settato e, ripeto, verificato col debug.
Ho misurato la velocità di scrittura dei dati e mi risulta pari a 155 kB/s. C'è un fattore 8 di mezzo, come potete vedere. Questa velocità l'ho testata con varie dimensioni di pacchetti, ed è sempre uguale. A questo punto passo a descrivere come ho misurato la velocità, non avendo un oscilloscopio per visualizzare il clock dell'SPI. Ho usato semplicemente un timer, che prende i valori all'inizio e ala fine delle operazioni, e poi fa la differenza e i calcoli del caso. A questo punto vi state chiedendo: essendo che il timer usa lo stesso PBCLK, cosa ti dice che anche il timer ha valori sballati? Ovviamente è ciò che ho pensato subito anch'io, e mi sono messo a fare delle verifiche. Ho creato un cronometro, usando il timer1, che accende un primo LED alla partenza e un secondo LED dopo 5 secondi. Con l'aiuto visivo di questo LED ho cronometrato il tempo tra i due con il cronometro del mio smarthpone, ed è esattamente 5 secondi. Quindi il PBCLK è settato correttamente e il TMR1 da informazioni assolutamente reali sul tempo.
Per velocizzare le operazioni, uso la scrittura direttamente su settori. Il programma funziona benissimo, è solo un problema di tempistiche che non mi ritrovo. Si noti che il tempo è preso solamente per la scrittura dei settori, e non anche per la creazione degli swap file, quindi è proprio un tempo netto di scrittura.
Aggiungo che come compilatore uso mikroC. Sebbene questo abbia delle funzioni di "alto livello", magari lasciando all'oscuro l'utente di ciò che si fa, io ho verificato col debug i singoli registri, quindi non credo ci siano dubbi su questo. Aggiungo inoltre, ma non so quanto possa aiutare, che sto usando una board prodotta dalla mikroC che si chiama EasyPIC Fusion v7.
Io ho finito proprio le idee e le verifiche, magari vi viene in mente qualcosa a voi. Chiedo scusa per il post lungo ma credo che dare più informazioni sia di grande aiuto per chi vuole aiutarmi. Ovviamente se volete maggiori info o avete qualche idea su ulteriori prove da fare, lo faccio al volo. Il mistero sarà risolto
Grazie a tutti!

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



grazie per la risposta. Ovviamente nel frattempo le mie ricerche non si sono fermate e, anche grazie a degli utenti disponibilissimi sul forum della microchip, sono riuscito a capire l'origine del problema che mi ha tenuto per 3 giorni incollato al PC almeno 10 ore al giorno.