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
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
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
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.
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 :-(
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
Hab grad zwei Schreibfehler entdeckt. "DS" soll natürlich "CS" heißen. Gruß Daniel
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
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!!!
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
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.