Hallo Jungs ich habe folgendes Problem beim ansteuern einer mmc-karte: wenn ich folgenden befehl an meine karte schicke, kommt alles nach wunsch zurück: mmc_commandss(0x51,1,26,0xFF); //command17 read block wenn ich das ganze jedoch so, also etwas komfortabler in eine funktion eingebettet habe, funktioniert´s nicht mehr: mmc_commandss(0x51,(adr>>16),adr,0xFF); //command17 read block nochmal im zusammenhang; char mmc_commandss(char befF,short AdrH,short AdrL,char befH ){ spi0_sendbyte(0xFF); spi0_sendbyte(befF); spi0_sendbyte(AdrH>>8); spi0_sendbyte(AdrH); spi0_sendbyte(AdrL>>8); spi0_sendbyte(AdrL); spi0_sendbyte(befH); spi0_sendbyte(0xFF); return (spi0_sendnget(0xFF)); // Response als Rückgabewert } void mmc_readblock(unsigned long adr,unsigned long length ){ mmc_commandss(0x50,0,length,0xFF); //block size einstellen mmc_commandss(0x51,(adr>>16),adr,0xFF); //block anfordern while(spi0_sendnget(0xFF) != 0xFE); }
16 mal shift right ist ne ganze menge, geteilt durch 64k wenn ich mich gerad nicht irre. Ist addr breit genug dass noch was übrig bleibt? :-) Wie gross sind deine short's? (Also auf dem Compiler, meine ich g) Greetz, /r.
...Und ganz unabhängig davon, auf welchem Zielsystem Du arbeitest (und welche breite dementsprechend short hat), solltest Du Dir im Klaren sein, was es bedeutet, eine vorzeichenbehaftete Zahl zu schieben. Da kommt vermutlich nicht das raus, was Du willst. Schiebeoperationen sind in den meisten Fällen nur bei vorzeichenlosen Werten wirklich sinnvoll, es sei denn, man weiß genau was man tut und auch, dass das Schieben zumindest beim GCC in Zweierkomplement-Darstellung erfolgt, also das Vorzeichenbit berücksichtigt wird. Also entweder lässt Du Dir für die Schieberei was anderes einfallen oder Du bekämpfst Deine Schreibfaulheit und spendierst dem short noch ein unsigned...;-) Es ist übrigens zumindest bei absoluten Adressen i.d.R. sowieso völlig sinnfrei, vorzeichenbehaftete Typen zu verwenden.
ist nicht der default bei compilern für microcontrollern immer der unsigned? Oder kocht da auch jeder sein eigenes süppchen? Ok, ich leg das auch grundsätzlich fest, wenn es gebraucht wird, und verlass mich nicht auf ndefaults, aber ... Beim gcc weiss ich's gerade nicht, beim Keil (ARM) compiler kann man das extra einschalten: "[ ] Plain char is signed". Greetz, /r.
Random ... wrote: > ist nicht der default bei compilern für microcontrollern immer der > unsigned? Oder kocht da auch jeder sein eigenes süppchen? Was für ein default, der für "short"? Das ist immer signed, sonst müsste unsigned short stehen. > Beim gcc weiss ich's gerade nicht, beim Keil (ARM) compiler kann man das > extra einschalten: "[ ] Plain char is signed". Ach über "char" redest du. Der default ist compilerabhängig, bei den meisten Compilern kann man es umschalten, und ein portables Programm muss die drei Typen "char", "signed char" und "unsigned char" streng auseinander halten, da sie nicht portabel zueinander kompatibel sind. Aber da stand "short" oben.
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.