Перейти к содержанию
    

FAT на карте памяти SD/MMC

может банально стэка не хватает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все заработало. причиной было установка маленького таймаута в регистр SDIO_DTIMER

кстате этот трабл описан http://www.st.com/mcu/forums-cat-7865-23.html

но они его не решили.

 

записал тестовый гигабайтный файл на накопитель с установившемся скоростью 1.1 мбайт/с

 

то что заработало это гуд. можно звук писать.

 

теперь идем далее. более скорость не растет независисмо от размера буффера. полез в disk_write(...)

оказалось что с верху при мультиблочной записи в disk_write кидаются куски по 8 блоков ненезависимо от того скока данных указал в f_write(...)

 

полез в код f_write .. ниче не понятно как куски по 8 блоков нарезаются

 

это поправить можно какнить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все заработало. причиной было установка маленького таймаута в регистр SDIO_DTIMER

кстате этот трабл описан http://www.st.com/mcu/forums-cat-7865-23.html

 

Здравствуйте клен, я хотел бы к вам обратится за помощью, имея плату махаон TE-STM32F103RET,

я хотел бы запустить на ней микро сд, но вот увы не получается, хотя карту инициализировать смог,

а как читать и писать не понимаю пока, и потому прошу вас, выслать мне ваш исходник для примера.

заранее спасибо dorsk-81(собака)mail.ru

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Беру карту 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 ?

post-24702-1332440437_thumb.jpg

post-24702-1332440441_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Беру карту 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Гб ?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По форматированию карты :

Когда форматирую функциями из FATfs , в windows у карты 2Гб вижу объём 2.00Гб , у карты 1Гб вижу объём 1.00Гб. А если форматировать в windows или какой-нибудь утилитой,

объём получается чуть меньше. Проверяю отформатированную карту программой h2testw_1.4. Нахожу ошибки, причём всегда в конце раздела.

 

Делаю предположения :

1) При форматировании нужно проверять все сектора на работоспособность. Windows это делает, поэтому объём после форматирования получается меньше.

 

2) Известно, что внутри карточки свой собственный контроллер и своя собсвенная файловая система для работы с флэш. Которая распределяет нагрузку на флэш

равномерно по всему объёму, что бы начало флэш, которое пишется активнее всего, не вышло из строя слишком быстро. Так вот, есть предположение, что

этот встроенный контроллер "сдвигает" все испорченные сектора в верхние адреса. Если это на самом деле так, то определение реального количества работающих секторов упрощается.

 

Кто что думает ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

 

Подскажите, как определить объём подключаемой SD карты. какой командой CMD?

А то в интернете особо не нашёл. Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, как определить объём подключаемой 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое. Я работаю не по SPI, по родному режиму. SPI у нас на FTDI сильно загружен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот мой код по разбору содержимого CSD.

Благодарю! Сейчас тоже озадачился этим делом, будет полезно подглядеть в код :rolleyes:

Правда интересно, для SDHC поле TAAC фиксировано, и равно 0x0e (стр. 103). У меня же вычитывается 0x60.

 

И, я смотрю, Вы не читаете версию CSD, поле CSD_STRUCTURE, а берете тип карты, где он определен ранее (видимо по CMD8, ACMD41).

 

Так, стоп! Биты 127... принимаются первыми? Просто у MCI-модуля LPC2478 есть четыре регистра RESP0, RESP1, RESP2, RESP3, и я вычитываю старшие биты из RESP3. Похоже нужно наоборот...

 

Точно! Проверил, так и есть. Теперь все строго по табличке)))

 

MiklPolikov, Вы даже не представляете, как мне помогли! Спасибо!!!:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Elm-chan отличную библиотеку сделал же.

Попробуйте http://elm-chan.org/fsw/ff/00index_e.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 показывают емкость диска совершенно разную. Каждый. В общем случае наши числа отличаются не очень сильно. Но отличаются. Вопрос: почему?

 

Пока с ФС не работаю. Клепаю драйвер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем случае наши числа отличаются не очень сильно. Но отличаются. Вопрос: почему?

Есть размер диска, размер раздела и объем данных в разделе после форматирования. Если раздел один, то эти числа "не очень сильно отличаются".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...