реклама на сайте
подробности

 
 
> Mass Storage от Keil, траблы с размером файлов
Костян
сообщение Mar 29 2007, 12:39
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



День добрый . Использую пример Mass Storage от Keil, файловую систему храню на MMC карточке . Для этого переписал функцию MSC_MemoryRead и MSC_MemoryWrite файла mscuser.c . В файле mscuser.h изменил define , отвечающий за размер файла.
#define MSC_MemorySize 8380416//16384

Функция mmc_read_block(BlockNum) читает из MMC карточки сектор 512 байт с номером BlockNum. Для определения собсвенно его номера выполняю следующее :
Код
BlockNum=Offset>>9;
    shift = Offset& 0x1FF;


В итоге я могу прочитать и записать файлы , но их размер не может превышать около 20кБ , иначе подтирается нулевой сектор на MMC карточке и стирается заголовок файловой системы .Причем я отслеживаю в начале функции mmc_write_block(BlockNum) обращение к нулевому сектору и его НЕТУ.

Для ясности привожу подивицированный код фунции void MSC_MemoryRead (void)

Код
void MSC_MemoryRead (void)
{
    
  WORD_  n,BlockNum;
  WORD_  shift;    

  CE_H;/* set SPI SSEL */

  if (Length > MSC_MAX_PACKET) {
    n = MSC_MAX_PACKET;
  } else {
    n = Length;
  }

  if ((Offset + n) > MSC_MemorySize) {
    n = MSC_MemorySize - Offset;
    BulkStage = MSC_BS_DATA_IN_LAST_STALL;
  }

/////////////

    BlockNum=Offset>>9;
    shift = Offset& 0x1FF;
    
    if (shift==0)
    {

    FLAG=1;
    if ( mmc_read_block(BlockNum) )
              printf ("\n ERROR READ SD CARD _ MemoryRead Sector=%d\n",BlockNum);
    #ifdef    enable_debug
    printf ("\nread BlockNum=%ld n=%d",BlockNum,n);
    #endif
    FLAG=0;
       }
/////////////
  
  USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + /*Offset*/shift), n);
  Offset += n;
  Length -= n;

  CSW.dDataResidue -= n;

  if (Length == 0) {
    BulkStage = MSC_BS_DATA_IN_LAST;
  }

  if (BulkStage != MSC_BS_DATA_IN) {
    //IOCLR1 = LED_RD;            /* Turn Off Read LED */
    IOCLR0 = 1 << 10;
    CSW.bStatus = CSW_CMD_PASSED;
  }
}


Какие есть соображения товарищи коллеги ???

Есть ли альтернатива примеру Mass Storage с сайта Keil . (но необходимо именно под компилятор CARM либо RV , т.к USB d проекте является небольшой частью, а остальная часть кода уже написано именно под Keil)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 00:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01315 секунд с 7
ELECTRONIX ©2004-2016