Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mass Storage от Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Костян
День добрый . Использую пример 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)
ivstech
Что-то код MSC_MemoryWrite не привели....
А где отслеживаете нулевое значение? При передаче в карточку адреса в команде CMD_WRITE?
Костян
Цитата(ivstech @ Mar 29 2007, 09:01) *
Что-то код MSC_MemoryWrite не привели....


Для краткости .Он аналогичный MSC_MemoryRead. Да и собственно в катрочку я пишу через кард ридер , а пытаюсь считать через свое устройство.
При считывании txt файла более ~ 20 кБ я получаю перемешанный исходный текст, иногда с пропаданием определенных участков.


Цитата
А где отслеживаете нулевое значение? При передаче в карточку адреса в команде CMD_WRITE?

Да.
Wano
Может можно отследить место где происходит обрыв при чтении? 20кб не так уж и много.
Костян
Цитата(Wano @ Mar 29 2007, 16:21) *
Может можно отследить место где происходит обрыв при чтении? 20кб не так уж и много.


Обрыв при чтении происходит при спонтанном изменении BulkLen с 64 байт на 31 .
vitaMAX
Цитата(Костян @ Mar 29 2007, 16:39) *
День добрый . Использую пример 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)

Привет. у меня по твоему примеру несколько вопросов.
За что в твоем примере отвечает FLAG и чему равен MSC_MemoryStart ?
mmc_read_block вроде как не 1 параметр имеет?
static BOOL mmc_read_block (U8 cmd, U32 arg, U8 *buf, U32 cnt)

помимо USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + /*Offset*/shift), n) в MSC_MemoryRead наверно нужно конфигурацию(первые блоки на mmc) передать (в TX_DATA)?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.