Fórum témák
» Több friss téma |
Nem foglalkoztam vele, de valami doksikat begyűjtöttem. Ha gondolod, átküldhetem őket.
GMAIL-re jöhetne, köszönöm!
![]()
Hát találtam egy ilyen kódot, szerintem ez kell nekem.
Az a baj, hogy az init-nél a NAND_BuildLUT(0) visszatérésnél HardFault történik. Tehát az NAND_Init hívja meg a NAND_BuildLUT(0), és el is jut a return NAND_OK;-ig, de már nem érkezik vissza a NAND_init-be.
Véleményetek szerint probléma lehet e hogy az SD kártyára nem tettem felhúzó ellenállásokat, hanem az LPC1788 sajátjait használom.
Annak ellenére vagyok bizonytalan, hogy az CMD55/ACMD41 páros produkál értékelhető eredményeket (igaz utána már nem reagál CMD2, CMD3-ra).
Idézet: „Véleményetek szerint probléma lehet e hogy az SD kártyára nem tettem felhúzó ellenállásokat, hanem az LPC1788 sajátjait használom.” Én az ilyen megoldást mindig kerülöm. Ugyanis amikor az LPC resetben van, akkor azok az ellenállások nem feltétlenül (vagy leginkább nem) fognak működni. Viszont ekkor az SD kártya random hülyeségeket értelmezhet parancsként a vonalakon levő zavarokból. Ha hosszú (mondjuk 1-2 centinél hosszabb) a vezeték, akkor a soros ellenállások is nagyon kellenének a kimenetekre. Idézet: Miert ne mukodnenek? Ez a reset allapotuk.„Ugyanis amikor az LPC resetben van, akkor azok az ellenállások nem feltétlenül (vagy leginkább nem) fognak működni.” Ettol fuggetlenul, ha az SD tapjat ki-/bekapcsolgatja a HW, akkor erdemesebb kulso ellenallasokat hasznalni, es persze azokat a kapcsolt tapra tenni. Vagy a belso felhuzokat kell kikapcsolni, amikor a kartya nem kap tapot. Viszont, ha kapcsolt tapja van a kartyanak, akkor igen jo, ha van egy ellenallas a tapon is, hogy kikapcsolt tapnal tenyleg lemenjen 0V-ra a kartya VCC-je.
Én sokféle mikrokontrollerrel játszottam már, de aminél ezt konkrétan megnéztem, annál mindnél az volt, hogy az összes konfigurálható I/O lábát elengedi (bemenet, fel/lehúzó ellenállás nélkül), amíg a reset láb alacsony állapotban van. Ha 1 percig tartom alacsony állapotban, akkor 1 percig lógnak a levegőben a lábak. Az LPC a doksija szerint reset után bekapcsolja a felhúzó ellenállásokat, de hogy reset alatt mi lesz, azt nem találtam meg leírva, tesztelni meg nem teszteltem.
Aggaszto, amit irsz. Meg nem talalkoztam ilyennel, pedig en is lattam mar par uC-t. Mondjuk az AVR-ek nem kapcsoljak be maguktol (reset felfutasa utan sem) a pull-up-ot, ott ertheto az altalad irt jelenseg. Megmertem egy LPC1113-mat. Veletlen egybeeses, de azon a panelon, amin mertem kb. 40us alatt megy fel a tap nullarol 3.3V-ra, es ugyanebben az idopontban ugrik fel a kimenet is 3.3V-ra. A RESET kb. 1V tapnal lemegy L-be (MCP130) es hosszu milliszekundumokig ugy is van. Megmertem ugy is,hogy a RESET fixen foldon volt, ugyanaz az eredmeny. Aztan tettem egy kulso 2.2k-t a mert kimenet es a 3.3V koze, igy a kimenet egyutt megy a tappal. Szoval ugy nez ki, hogy bekapcsolja a felhuzokat, csak kis kesessel. Szentul hittem, hogy ez belul aszinkron dolog, de ezekszerint nem.
A külső ellenállásoknak megterveztem a helyét 1206, csak még nem vettem meg. Most akarok rendelni egy pakkot a HESTORE-ból hogy legyen minden értékből rendesen. Nem kapcsolgatom a tápot, mert fölösleges az adott applikációban. A távolság az MCU-tól kb 3cm, nem vészes.
Közben megdumáltam egy haverral, ha a CMD55/ACMD41-re ad értékelhető választ a kártya akkor hardveresen rendben van. Addig jutottam hogy Az ACMD41-Send Application Operation Enviroment után (ami a kártyára alkalmazható tápfeszt adja esetemben 0x00FF8000 azaz 2.7-3.6V), a CMD2 már úgy megy ki hogy a visszajelzés Command Time Out. Ez az lenne hogy a kártya küldje már el a CID-t. Ezt már nem kapom meg... A net tele van az init-el. SPI módban. Persze tudom hogy egyszerűbb az SPI mód, de nekem nagyon sokat kellene a kártyát olvasni, csupán 32Mx32 az SDRAM-om, és nem férne bele minden BMP. Szóval egyenlőre küzdök.
En ugy hasznaltam SD kartyat LPC-n, hogy az init 1 bites modban indul, 400kHz clock-kal. Ha lement az ACMD41, van utana egy CMD2 es egy CMD3 (meg nem mondom, hogy mit csinalnak, mar nagyon regen irtam), majd utana van egy CMD7, ez egy select card, es csak ezt kovetoen allitom az orajelet 18MHz-re (nekem ennyi volt a max.) es utana kapcsolom az MCI-t 4 bites modba. Van itt egy darab kod, ami nekem szepen mukodik, hatha latsz benne valamit.
A hozzászólás módosítva: Okt 14, 2013
A 400kHz az nálam is rendben van mert a 60MHz PCLK-ból számolja magának és nagyon rendben van. Természetesen 1bit-esként (reset alapértelmezett) kezdek neki ezeket a nagyon alap dolgokat már átolvastam, a nagyon alapokkal tisztában vagyok, legalábbis úgy gondolom.
Köszönöm a kódot, most azonnal kipróbálom. Ugye nem CMSIS? ![]()
Szerintem tartozik hozzá egy H file is, mert egy csomó sorra hibát ír ki hogy UNDEFINED, szóval valahol máshol volt valaha DEFINED
![]()
Ehhez eleg sok .h file tartozik még. De nem is az a cel, hogy ezt egy az egyben leforditsd, hanem az, hogy lasd, hogy mi az init menete. Nem oldom meg a problemadat, csak probalok segiteni. A logikai lepesek a lenyegesek, nem a header-ek.
Ezen rész miatt akad már csak el a fordítás:
Ezt a részét meg C-Keil szintaktikailag nem értem:
A függvény amiben szerepel van egy bemenő változója ami a LONGRESPONSE-ra utal. Szóval ez az utolsó kis részlet programozástechnikailag mit csinál?
Az
ekvivalens azzal, hogy
Idézet: Ez K&R szintaktika „Ezt a részét meg C-Keil szintaktikailag nem értem:
![]() Annyit csinal, hogy a fuggvenynek megmondod, hogy long response-t varsz a kartyatol vagy nem, es ennek megfeleloen allitja be a command regisztert. A fuggvenyben van egy BX_SemaGet() hivas, ami egy kernel hivas, es egy szemaforra var. A szemafort az MCI interrupt kiszolgalo rutin allitja be, amikor bejon az IRQ, es egyben beteszi az irqstat nevu valtozoba az MCI stat regiszter aktualis erteket:
Az ne zavarjon, hogy az ISR static-nak van deklaralva, mert az LPC2368 az ARM7 alapu uC, es maskepp vannak az interrupt vektorok, mint a Cortex-M3 alapuaknal. Ez egy real time kernel alatt futo program, ezert hasznal szemafort. Megvarhatod maskepp is a muvelet veget, csak real time rendszerekben nem szokas feltartani a processzort HW-re varakozassal. A kulonbozo ERR_... makrok csak hibakodok, amik ebben a megvalositasban negativ szamok.
K&R = Keil & Realview Assembler?
Egyenlőre az error részeket próbálom ignorálni. Most már vágom hogy mit hogy csinál, a furi az hogy kb ezt csináltam én is. Igaz én nem toltam egy utasítást adott esetben 30x ahogy te for-next függvényekkel csináltad. Kíváncsi leszek az eredményre.
Bővebben: Link
Ezt a könyvet magyarul is kiadták, több kiadásban is: Bővebben: Link Bővebben: Link Alapmű, ha az ember C-t szeretne tanulni.
Miert akarod ignoralni az error reszeket? Ha egyszer hiba van, akkor azt nem lehet ignoralni. Igazabol nem emlekszem, hogy miert probalja meg kikuldeni a parancsot 30-szor, ha CMDTIMEOUT van. Lehet, hogy valami teszt volt, aztan csak bentmaradt. Nem biztos, hogy kell bele. Ezt a kodot még 2010 majusaban irtam.
Idézet: És már nem emlékszel „Ezt a kodot még 2010 majusaban irtam.” ![]()
Azért ignoráltam, hogy egyszerűsítsem a dolgom, a megértést. Lépésről lépésre emeltem a sajátomba a kódodat, gyakorlatilag CMD, ACMD részenként.
Most az a helyzet hogy szépen lefut, az elején jól jön a for-next ciklus, mert elsőre általában mindig BUSY a kártya, neki kell futni a CMD55/ACMD41 párosnak 2x is. Most már csak a waitms funkciót kell belepreparálni, hogy magától is menjen, időzítések nélkül csak single-step fut le helyesen. Ami érdekes: printf. Na ettől úgy szétfagy a kontroller hogy még a main függvényig se jut el. Amint kiszedem, működik rendesen. Amíg benne van addig se single-step se semmi. Mintha le lenne húzva a JTAG a prociról (csak hibaüzenet nélkül). Ez vajon miért lehet?
Az en initemben ket ciklus van. Az egyik, ami max. 10-szer kiadja az ACMD41-et. Az kell is, mert meg kell varni, amig a kartya feleled. De ott, ha a kartya BUSY, akkor var 200 milliszeket, es csak utana kerdez ujbol. Ez szerintem igy rendben is van. A kartyanak ido kell, mire az ACMD41-re azt valaszolja, hogy nem BUSY. A szabvany szerint max. 1 sec.
A printf-re enincs otletem. Az alapvetoen egy C konyvtari fuggveny, ami a standard output-ra ir egy *NIX rendszeren. Hogy egy mikrokontrolleres rendszerben mit csinal, az valtozo. Nekem speciel egy sorosvonalra irt, es csak debuggolasi celokat szolgalt.
Hát igen, én is csak azt szerettem volna, hogy a Keil Debug-printf ablakába írjon ki dolgokat, ahelyett hogy külön egy terminál ablak futna a PC-n + egy felkonfigolt UART, UART_USB átalakító... Sajna az egész szétesik tőle, most keresem mi lehet a gond.
Az ACMD41-et észrevettem hogy sosem "sikerül" elsőre, utána viszont már minden okay, a kártya elkapja a fonalat. ![]() Most éppen próbálom értelmezni azt a rengeteg adatot ami az init során kiesett az SD kártyából, mert jó volna tudni mikor mit csinál. Az ACMD41 pl már tiszta. ![]()
Megint kérdeznék:
Init rendben megtörtént: CMMD13, ra szépen visszajön hogy a kártya rendben van (A Card Status register alapján). SD kártya olvasása: sd_cmd(17, cím, 0); Ha a cím 0x00, 0x01, a visszajövő válasz 30. bitje 1, ami azt jelenti hogy: "A misaligned address that did not match the block length was used in the command." Ha mondjuk a cím 0x2000, akkor ez a bit nulla. Szóval nem "igazítottam" a blokk címét, amit ki szeretnék olvasni. Jól gondolom killbill? Ezek után mi jön? SPI-ben egyesek azt írják hogy 4byte FF-et kell küldeni, aztán visszajön egy FE, és aztán az adatok. Szóval egy címhelyes CMD13 után amikor várnám az adatokat a DATACNT szépen számol lefelé, de adatok a FIFO-ba nincsenek, jelzi hogy RXFIFO EMPTY. Egy CMD17-Single block read-nek mi a korrekt lefolyása?
Tanácsot / iránymutatást szeretnék kérni tőletek. Kellene nekem áramkörileg usb 2.0 kliens, legalább 64 mbyte ram, és ethernet (akár 10 mbps is elég). Mindez hekkelhető minőségben. Olyan cuccos lenne jó, amire nincsen rákényszerítve sem android, sem linux, hanem ansi C stack alapon van valami "community support"-tal. Beaglebone és társai folynak a csapból is, de csupasz fémnek nem túl jók. Létezik ilyen kategóriában kedvenc amatőr cuccos is épelméjű áron? Vagy külön gyártatni kell egyet saját igény szerint?
A >=64MB RAM nagyon erős szűrőtényező lesz. Nézzél Cortex demo boardokat, azokon ugye nem tud futni standard Linux, talán akad belőle ilyen sok SDRAM-mal szerelt modell. Mivel sokkal kisebb a választék, szinte biztos, hogy többe lesz, mintha az okosabb, Linuxot is tudók (pl. Beaglebone Black) közül választanál.
Esetleg jó áron van még az Olimex i.MX233-asa, ha nem zavar, hogy egy integrált USB hubra van az Ethernet rágyógyítva. Bővebben: Link
Sajnos nem is a ram a nagyobb baj, hanem a kliens usb 2.0 port. Konkrétan az olimex imx233-asnak a doksija szerint host funkciós usb-je van, kliens nincsen rajta.
A beagle boardok egy jó nagy színjáték. USB otg-t írnak, pedig ha ránézel a schematicon a descriptionre, mindegyik host slotra van bekötve - vagy még csak nem is arra. (Debug porton vannak, vagy csak tápfeszt szolgáltatnak.) Ha te láttad már bármelyiket kliens usb funkcióval működni, érdekelne, melyiket. A netes doksi meg egy külön tészta. Egyik helyen ezt írják, a másikon meg azt. Nem ízlik. Linux nélkül is azért akarom a boardot, mert amit community tart kézben stack alapon, ott van kitől megkérdezni, hogy ugyan árulná el, működik, vagy sem. Az összes többinél meg csak a fórum trollok vannak ott, és azok semmit sem tudnak. Az olimex olinuxino boardjával például már szívtam egy nagyot. Tényleg van rajta usb kliens, de nincsen hozzá linux driver. Android driver van hozzá, de az meg nem igazán stabil. Source kód support nulla, driver support nulla. Valami kínai gagyi processzor van benne (a13), és képtelenség a gyártóból bármit is kiverni. Ami egyben van, úgy van, és nincsen semmi más. Szóba sem állnak azok senkivel.. Na ezért akarok inkább csupasz fém cuccost. Olimexéknek a pic32 maxi web boardjuk olyan, hogy azon kezelhetően életre tudtam kelteni a kliens usb portot mc libbel, de a speedje meg csak 1.1-es, és az most kevéske. Szerk.: Közben látom kaptam egy új tippet is, nézem a SAM-ot. A hozzászólás módosítva: Okt 22, 2013
Direkt utána kotortam az adatlapnak, és kikerestem belőle a clock kontroller részt. Az usb periféria 12/48 mhz-hez oszt vissza. A 480-at nem fogja vinni. Microchipék is olyat játszanak, hogy "2.0 kompatibilis", de nekem inkább speed kellene, mint kompatibilitás.
|
Bejelentkezés
Hirdetés |