Forum: Mikrocontroller und Digitale Elektronik AVR32 Performance für SD-Karten


von Cloud (Gast)


Lesenswert?

Hi!

Ich überlege ob es sich lohnt ein Projekt, das einen UC3A1-Controller
hat, auf einen UC3A3/A4-Controller umzustricken.
Der Grund ist, das der Zugriff über SPI auf die SD-Karte mit dem 
UC3A1-Controller nicht sehr schnell war. Geschwindigkeit war im 
einstelligen
KB/sec-Bereich trotz guter Karte.
Hat einer von euch einen UC3A3/A4 mit dem Multi-Media-Card-Interface und 
dem Memory-Stick-Interace probiert?
Bringt das eine spürbare Steigerung?

Cloud

von Phil S. (zippi)


Lesenswert?

Hi,

>UC3A1-Controller nicht sehr schnell war. Geschwindigkeit war im
>einstelligen
>KB/sec-Bereich trotz guter Karte.

Hmm? Dann hast du aufjedenfall was flasch gemacht. Ich konnte daten via 
SPI mit bis zu 1,2Mb/sec lesen bei 24Mhz SPI speed.

Ich selber habe auch den UC3A1. Mit dem UC3A3/A4 sollte man sogar 
4MB/sec und mehr schaffen (je nach SD).

Gruß
Zippi

von Cloud (Gast)


Lesenswert?

War deine Karte FAT-formatiert?
Wie schnell ist der Schreibzugriff bei dir?

Die Karte verwende ich so:
1
int  
2
SD_Spi_conf =   
3
0 << AVR32_SPI_CSR1_CPOL_OFFSET |                   
4
// Inaktiver Takt ist ow;
5
1 << AVR32_SPI_CSR1_NCPHA_OFFSET |
6
// Aktive Flanke ist 1
7
0  << AVR32_SPI_CSR1_CSNAAT_OFFSET |
8
1 << AVR32_SPI_CSR1_CSAAT_OFFSET |
9
// Deselektiere Baustein _nicht_!
10
0 << AVR32_SPI_CSR1_BITS_OFFSET |   
11
//  8Bit Modus
12
180 << AVR32_SPI_CSR1_SCBR_OFFSET | 
13
// langsamer Takt: 66MHz/180 = 366KHz
14
10 << AVR32_SPI_CSR1_DLYBS_OFFSET |
15
// 11 Wartezyklen, nach fall von Cs
16
10 << AVR32_SPI_CSR1_DLYBCT_OFFSET;
17
//10 Wartezyklen zwischen den Transfers
im Code setzte ich die Geschwindigkeit hoch:
1
.
2
.
3
.
4
nav_reset();
5
nav_drive_set(0);
6
nav_partition_mount();
7
AVR32_SPI1.CSR1.scbr = 10; // Beschleunige SPI-Takt
8
.
9
Bytes = sprintf(file_data,"%.4f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %s\r\n", a, b, c, d, e, f, g, h, i, s);
10
write(file,file_data,Bytes);
11
.
12
close(file);
13
AVR32_SPI1.CSR1.scbr = 180;
und wieder zurück, falls die Karte entnommen wird.

von Phil S. (zippi)


Lesenswert?

Hi,

Hab meine eigenen Treiber geschrieben. Meine Karte ist FAT32 formatiert.
Schreiben hab ich noch nicht getestet. Hab mir damals nen Speed 
testprogramm geschrieben.

>AVR32_SPI1.CSR1.scbr = 10;
Mach das auf 4. Das sollte jede SD karte noch schaffen.

>10 << AVR32_SPI_CSR1_DLYBS_OFFSET |
>// 11 Wartezyklen, nach fall von Cs

Ka wie oft CS fällt bei dir. Mach da mal 0 und CS dann via GPIO, kurz 
vor dem trasfare machst du CS auf LOW. Und wenn der Block fertig gelesen 
ist wieder auf High.

>10 << AVR32_SPI_CSR1_DLYBCT_OFFSET;
>//10 Wartezyklen zwischen den Transfers
Da mach auch mal auf 0. Wenn du dazu noch DMA nutzt, dann bringt das 
nochmal ordentlich speed.

Gruß
Zippi

von Cloud (Gast)


Lesenswert?

Hi,

der CS fällt nur wenn die Karte gemounted wird und nachdem
alle Schriebzugriffe fertig sind. Soweit ich weiß, muss die Karte neu 
intialisiert werden, wenn CS einmal auf high gegangen ist!?

>Wenn du dazu noch DMA nutzt, dann bringt das
>nochmal ordentlich speed.

Wie kann man die write-Funktion mit einem DMA-Controller laufen lassen?

Cloud

von Phil S. (zippi)


Lesenswert?

>Wie kann man die write-Funktion mit einem DMA-Controller laufen lassen?

Also die block init ist immernoch gleich, dann bei der schreibe routiene 
wo du die 512byte schreibst, dort musst du den DMA rein machen.

Lies dir mal das Kaptiel im Datenblatt durch. DMA ist eigentlich recht 
simple.

Gruß
Zippi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.