FATFS + EEPROM M95M01

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

FATFS + EEPROM M95M01

Сообщение Chip115 »

Всем привет. Требуется поднять работа файловой системы на мегабитной EEPROM (M95M01) Камень STM32F103С8
Перечитал кучу инфы, в голове каша, потому требуется помощь.
В общем, решил сделать через HAL. Так как хочу просто попробовать, то над оптимизацией кода сильно не потел.
Хочу создать файл, записать в него строку, но файла я так и не нахожу.
Вот состояние памяти
Сектор 63
Изображение
Сектор 64
Изображение
Остальные сектора либо все 0хFF, либо 0х00
Кстати, почему начало в секторе 63?

Допиленные низкоуровневые функции. Остальные не менял.

Код: Выделить всё

DSTATUS USER_initialize (
   BYTE pdrv           /* Physical drive nmuber to identify the drive */
)
{
    Stat &= ~STA_NOINIT;
    return Stat;
}


Код: Выделить всё

DRESULT USER_read (
   BYTE pdrv,      /* Physical drive nmuber to identify the drive */
   BYTE *buff,     /* Data buffer to store read data */
   DWORD sector,   /* Sector address in LBA */
   UINT count      /* Number of sectors to read */
)
{
    EEPROM_SPI_ReadBuffer(buff, sector*512, 512);
    return RES_OK;
}


Код: Выделить всё

DRESULT USER_write (
   BYTE pdrv,          /* Physical drive nmuber to identify the drive */
   const BYTE *buff,   /* Data to be written */
   DWORD sector,       /* Sector address in LBA */
   UINT count          /* Number of sectors to write */
)
{
    EEPROM_SPI_WriteBuffer((uint8_t*)buff, sector*512, 512);
    return RES_OK;
}


Код: Выделить всё

DRESULT USER_ioctl (
   BYTE pdrv,      /* Physical drive nmuber (0..) */
   BYTE cmd,       /* Control code */
   void *buff      /* Buffer to send/receive control data */
)
{
    DRESULT res = RES_ERROR;
   
    switch (cmd)
   {
   case CTRL_SYNC:             
          return RES_OK;
   case GET_SECTOR_SIZE:      
          *(WORD*)buff = 512;   // SECTOR_SIZE
          return RES_OK;
   case GET_SECTOR_COUNT:   
          *(DWORD*)buff = 256; // размер EEPROM 131072 байт. 131072  / SECTOR_SIZE = 256
          return RES_OK;
   }
   return RES_PARERR;
   
    return res;
}


То, что творится в main. Хочу создать файл, записать в него строку. Ошибок не возвращает ни одна функция.

Код: Выделить всё

FATFS mynewdiskFatFs;         /* File system object for User logical drive */
  FIL MyFile;                   /* File object */
  char mynewdiskPath[4];        /* User logical drive path */
  uint32_t wbytes;              /* File write counts */
  uint8_t wtext[] = "Hello";    /* File write buffer */
 
  if(FATFS_LinkDriver(&USER_Driver, mynewdiskPath) == 0)
  {   
    if(f_mount(&mynewdiskFatFs, (TCHAR const*)mynewdiskPath, 0) == FR_OK)
    {
      if (f_mkfs((TCHAR const*)mynewdiskPath,0,512) == FR_OK)
        if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
        {
          if(f_write(&MyFile, wtext, sizeof(wtext), (void *)&wbytes) == FR_OK);
          {
            f_close(&MyFile);
          }
        }
    }
  }
 FATFS_UnLinkDriver(mynewdiskPath);


В главном цикле вычитываю EEPROM по секторам (512 байт) в массив и смотрю в отладчике что там находится.

Код: Выделить всё

for (i = 0; i <256; i++)
      {
        EEPROM_SPI_ReadBuffer(RxBuffer, (uint16_t)512*i, (uint16_t)512);
      }


Исходники. IDE IAR

UPD.
Разобрался. Теперь другая проблема. При вызове f_close вываливается в Hard Fault, если символов в массиве wtext, для записи в файл, больше 15. В чем может быть проблема?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Ответить

Вернуться в «Разные вопросы по МК»