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

 
 
 
Reply to this topicStart new topic
> 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
ivstech
сообщение Mar 29 2007, 14:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Что-то код MSC_MemoryWrite не привели....
А где отслеживаете нулевое значение? При передаче в карточку адреса в команде CMD_WRITE?
Go to the top of the page
 
+Quote Post
Костян
сообщение Mar 29 2007, 14:14
Сообщение #3


Знающий
****

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



Цитата(ivstech @ Mar 29 2007, 09:01) *
Что-то код MSC_MemoryWrite не привели....


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


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

Да.
Go to the top of the page
 
+Quote Post
Wano
сообщение Mar 29 2007, 21:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Может можно отследить место где происходит обрыв при чтении? 20кб не так уж и много.
Go to the top of the page
 
+Quote Post
Костян
сообщение Mar 30 2007, 11:49
Сообщение #5


Знающий
****

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



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


Обрыв при чтении происходит при спонтанном изменении BulkLen с 64 байт на 31 .
Go to the top of the page
 
+Quote Post
vitaMAX
сообщение Oct 22 2009, 05:25
Сообщение #6





Группа: Участник
Сообщений: 8
Регистрация: 18-10-09
Пользователь №: 53 046



Цитата(Костян @ 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)?

Сообщение отредактировал vitaMAX - Oct 22 2009, 06:23
Go to the top of the page
 
+Quote Post

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

 


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


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