| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Четене на SD (Secure Digital) Card http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9030 |
Страница 1 от 2 |
| Автор: | npelov [ Нед Юли 17, 2011 12:02 pm ] | |||||||||||
| Заглавие: | Четене на SD (Secure Digital) Card | |||||||||||
Пробвам се да прочета SD карта, но нещо не ми се получава. Контролера е PIC16F874. До момента успях да инициализирам картата с команди: CMD0 CMD8 CMD58 CMD55+ACMD41 След последната получавам отговор 0x00, а преди това когато няма грешка е 0х01 - както си пише по спецификация. След това опитах команда CMD9 - работи и връща смислени неща съгласно спецификацията. CMD17 обаче отказва да работи. Изобщо. При четенето опитах следните подходи: Опитах: 1. изпращам CMD16 за да укажа големина на блока 1 байт - отговор - ОК, четене - никакво. 2. Махнах CMD16 и прочитам и показвам 4 байта, и след това с цикъл прочитам останалите Резултати: 1. След CMD17 получавам 0xFF 2. С цикък пропускам всички0xFF -> получавам няколко 0x00 и пак 0xFF 3. С цикъл чакам токен за начало на данни - 0xFE -> отново следват 0x00 и/или 0xFF. 4. Опитах различни закъснения в цикъла (от 40us до 200ms) - никаква разлика Кода след толкова опити е каша, но все пак ще пусна малко:
|
||||||||||||
| Автор: | npelov [ Нед Юли 17, 2011 12:30 pm ] |
| Заглавие: | |
Ето малко подробности (едит): Чатенето връща: R1 - 0х00 FE 00 00 00 00 00 - ако големината на блока е 2 байта Първите байтове от картата всъщност са: EB 58 90 4D 53 44 4F 53 Каквото и да правя тези байтове не излизат. Адреса който изпращам е 00 00 00 00. Да не би да има някакъв трик в адресирането? |
|
| Автор: | npelov [ Нед Юли 17, 2011 1:51 pm ] |
| Заглавие: | |
CMD9 работи - изпращам 49 00 00 00 00 FF, чакам FE и чета: 00 5Е 00 32 5F 59 83 CF ED B6 FF 87 96 40 00 3F C4 0F |
|
| Автор: | Cekins [ Нед Юли 17, 2011 2:51 pm ] |
| Заглавие: | |
Що не разгледаш някоя библиотека за SD? Това да се мъчиш да подкарваш такива работи си е малко спортна злоба. Скоро ползвах една библиотека с FAT16 и сякаш много прилично се държи. Пък на мен ми трябват и файлове при това. |
|
| Автор: | npelov [ Нед Юли 17, 2011 2:56 pm ] |
| Заглавие: | |
щото няма за асемблер. Пък и не съм виждал библиотека за микроконтролер за някакъв хардуер да е супер универсална. Или са вързани за няколко конкретни контролера, или пък изискват да са на определени пинове... До сега съм подкарал много хардуер и нито една библиотека. |
|
| Автор: | npelov [ Нед Юли 17, 2011 3:31 pm ] |
| Заглавие: | |
Нещо с адресирането не е наред. Пиша адрес 01 00 00 00 и получавам съдържание, което иначе се намеира на офсет 0х00FF3600 според WinHex. Четох в нета някакъв имал подобен проблем. Каза, че използвал логически адрес, а трябвало физически. Тук ме хвърли в размисъл. Никъде не намерих нищо за адресиране на SD карта включително в смотаната спецификация ... навсякъде пише (или поне така аз го тълкувам), че адрес 00 00 00 00 е първия адрес от картата. Както и да въртиш байтовете 01 00 00 00 не може да стане на 00 FF 36 00 ... |
|
| Автор: | npelov [ Нед Юли 17, 2011 3:39 pm ] |
| Заглавие: | |
... няма нищо общо с подкарването... По метода на опита и грешката открих че началния адрес на картата е: 0x0000CA00 ... въпроса е защо и същия ли е за всяка карта? |
|
| Автор: | bateAz [ Нед Юли 17, 2011 3:45 pm ] |
| Заглавие: | |
1. Прочети сектор #0 на картата. Там се намира т.н. Master Boot Record ( по аналогия с твърдите дискове ) 2. Проверка за валидност: на отместване 0x1FE трябва да има 0xAA55 3. На отместване 0x1BE с дължина 4 байта се намира адресът на първия сектор от DOS/WIN партишъна ( тип 4 или 6 ) 4. Действай, пари нема! |
|
| Автор: | npelov [ Нед Юли 17, 2011 4:17 pm ] |
| Заглавие: | |
Както вече казах физическия адрес който подавам и адреса в картата се различават с 0xCA00 байта. Прочетох 2 байта от адрес 00 00 01 FE + CA00 = 00 00 CB FE и там действително има 55АА... Защо трябва да добавям това отместване 0xCA00 и защо е различно за всяка карта. Даже успях да прочета текстов файл - с WinHex му видях адреса, добавих 0xCA00 - и всичко си е така както го написах с Notepad... |
|
| Автор: | bateAz [ Нед Юли 17, 2011 4:33 pm ] | |||||||||
| Заглавие: | ||||||||||
|
||||||||||
| Автор: | npelov [ Нед Юли 17, 2011 5:20 pm ] |
| Заглавие: | |
прочетох 4 байта - 6F 74 68 65 (CRC = 37 74) - изглежда ли достоверно? Само че нещо си объркал - като разглеждам с WinHex на адрес 0х01BE наистина има тези байтове, но това е текст "Remove disks or other media. Disk error Press any key to restart". Мисля че си се заблудил от размера на картата - тази е 256 МБ, а те нямат партишънинг. Форматирани са като флопи диск Все пак колкото и опити да провеждам съвпадат напълно със това, което виждам в Hex редактора, с тази разлика, че на картата задавам адреса с отместване 0х0000CA00. Как е възможно да не намеря нищо по въпроса в спецификацията. Никакво отместване, никакви особености за адреса. Нищо дори в нета не намерих. На всякъде съветват "опитай с адрес 0 за да видиш буут рекърда". Аз го виждам, но на адрес 0x0000CA00. |
|
| Автор: | npelov [ Нед Юли 17, 2011 5:38 pm ] |
| Заглавие: | |
Опалааааа.... Открих че WinHex наистина не показва физическото устройство. Отворих устройството с FlexHEX и там на адрес 0х01BE има 00 03 06 00 -> това като 4 байта int трябва да е 0х00060300. Ама нещо не се връзва - нито на 0х00060300 има нещо, нито на 0х00030600. Все пак съм четял правилно - в началото на картата си е пълно с 00 |
|
| Автор: | npelov [ Нед Юли 17, 2011 8:33 pm ] |
| Заглавие: | |
С winhex разкодирах кое какво означава: 1BE - 00 (80 за активен партишън) 1BF - start head - 3 1C0 - start sector - 6 1C1 - start cylinder - 0 ... 1C6 - sectors preceding partition 1 - 101 Хубаво - глави, сектори ама как са ги напъхали тия глави в СД карта. С други думи - как да знам колко байта е един сектор, колко сектора на цилиндър, колко глави има една карта. Пише ли го в спецификацията? Т.е. хардуерно ли е? Едит - отговора се намира на 1C6 -> 101 ... не знам колко байта е това число, но 1, 2 или 4 байта в този конкретен случай все е 101. 101*512 = 51712 или 0хCA00 |
|
| Автор: | bateAz [ Нед Юли 17, 2011 8:48 pm ] | |||||||||
| Заглавие: | ||||||||||
|
||||||||||
| Автор: | npelov [ Нед Юли 17, 2011 9:09 pm ] |
| Заглавие: | |
да, мерси ... малко ме обърка като каза че отместването на партишъна е на 1BE. Всъщност от кода дето си пуснал се вижда че е 1BE + 8 или както сам отгатнах - 1C6. Както виждам от твоя код отместването е 4 байта Int. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|