Forum: Projekte & Code MMC-FAT32-VS1001


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von john (Gast)


Angehängte Dateien:

Lesenswert?

HI,

habe da was gebastelte :
  Mobile Mp3 Player V1 RC2 (c) 2003-2004 john{at}phrozen.org ;)
  GNU General Public License.

**Ist Stand
gemacht für mega8 bzw. mega8515, geht aber auch mit allen anderen
megas. dann braucht man noch einen vs1001 und eine MMC plus sockel bzw
isa sockel einen 74hc08 plus knöpfe, rcl...

die firmware ist in c geschrieben, gut kommentiert und relativ modular
aufgebaut. es werden MMC und SD karten im SPI mode unterstützt. ich
habe eine Sandisk 64.mit anderen karten habe ich noch nicht getestet.
als filesystem benutze ich fat32.

die fat32, MMC, fileI/(O) layer kann man nartürlich noch für andere
sachen verwenden.

die fio api besteht aus folgen befehlen :
  bool fopen(u08 *filename, u08 mode, FILE *stream);
  bool fopenc(u08 count, u08 mode, u08* mask, FILE *stream);
  void fclose(FILE *stream);
  bool feof(FILE *stream);
  bool fisopen(FILE *stream);
  bool fplay_sector(FILE *stream);
  u08* fget(FILE *stream, u16 size);
  bool fseek(FILE *stream, u16 posh, u16 posl, u08 whence);
  void fid3tag(FILE *stream);
  bool dir_enter(u08 *dirname, DIR *dir);
  bool dir_leave(DIR *dir);
  void dir_list(DIR *dir);
  void dir_root(DIR *dir);
write support habe ich schon so halb wegs laufen, auf einem mega16.
aber das kommt später. näheres steht in fat.c

mit den folgenden 8 zeilen code kann man ein id3 tag lesen und dann die
mp3 abspielen ;)
1  MMC_hw_init();
2  spi_init();
3  MMC_init();
4  FAT_startup();
5  fopenc(0, 'r',"*       MP3", &fp);
6  fid3tag(&fp);
7  while(fplay_sector(&fp)){};
8  fclose(&fp);

als bedienung hat mal 6 knöpfe
  * lauter
  * leiser
  * vor
  * zurück
  * play/stop
  * powerdown (zusammen mit leiser ca. 4 sec)
und
  * Play Led
  * Start up / powerdown led

ich würde gerne noch lcd, playlisten und lange datei namen einbauen,
aber dafür reicht der platz nicht --> ;)
text    data     bss     dec     hex filename
7954      80     116    8150    1fd6 alp_mp3.out

die fseek funktion ist noch sehr lahm. für eine 4MB datei braucht sie
ca.7 sec um das ende zu finden. mit einem 512(den der code mit write
support hat) geht es aber etwas schneller mit ca. 3sec.

als spannung braucht das ganze 3,3v

für rs232 benutze ich einen max3232 mit 1uF tantal perlen
angeschlossen wird alles so :
  BTN_VOL_DOWN    PA0
  BTN_VOL_UP      PA1
  BTN_SONG_DOWN    PA2
  BTN_SONG_UP      PA3
  BTN_PLAY      PA4
  LED_PLAY_PIN    PA6
  LED_START_PIN    PA7
  PIN_MMC_CS       PB1
  PIN_MMC_ALLOW_SCI   PB0
  PIN_VS1001_CS    PC0
  PIN_VS1001_DREQ    PC1
  PIN_VS1001_BSYNC   PC2
  PIN_VS1001_RESET  PC3
  + die spi pins

** Zukunfts planungen
ich werde die angehängte schematic auf jedenfall in ein board
verwandeln. es gibt mehrere Optionen.
  * 1 board mit (mega8||mega8515)&&(vs&&MMC)
  * 2 boards mit (mega8||mega8515)+(vs&&MMC)
ideen, vorschläge, meinungen ?

ich habe eine ÄTZGERÄT 1 ;) von reichelt, welches ich innig liebe, aber
die platinen werde ich wahrscheinlich machen lassen. wenn man 2 platinen
macht, ist es zwar austaschbar aber man braucht dann noch kabel. hmm...

ich fange jetzt an die 16k(evtl. 32k) version zu basteln. die hat dann
auch usb, fat write, easy tcp/ip, cf/IDE  das geht auch schon alles so
halbwegs ;)

das mega16 board hat zur Zeit einen ftdi245bm. aber ich würde lieber
den pdiusbd12 benutzen, der in meiem regal liegt. aber ich habe noch
nicht so die gute docu gefunden, die ich brauche. kennt jemand was ?

dann wird da noch ein display ran kommen. hat jemand gute erfahrungen
mit bestimmten farb diaplays gemacht ? mein nokia 3310 ist nur s/w und
gebraten habe ich es auch, aus versehen.

dann noch ein ganz wichtiger punkt :
ich habe keine ahnung von akkus und laden davon. hat jemand gute docu,
links ? mir schwebt vor das man alte handy akkus über usb landen
könnte. ? docu??

meine seite (phrozen.org) ist leider noch nicht up to date. da ist aber
noch ein bild und die schaltung für mega8 damit die firmware auf mega8
läuft muss man noch die PIN defines anpassen.

john{at}phrozen.org

von Stefan Seegel (Gast)


Lesenswert?

Hallo!

Danke für den Code/Schaltplan, sehr interessant. Muss auch nen MP3
Player bauen. Ein paar Fragen zu dem Schaltplan:

-Warum ist die MOSI Leitung zur MMC durch ein AND Gatter schaltbar ?
-Warum sind in den ganzen SPI Leitungen Serienwiderstände ?
-In den meisten Playern die ich bisher gesehen habe wird ein externes
SRAM verwendet. Warum ist hier keiner drin ? Ergeben sich dadurch
irgendwelche Nachteile ?
-Bis zu welcher Bitrate kann diese Schaltung abspielen ? (Auch VBR?)

Vielen Dank schonmal für Info!

Stefan

von Daniel R. (daniel_r)


Lesenswert?

Hallo John,

ich bin auch gerade dabei einen mp3-Player zu bauen.
In einem anderen Thread hast Du mich auf deine Lösung des Problems mit
dem gemeinsamen SPI-Bus aufmerksam gemacht. Du hast dieses Problem ja
bekanntlich mit einem UND-Gatter am MOSI zur MMC gelöst, damit beim
Senden der Daten an den Decoder die Karte nicht wieder ihre eigenen
Daten bekommt.

Diese Lösung habe ich in meinem Player übernommen.
Leider besteht jetzt das Problem, dass das UND-Gatter irgendwie die MMC
beeinflusst:
Wenn ich den ersten Block der Daten lese(dabei vor dem Einlesen und
Senden der Daten das UND-Gatter auf Low ziehe, sodass die MMC nur noch
0x00 kriegt) bekomme ich die Daten auch. Wenn ich den nächsten Block
lesen will(erst das UND-Gatter wieder auf high, Befehl senden und vor
dem Einlesen der Daten das UND-Gatter wieder auf Low) bekomme ich von
der Karte als Antwort 0x05 anstatt 0x00 zurück.
Lasse ich das UND-Gatter immer auf High, bekomme ich die richtige
Antwort und die richtigen Daten zurück.

Dies kann aber IMHO zweierlei bedeuten(?):
1.Im Fall, dass das 0x05 die normale Antwort ist, bedeutet das, dass
die Karte im Idle State ist und dass der Befehl ungültig war.
Die Karte wurde aber korrekt initialisiert...

2. Im Fall, dass das 0x05 ein Error-Token ist, bedeutet das "Error"
und "Card ECC failed".


Gab es bei Dir ähnliche Probleme oder lief alles problemlos?

Was könnte das sein?
Ich habe leider kein ausreichend gutes Oszilloskop zur Hand um sagen zu
können, was sich da abspielt.

Gruß

Daniel

von Lupin (Gast)


Lesenswert?

haben die VS decoder kein CS? Man wählt doch eigentlich immer das device
welches man ansprechen will über einen CS pin an und wenn es abgewählt
ist wird das gesendete ignoriert. Dazu braucht man doch kein AND
gatter.

von Nik Bamert (Gast)


Lesenswert?

