jorikdima 0 28 июня, 2009 Опубликовано 28 июня, 2009 · Жалоба может банально стэка не хватает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 28 июня, 2009 Опубликовано 28 июня, 2009 · Жалоба все заработало. причиной было установка маленького таймаута в регистр SDIO_DTIMER кстате этот трабл описан http://www.st.com/mcu/forums-cat-7865-23.html но они его не решили. записал тестовый гигабайтный файл на накопитель с установившемся скоростью 1.1 мбайт/с то что заработало это гуд. можно звук писать. теперь идем далее. более скорость не растет независисмо от размера буффера. полез в disk_write(...) оказалось что с верху при мультиблочной записи в disk_write кидаются куски по 8 блоков ненезависимо от того скока данных указал в f_write(...) полез в код f_write .. ниче не понятно как куски по 8 блоков нарезаются это поправить можно какнить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dessel 0 24 сентября, 2010 Опубликовано 24 сентября, 2010 · Жалоба все заработало. причиной было установка маленького таймаута в регистр SDIO_DTIMER кстате этот трабл описан http://www.st.com/mcu/forums-cat-7865-23.html Здравствуйте клен, я хотел бы к вам обратится за помощью, имея плату махаон TE-STM32F103RET, я хотел бы запустить на ней микро сд, но вот увы не получается, хотя карту инициализировать смог, а как читать и писать не понимаю пока, и потому прошу вас, выслать мне ваш исходник для примера. заранее спасибо dorsk-81(собака)mail.ru Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 22 марта, 2012 Опубликовано 22 марта, 2012 · Жалоба Беру карту 4ГБ , читаю сектор 0. Там почти одни нули , стало быть это MBR По адресу 0x1FE сигнатура AA55 По адресу 0x1BE вижу 00 02 03 01 0B 43 C3 D1 00 20 00 00 Стало быть PBR находится в 0x2000 секторе и его физический адрес 0x2000*0x200 Читаю 0x2000 сектор , но там кроме 00 ничего нет . PBR можно найти в секторе 0x10 , проверив все сектора по очереди на наличие сигнатуры AA55 0x2000 - это очевидно не номер сектора с PBR , а его физический адрес 0x10*0x200 Если прочитать сектор 1 , там почему-то то же сигнатура AA55. Помогите пожалуйста разобратся : Почему PBR в секторе 0x10 а не 0x2000 ? Что это такое в секторе 1 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 29 марта, 2012 Опубликовано 29 марта, 2012 · Жалоба Беру карту 4ГБ , читаю сектор 0. Там почти одни нули , стало быть это MBR По адресу 0x1FE сигнатура AA55 По адресу 0x1BE вижу 00 02 03 01 0B 43 C3 D1 00 20 00 00 Стало быть PBR находится в 0x2000 секторе и его физический адрес 0x2000*0x200 Читаю 0x2000 сектор , но там кроме 00 ничего нет . PBR можно найти в секторе 0x10 , проверив все сектора по очереди на наличие сигнатуры AA55 0x2000 - это очевидно не номер сектора с PBR , а его физический адрес 0x10*0x200 Если прочитать сектор 1 , там почему-то то же сигнатура AA55. Помогите пожалуйста разобратся : Почему PBR в секторе 0x10 а не 0x2000 ? Что это такое в секторе 1 ? Нет, всё не так !!! Аргумент команды CMD17 CMD18 CMD24 CMD25 - это адрес байта для SDSC карты , и адрес блока для SDHC и SDXC карт !!!! Что бы прочитать блок 0x2000 нужно в команде CMD17 передать аргумент 0x2000 а не 0x2000*0x200 =0x400000 Написано на с 64 документа Part_1_Physical_Layer_Simplified_Specification_Ver3.01_Final_100518-1.pdf Почему мне ни кто не подсказал ?! Я целую неделю с этим мучался ! Неужели кроме меня ни кто не использует карты больше 2Гб ?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 18 января, 2013 Опубликовано 18 января, 2013 · Жалоба По форматированию карты : Когда форматирую функциями из FATfs , в windows у карты 2Гб вижу объём 2.00Гб , у карты 1Гб вижу объём 1.00Гб. А если форматировать в windows или какой-нибудь утилитой, объём получается чуть меньше. Проверяю отформатированную карту программой h2testw_1.4. Нахожу ошибки, причём всегда в конце раздела. Делаю предположения : 1) При форматировании нужно проверять все сектора на работоспособность. Windows это делает, поэтому объём после форматирования получается меньше. 2) Известно, что внутри карточки свой собственный контроллер и своя собсвенная файловая система для работы с флэш. Которая распределяет нагрузку на флэш равномерно по всему объёму, что бы начало флэш, которое пишется активнее всего, не вышло из строя слишком быстро. Так вот, есть предположение, что этот встроенный контроллер "сдвигает" все испорченные сектора в верхние адреса. Если это на самом деле так, то определение реального количества работающих секторов упрощается. Кто что думает ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 25 января, 2013 Опубликовано 25 января, 2013 · Жалоба Здравствуйте. Подскажите, как определить объём подключаемой SD карты. какой командой CMD? А то в интернете особо не нашёл. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 25 января, 2013 Опубликовано 25 января, 2013 · Жалоба Подскажите, как определить объём подключаемой SD карты. какой командой CMD? Для этого нужно прочитать содержимое регистра CSD . Команда CMD9. Как именно разбирать содержимое CSD написано в Part 1 Physical Layer Simplified Specification Ver3.01 Final 100518 1 Единственная тонкость, про которую там не написано : в SPI mode карта сначала выдаёт R1, потом FF , и лиш потом надо ловить 128 битов регистра CSD. Вот мой код по разбору содержимого CSD. Байтом 0 я считаю тот который карта приняла первым. Т.е. в нём биты 127-119 регистра CSD ////////////////////////////////узнаём количество секторов//////////////////////// // как это вычисляется написано в Part_1_Physical_Layer_Simplified_Specification_Ver3.01_Final_100518-1 int GET_SECTOR_COUNT_IN_CARD(void) { unsigned long int C_SIZE; int C_SIZE_MULT; int READ_BL_LEN; int MULT; int BLOCKNR; int BLOCK_LEN; int memory_capacity; char cmd_ansver[17]; SEND_CMD(CMD9,0,cmd_ansver); if (CardType==SDHC_SDXC) { C_SIZE = (cmd_ansver[9]) + (cmd_ansver[8]<<8) + ((cmd_ansver[7]&0x3F)<<14); //биты 69-48 sector_count_result=C_SIZE*1024; } else { C_SIZE = ((cmd_ansver[8] & 0x03)) + (cmd_ansver[7]<<2) + ((cmd_ansver[6]&0x03)<<10); //биты 73-62 C_SIZE_MULT = ((cmd_ansver[10] & 0x01)) + ((cmd_ansver[9] & 0x03)<<1); //биты 49-47 READ_BL_LEN =((cmd_ansver[5] & 0x0F)); //биты 80-83 switch (C_SIZE_MULT){ case 0: MULT=4; break; case 1: MULT=8; break; case 2: MULT=16; break; case 3: MULT=32; break; case 4: MULT=64; break; case 5: MULT=128; break; case 6: MULT=256; break; case 7: MULT=512; break; default: MULT=4; break; //это возможно только при ошибке } BLOCKNR=(C_SIZE+1) * MULT; switch (READ_BL_LEN){ case 9: BLOCK_LEN=512; break; case 10: BLOCK_LEN=1024; break; case 11: BLOCK_LEN=2048; break; default: BLOCK_LEN=512; break; //это возможно только при ошибке } memory_capacity = BLOCKNR * BLOCK_LEN; sector_count_result=memory_capacity/0x200; } return sector_count_result; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 28 января, 2013 Опубликовано 28 января, 2013 · Жалоба Спасибо большое. Я работаю не по SPI, по родному режиму. SPI у нас на FTDI сильно загружен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 28 января, 2013 Опубликовано 28 января, 2013 · Жалоба Вот мой код по разбору содержимого CSD. Благодарю! Сейчас тоже озадачился этим делом, будет полезно подглядеть в код :rolleyes: Правда интересно, для SDHC поле TAAC фиксировано, и равно 0x0e (стр. 103). У меня же вычитывается 0x60. И, я смотрю, Вы не читаете версию CSD, поле CSD_STRUCTURE, а берете тип карты, где он определен ранее (видимо по CMD8, ACMD41). Так, стоп! Биты 127... принимаются первыми? Просто у MCI-модуля LPC2478 есть четыре регистра RESP0, RESP1, RESP2, RESP3, и я вычитываю старшие биты из RESP3. Похоже нужно наоборот... Точно! Проверил, так и есть. Теперь все строго по табличке))) MiklPolikov, Вы даже не представляете, как мне помогли! Спасибо!!!:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thodnev 0 28 января, 2013 Опубликовано 28 января, 2013 · Жалоба Elm-chan отличную библиотеку сделал же. Попробуйте http://elm-chan.org/fsw/ff/00index_e.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 января, 2013 Опубликовано 29 января, 2013 · Жалоба Elm-chan отличную библиотеку сделал же. Попробуйте http://elm-chan.org/fsw/ff/00index_e.html Таке и нэктож энэ спорыт :rolleyes: :rolleyes: :rolleyes: Великолепная библиотека. Но низкоуровневые функции работы с диском туда не входят, вот об этом и речь :rolleyes: По теме: у меня SDHC. Параметр C_SIZE в CSD регистре равен некому числу (сейчас не помню, не под рукой система). По спецификации размер карты равен (C_SIZE + 1) *512 Кб. Я его вычисляю так (C_SIZE + 1 ) * 512 * 1024. Получаю число. Но винда, WinHEX и Total Commander показывают емкость диска совершенно разную. Каждый. В общем случае наши числа отличаются не очень сильно. Но отличаются. Вопрос: почему? Пока с ФС не работаю. Клепаю драйвер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 января, 2013 Опубликовано 29 января, 2013 · Жалоба В общем случае наши числа отличаются не очень сильно. Но отличаются. Вопрос: почему? Есть размер диска, размер раздела и объем данных в разделе после форматирования. Если раздел один, то эти числа "не очень сильно отличаются". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться