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
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
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.
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.