Also bei meinem Player habe ich auch keins verwendet uns es geht
trotzdem, liegt aber warscheinlich an meiner Karte :-)
Der VS akzeptiert je nach dem auf dem , wie Cs gesetzt ist auf dem
einen oder anderen Bus Daten, 'deaktivieren' kann man ihn in diesem
Sinne nicht :-(

von Daniel R. (daniel_r)


Lesenswert?

Na gut, man kann den Kommandobus des VS1001 mit DS steuern, der Datenbus
ist aber immer aktiv. Diesen "steuere" ich aber trotzdem:
Wenn ich ihn nicht ansprechen will, sondern die MMC, dann deaktiviere
ich dessen Kommandobus(DS auf high) und generiere einfach keinen BSYNC,
den er normal braucht.
Wenn ich ihn ansprechen will(also Daten senden, keine Kommandos) dann
sende ich die Daten einfach und generiere den BSYNC, damit er die Daten
annimmt. Der Decoder läuft ja auch schon. Das ist nicht das Problem.

Um Zeit zu sparen möchte ich(so wie John es gemacht hat)die Daten von
der MMC holen, wenn der Decoder welche benötigt und dann gleichzeitig
an den Decoder senden. D.h. ich warte bis der Decoder Daten will, dann
sende ich der MMC das Commando zum Lesen eines Blocks und warte auf das
Startbyte. Wenn es kommt lese ich ein Byte ein und gleich danach das
Nächste, indem ich das erste eingelesene Byte wieder an den Decoder
raussende und gleichzeitig dessen BSYNC generiere.
Und das UND-Gatter soll verhindern, dass die MMC wieder ihre eigenen
Daten auf dem MOSI-Pin bekommt. Indem ich einen Eingang des UNDs auf
low ziehe kommt an der MMC dann ja nur noch 0x00 an, während sie am
anderen Ende ihre Daten rausschickt.

Kann es vielleicht sein, dass die MMC unbedingt FF braucht anstatt 00,
oder sendet die auch ihre Daten korrekt, wenn ich ihr 00 schicke?


@Nik
Hast Du deine Hardware eigentlich selbst entworfen oder schon
bestehende Shematics verwendet??


Gruß

Daniel

von Daniel R. (daniel_r)


Lesenswert?

Hab grad zwei Schreibfehler entdeckt.
"DS" soll natürlich "CS" heißen.

Gruß

Daniel

von john (Gast)


Lesenswert?

Also... es gibt einen befehl für die MMC die das abbrechen der
übertragung hervor ruft. In einem von 1000000 fällen kann es sein, das
die mp3 datei den befehl als daten enthält.
das gatter ist in fast allen fällen überflüssig, aber bei ca 30cent
kann es ja nicht schaden

btw, zu dem player gibt es mittlerweile eine homepage :
http://alpmp3.sourceforge.net/

platinen kann ich auch liefern,
www.phrozen.biz

gruss,
John

von Daniel R. (daniel_r)


Lesenswert?

Ich habe jetzt festgestellt, dass meine Karte unbedingt FF anstatt 00
als Dummy-Bytes haben will.
Deshalb will ich jetzt ein OR-Gatter benutzen. Damit dürfte es
gehen...

Schöne HP haste!!!

von Daniel N. (bipak)


Lesenswert?

Hi hab da grad durch Zufall in der spi.c nen Schreibfehler entdeckt.
Dort steht bei ATMEGA8:
cbi(DDRB,PB5);
sbi(DDRB,PB5);

Soll sicher

cbi(DDRB,PB4);
sbi(DDRB,PB5);

heissen ;)


Gruß,
Daniel

von Daniel R. (daniel_r)


Lesenswert?

@Clinicus

Hi,

hab Deine Nachricht zu diesem Thema bekommen, kann Dir aber nicht 
antworten, weil ich Deinen Benutzernamen im Forum nirgends finde.

Ich konnte das Problem lösen. Leider weiß ich nicht mehr ganz genau, was 
es war, aber ich glaube, dass es daran lag, dass die Karte unbedingt 
0xFF anstatt 0x00 als "Durchschieb-Bytes" haben will. Dazu habe ich 
anstatt dem AND-Gatter ein Oder verwendet, dessen einen Eingang ich beim 
durchschieben auf high ziehe, sodass immer 0xFF anliegt.

Daniel

von Johannes (menschenskind)


Lesenswert?

Die Frage von Stefan(2. Post) würde mich aber auch interessieren: Warum 
sind da Widerstände an den SPI-Leitungen?

Dankesehr

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.