Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   121 / 177
(#) csatti2 válasza don_peter hozzászólására (») Máj 17, 2018 /
 
Ezt próbáld meg megnövelni (sdcard.c):
  1. #define SDIO_TRANSFER_CLK_DIV              ((uint8_t)0x1)

Nálam annak idején STM32F103 esetén az írás csak 0x10 környékén volt stabil. Lehet csak annyi a probléma, hogy az SD kártyád nem bírja tartani a tempót.
(#) don_peter válasza kapu48 hozzászólására (») Máj 17, 2018 /
 
A doksi amit küldtél STMCubeMX-et használ, azzal megint csak bajba leszek..
Full átláthatatlan a számomra.. Még... Kicsit tán ijesztő is, amit generál.

A legutóbbi kód amit linkeltél, a FatFs-es, az tök jó és átlátható mert sima SPL-t használ, semmi extrát. Ezzel már eljutottam odáig, hogy beolvasás, listázás és fájl létrehozás működik.
Az a része nem működik, (szerintem csak én bénázok) amely beír a létrehozott fájlba. (f_write()), kérdés miért? Lehet én nem jól használom, vagy lehet hibás ez a rész?

Így próbálkozom:
  1. FRESULT res;
  2.   FILINFO finfo;
  3.   FIL file;
  4.   UINT bytes_written;
  5.   DIR dirs;
  6.   char path[16]={""};
  7.  
  8. f_mount(0, &fs);
  9.   res = f_opendir(&dirs, path);
  10.   //res = f_readdir(&dirs, &finfo);
  11.   res = f_open(&file, "teszt.bin", FA_CREATE_ALWAYS | FA_WRITE);
  12.  
  13.     char SzBuff[] = "Ez egy másik file, pontosabban a teszt.bin fájl.";
  14.     res = f_write(&file, SzBuff, sizeof(SzBuff), &bytes_written);
  15. f_close(&file);
  16.   f_mount(NULL, &fs);

Lehet csak én nem veszek észre valamit és ezért nem működik...
(#) don_peter válasza csatti2 hozzászólására (») Máj 17, 2018 /
 
  1. res = validate(fp->fs, fp->id);                                 /* Check validity of the object */
Erre fut rá és : FR_INVALID_OBJECT
A meghívást feljebb látod, paraméterek szerintem jók, de lehet pont ott nem veszek észre valamit.

Növeltem rajta, sajna ráfut a hibára...
A hozzászólás módosítva: Máj 17, 2018
(#) kapu48 válasza don_peter hozzászólására (») Máj 17, 2018 /
 
Az pedig eredetileg device: F407IG, át kel állítani F407ze-re
(#) csatti2 válasza don_peter hozzászólására (») Máj 17, 2018 /
 
Próbáld meg így elnevezni a fájlt: "/teszt.bin"
(#) kapu48 válasza don_peter hozzászólására (») Máj 18, 2018 /
 
Van ez a kapcsoló az ffconf.h-ban:
  1. #define _USE_STRFUNC    0       /* 0, 1 or 2 */
  2. /* To enable string functions, set _USE_STRFUNC to 1 or 2.
  3.   A szövegfunkciók engedélyezéséhez állítsa a _USE_STRFUNC értéket 1-re vagy 2-re.     */


1 próbát megér!
(#) kapu48 válasza kapu48 hozzászólására (») Máj 18, 2018 /
 
És ezt is javítani kel:
  1. //   936  - Simplified Chinese GBK (DBCS, OEM, Windows)
  2. //#define _CODE_PAGE    936  <<<<<<<<<<<???
  3.  
  4. // 850  - Multilingual Latin 1 (OEM)
  5. //   858  - Multilingual Latin 1 + Euro (OEM)
  6. #define _CODE_PAGE      858
(#) don_peter válasza csatti2 hozzászólására (») Máj 18, 2018 /
 
Sajnos nem hozott eredményt, továbbra is FR_INVALID_OBJECT-re fut.
(#) don_peter válasza kapu48 hozzászólására (») Máj 18, 2018 /
 
Termesztésen a projekt, amit létrehoztam alapból a megfelelő kontrollerre van állítva, független, hogy eredetileg a kód min volt.

Fentebb írt javaslatok alapján állítgattam a definíciókat, de sajnos sikereteken eredményt hozott, mindegyik.
A nyelv választásnál meg is hagytam a 858-asat.

Egyelőre tanácstalan vagyok, hogy mi lehet a hiba és miért fut minden aklommal erre a fránya FR_INVALID_OBJECT-re.
Dobtam fel két képet is, hogy mi van ilyenkor a file adat struktúrában.
Én arra tippelek, hogy nem megfelelő adatok vannak a struktúrában.
A hozzászólás módosítva: Máj 18, 2018
(#) don_peter válasza don_peter hozzászólására (») Máj 18, 2018 /
 
Közben annyira még rájöttem, hogy nem volt globális a struktúra azért nem tudta átadni egymásnak a függvény az adatokat. De ettől független még mindig nem jó, de már kicsivel tovább tud menni. Keresgélem a hibát tovább, előbb utóbb meglesz..
(#) Attis92 válasza don_peter hozzászólására (») Máj 18, 2018 /
 
Szia!

Nem akarok belekontárkodni a beszélgetésbe, de a debug kép alapján azért bukik a dolog, mert az ID-k nem stimmelnek!
Ha ezt észrevetted akkor vedd tárgytalannak, amit írtam!
  1. /*-----------------------------------------------------------------------*/
  2. /* Check if the file/dir object is valid or not                          */
  3. /*-----------------------------------------------------------------------*/
  4.  
  5. static
  6. FRESULT validate (      /* FR_OK(0): The object is valid, !=0: Invalid */
  7.         FATFS *fs,              /* Pointer to the file system object */
  8.         WORD id                 /* Member id of the target object to be checked */
  9. )
  10. {
  11.         if (!fs || !fs->fs_type || fs->id != id)
  12.                 return FR_INVALID_OBJECT;
  13.         ENTER_FF(fs);           /* Lock file system */
  14.         if (disk_status(fs->drive) & STA_NOINIT)
  15.                 return FR_NOT_READY;
  16.         return FR_OK;
  17. }


Itt neked az id=2, de az fs->id = 57853.

Valahol a fájlok "owner"-ei akadnak össze szerintem.
(#) don_peter válasza Attis92 hozzászólására (») Máj 18, 2018 /
 
Igen, erre írtam, hogy nem volt globális a fájl információ.
Mindjárt teszek fel egy teszt projektet, abban lehetne kotorászni, hogy mi a bibi.
(#) kapu48 válasza don_peter hozzászólására (») Máj 18, 2018 /
 
Ezt meg kel hivni:

disk_initialize(0); // Majd ez fogja meghívni a: SD_GetCardInfo(&SDCardInfo);
Ami lekérdezi a kártya adatait, hogy később tudjad mit használsz. És nem melékesen elvégez több hibaellenőrzést.
(#) don_peter válasza kapu48 hozzászólására (») Máj 18, 2018 /
 
No készítettem egy teszt projektet: Bővebben: Link
Ha lenne időtök és megnéznétek azt megköszönném.
esetleg ha ki tudjátok próbálni az jó lenne.
Olvasás működik, fájl létrehozás is, de a fájlba írás nem..
Előre is köszi..

ui: A programban idáig eljutottam: f_write()
  1. if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR);
Itt sajnos FR_DISK_ERR-el kilép, milvel clst-ben 0xFFFFFFFF van. (ebben tárolja a claster-t)
Még midig valahol elcsúsznak az adatok.
A hozzászólás módosítva: Máj 18, 2018
(#) don_peter válasza kapu48 hozzászólására (») Máj 18, 2018 /
 
Igen, e nélkül szerintem az olvasás sem működne, sőt, semmi.
Ez benne van a kódban.
Feltettem egy teszt projektet, kukkants bele, hátha észreveszed a hibát.
Előre is köszi.
(#) kapu48 válasza don_peter hozzászólására (») Máj 18, 2018 /
 
Már írtam, hogy részemről tárgytan az általad használ IAR IDE!

Mivel a demó változata csak 30 napos, annyi idő alatt még megtanulni sem lehet a használatát.
(Ezért is nem jelentkezhetett eddig senki hozzáértő!)

(#) don_peter válasza kapu48 hozzászólására (») Máj 18, 2018 /
 
Én nem is erre gondoltam, de mivel én is tudtam a semmiből ismeretlen implementálni IAR környezet alá, gondolom ez nem lehet probléma egy nem kezdőnek, hogy implementálja a saját, kipróbált és rutinosan használt környezete alá.
Ha nincs is környezet, még mindig ott a kód, és az nem demo, hogy ne lehessen nézegetni.
De elfogadom, hogy nem akarsz vele kínlódni, de hátha akad erre felé majd valaki, aki meg tudja nézni.. Én meg persze addig is elvagyok vele, keresgetem a hibát.
A hozzászólás módosítva: Máj 18, 2018
(#) kapu48 válasza don_peter hozzászólására (») Máj 19, 2018 /
 
Ez nem így működik, hogy csak te szeretnél segítséget kapni!
Segíts, hogy segítsenek!

Kértem, hogy Atolic-ben fejlesz, mert az ingyenes!
És az eredményt én is hasznosíthatnám.

(#) kapu48 válasza don_peter hozzászólására (») Máj 19, 2018 /
 
Különben időközben kiderült, hogy a távol keleti betűkészletek használatára van kiélezve ez a project.
És ennek a megszüntetése túl sok munkával járna, ezért kerestem mást.

Van STM32F4DISCOVERI + BB készletem. Azon van működő kipróbált SD Fat program.
Csak átkel alakítani F407vg-ről, F407zet-re. És azon a boardon máshól vannak az egyéb HW-k is.
(#) Istvanpisti válasza don_peter hozzászólására (») Máj 19, 2018 1 /
 
Szia!
Én használom Chan, SD kártya kezelő programját, igaz 8 bites kontrollerrel. Azt gondolom, hogy ha az inicializálás, olvasás megy, akkor nagy probléma nem lehet.
néhány ötlet:
A fejlesztések közben elő szokott fordulni, hogy nem sikerül jól lezárni a fájlokat, jól kilépni a rendszerből, ekkor a PC szoktam formattálni az SD-t.
Én a 852-es kódlapot használom, nem a 858-ast, igaz nem használok ékezetes betűket, Te is kipróbálhatnád ékezetes nélkül.
Nem tudom, hogy a
  1. char SzBuff[] = "Ez egy másik file, pontosabban a teszt.bin fájl.";

a karaktertömb végére kerül-e lezáró nulla, egy próbát megérne, hogy a végére tegyél egy "\0"-t.
A hozzászólás módosítva: Máj 19, 2018
(#) don_peter válasza kapu48 hozzászólására (») Máj 19, 2018 /
 
Tehát feltételezhető, hogy kipróbáltad és próbáltad használni.
Neked működött rendesen? Meddig jutottál el vele?
Mely részét tesztelted ki, mielőtt dobtad?
(#) don_peter válasza Istvanpisti hozzászólására (») Máj 19, 2018 /
 
Sajnos, 852-es kódlappal, ékezetek nélküli bejegyzéssel, és lezáró karakterrel sem jó.
Esetleg elkérhetem a te kódodat, vagy ki tudnád próbálni ezt amit én használok?
Csak a FatFs fájlokra gondolok, ott nincs specifikus dolog.

Amúgy addig eljutottam, hogy már aláfutásra hivatkozva hiúsul meg az írás.
Szerintem sincs itt nagy gond, főként mert minden más működik és a fájlt is létre tudja, hozni.. Az más kérdés, hogy nem tudja befejezni..
ui: még arra gyanakodom, amit említett kapu48, hogy ez a kód 411-re volt optimalizálva, én meg 407-en használnám. Bár akkor meg felvetődik a kérdés, hogy a többi, hogy a pékben mehet hibátlanul..
A hozzászólás módosítva: Máj 19, 2018

underrun.PNG
    
(#) Istvanpisti válasza don_peter hozzászólására (») Máj 19, 2018 /
 
Nálam is ugyanez a verziójú ff.c, és ff.h fájlok vannak, mint nálad, csak az alacsony szintű kártya rutinok másak, mivel én SPI-ben használom, mert a 8 bites kontroller nem támogatja az SDIO 4 bites kommunikációt.
Egyébként én az SD használatát az f_mount-tal kezdem, nem kell előtte a disk_initialize, mert az, az ff.c-ben meghívódik, ahol kell. utána ugyanúgy használom, ahogy Te.
  1. f_mount(0,&Fatfs);
  2. res=f_open(File1, fn_Buff, FA_CREATE_ALWAYS | FA_WRITE);
  3. f_write(File1,Buff,strlen(Buff),&rb);
  4. f_close(File1);

Néztem a diskio.c fájlodat és ott a get_fattime() rutin elég érdekes, mert nem fut le az idő és dátum DWORD-be való összerakása, az #if 0 miatt, csak 0-át ad vissza. Azt nem tudom, hogy ez befolyásolja-e a működést, de ezt a rutint meghívja mind az f_open, ha FA_CREATE_ALWAYS paraméterrel hívod meg, illetve az f_close() is.
Nálam ez így néz ki:
  1. DWORD get_fattime (void)
  2. {
  3.         return    ((DWORD)(year - 1980) << 25)
  4.                         | ((DWORD)month << 21)
  5.                         | ((DWORD)day << 16)
  6.                         | ((DWORD)hour << 11)
  7.                         | ((DWORD)min << 5)
  8.                         | ((DWORD)sec << 1);   
  9. }


Itt van Chan honlapja:Bővebben: Link, ahol részletesen leírás található a működésről, bár már az R0.13b verzió fut.
És itt van egy innen elérhető link, Bővebben: Link, ahol Tilen Majerle STM32F4-re átírt verziója található, ami SPI-re és SDIO módra is tartalmaz kódot, hátha ez segít.
(#) don_peter válasza Istvanpisti hozzászólására (») Máj 20, 2018 /
 
Köszi, de sajnos nem oldotta meg a problémát.
Tegnap már azt hittem meg lesz a hiba, de sajna tévedtem.
Beraktam egy másik kártyát és egyszer hibátlan lefutott a program, majd másodjára már nem és mikor megnéztem PC-ben a memkarit nem volt meg a file.
Szóval még midig problémás a dolog..
(#) don_peter válasza don_peter hozzászólására (») Máj 22, 2018 /
 
Annyira megint csak rájöttem, hogy a FAT kezeléssel lesz valami gondja a programnak.
Sajna nem hardveres, inkább szoftveres hiba van...
Az első képen a FAT tábla bejegyzései látszanak.
Win-ben felmásoltam egy fájlt, ami pontosan 1MB, az látszik is illetve a FAT bejegyzései mutatják, hogy helyes az adat. (128 szó lefoglalva)
Majd a többi fájl helyére nem került FAT bejegyzés.

sd_root képen az látszik, hogy az ecco.md fájlom típusa 0x20-as vagy is fájl, a többi bejegyzésnél, mivel nem történik lezárás nem tudja megadni a típusát és elhelyezkedését a fatáblában.

Az utolsó sd_bejegyzes-es képen pedig az látszik, hogy ha kézzel segítem végig debug módban, akkor a megfelelő klaszteren belül a megfelelő szektorba beírja a szöveget.
Majd sajnos a file lezárást is, segíteni kell, hogy teljes legyen a fájl.
Egyértelműen programhiba lesz, nem hiszem, hogy itt bármilyen beállítás vagy egyéb hardveres piszkálás segítene.
Sanszos, hogy a fájl írását és FAT tábla kezelését újra kellene írnom, vagy legalább is megpatkolni a mostani hibásan működő kódot. Pazar....
Kicsit szomorú vagyok, mert jól átlátható ez a program, de a sok struktúra miatt elég necces lesz ezt megpatkolni, lehet egy másikat kellene inkább keresni.
(#) killbill válasza don_peter hozzászólására (») Máj 22, 2018 /
 
Mi a bajod a bekarikazott nullakkal? Azok szabalyos file-ok, csak nem "Archive"-ok. Mindegyik 0 byte hosszu.
(#) don_peter válasza killbill hozzászólására (») Máj 22, 2018 /
 
Az a baj, hogy nem fejeződik be, vagy is nem zárja le a fájlokat. Más nem..
(#) killbill válasza don_peter hozzászólására (») Máj 22, 2018 /
 
Ok, ezt ertem. Csak azt irtad, hogy "... fájlom típusa 0x20-as vagy is fájl", es erre mondtam neked, hogy nem attol file, hogy 0x20 az attributum byte. Akkor is file, ha az 0x00. De akkor is, ha 3 vagy akar 7, de lehet 0x21 is. A 0x20 bit az Archive bit, es igazabol semmi haszna vagy jelentese nincs. A 0x01 a Read Only, a 0x02 a Hidden file, 0x04 a System file, 0x08 a Volume Label, 0x10 a directory. A 0x0f-nek specialis jelentese van, azt a hosszu fileneveknel lathatod.
Az archive bitet az MS termekek beallitjak, de nem kotelezo. Lehet, hogy a te sw-ed akkor sem fogja beallitani, ha egyebkent redesen ir a kartyara. Az en sajat FAT konyvtaram sem allitja be a 0x20 bitet soha.
A hozzászólás módosítva: Máj 22, 2018
(#) Istvanpisti válasza don_peter hozzászólására (») Máj 22, 2018 /
 
Az általad és az én általam is használt verzió a 0.07e, ami 2009-es. Nem biztos, hogy patkolni kell, létezik már 0.13-as verzió is, az 2018-as.
Én a helyedben kipróbálnám, a get_fattime() funkciót úgy meghívni, hogy az előző hozzászólásomban lévő változókat definiálod és fix értékekkel feltöltöd. pl. year=2018, month=5,..., talán egy próbát megérne.
Azt gondolom, hogy a file lezárással lesz a hiba.
(#) don_peter válasza Istvanpisti hozzászólására (») Máj 23, 2018 /
 
Már úgy megy, tehát a get_fattime() már olyan mint amit mutattál, csak fixen, nincs változó.
Sajnos már a nyitásnál van hiba, mivel már akkor át kellene adni a file struktúrának, hogy mely cluster az aktuális amely még szabad és abba teheti a megnyitott fájlt.
Ezek a változók mindig uresek, tehát nullásak és emiatt fut mindig hibára az írás, majd a zárás.
Ezt egyesével kitököltem debugban.
Következő: »»   121 / 177
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem