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

artos5

Moderators
  • Постов

    3 089
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

Весь контент artos5

  1. Угу, сработало )) Попробовал вычитать 4096 байт, вычитанное посмотрел в терминале. И сохранил в файл. В итоге ровно 4096 байт прочиталось. 001.txt
  2. К переменной sector нужно единичку прибавлять и передавать в w25_read ? Есть косяк с чтением данных. Что то я на мудрил все-таки. Вот есть пример, так тут вообще все просто. Сектор и есть абсолютным адресом: 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 */ ) { if (pdrv || !count) return RES_PARERR; if (Stat & STA_NOINIT) return RES_NOTRDY; if (!(sdinfo.type & 4)) sector *= 512; /* Convert to byte address if needed */ if (count == 1) /* Single block read */ { SD_Read_Block(buff,sector); //—читаем блок в буфер count = 0; } else /* Multiple block read */ { } SPI_Release(); return count ? RES_ERROR : RES_OK; return RES_OK; /* USER CODE END READ */ }
  3. Так сектор имеет же абсолютный адрес? зачем его еще на cnt умножать?
  4. Вот так подправил код, и теперь читает больше 512 байт. Все-таки проблема была в процедуре чтения... Осталось только проверить корректно считывает или нет. DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber (0) */ BYTE *buff, /* Pointer to the data buffer to store read data */ DWORD sector, /* Start sector number (LBA) */ UINT count /* Number of sectors to read */ ) { uint32_t cnt=0; while(count > 0) { w25qReadPage(buff + 1 * cnt, sector * 2); w25qReadPage(buff + 256 + 1 * cnt, sector * 2 + 1); buff += 512; cnt += 512; //sprintf((char*)buff1, "diskread: sector=%lu; count=%d\r\n", sector, count); Usart1_Send_String((char*)buff1); count--; } return RES_OK; } @donec - Тебе большое спасибо за терпение и помощь!
  5. Думаю что вряд-ли . Там просто буфер передается , и по символьно печатается.
  6. Проверил точно поведение программы. В общем, если читаешь меньше 512 и файл больше 512 байт, то тоже нормально все читается. Если файл больше 512 и читаешь больше 512, то не читает вообще ничего из файла. Но при этом отображается что прочитаны байты все.
  7. Смотри, может это наведет на мысли что не так? Когда читаешь данные меньше 512 (именно когда файл содержит меньше 512 байт данных), то читается нормально. Но вот когда файл более 512 байт, то не читается вообще ничего. Даже первые 512 байт.
  8. Размер буфера 4096 , а больше 512 байт прочитать не может.
  9. Осталось победить корректное чтение более 512 байт))) До 512 байт читает нормально. Более 512 байт данных просто вообще не выводит. Получается проблема в обработчике чтения. while(count > 0) { w25qReadPage(buff, sector * 2); w25qReadPage(buff + 256, sector * 2 + 1); buff += 512; sprintf((char*)buff1, "diskread: sector=%lu; count=%d\r\n", sector, count); Usart1_Send_String((char*)buff1); count--; }
  10. Program start!.... diskread: sector=0; count=1 disk_mount=0 #disk= Странно... А может это из-за того что это текстовый файл, и в нем мало данных? В текстовом файле содержится строка: Test data Fatfs! Как раз 16 байт)) Дописал символы: Test data Fatfs!12345 Победа похоже близка )))) Нужно проверить как будет читать более крупные файлы!
  11. Скинь пожалуйста свои библиотеки, которые работают у тебя... Кстати в секции read я прописал так: while(count > 0) { w25qReadPage(buff, sector * 2); w25qReadPage(buff + 256, sector * 2 + 1); buff += 512; sprintf((char*)buff1, "diskread: sector=%lu; count=%d\r\n", sector, count); Usart1_Send_String((char*)buff1); count--; }
  12. Поставил на diskini...() заглушку return 0; Выдает что инициализация успешна и прочитаны байты успешно, но самого текста не видно. То есть либо ошибка в блоке чтения либо еще что то. Program start!.... diskread: sector=0; count=1 disk_mount=0 #disk=Ð5 diskread: sector=32; count=1 diskread: sector=33; count=1 diskread: sector=34; count=1 diskread: sector=35; count=1 diskread: sector=36; count=1 diskread: sector=37; count=1 diskread: sector=38; count=1 diskread: sector=39; count=1 diskread: sector=40; count=1 diskread: sector=41; count=1 diskread: sector=42; count=1 diskread: sector=43; count=1 diskread: sector=44; count=1 diskread: sector=45; count=1 diskread: sector=46; count=1 diskread: sector=47; count=1 diskread: sector=48; count=1 diskread: sector=49; count=1 diskread: sector=50; count=1 diskread: sector=51; count=1 diskread: sector=52; count=1 diskread: sector=53; count=1 diskread: sector=54; count=1 diskread: sector=55; count=1 diskread: sector=56; count=1 diskread: sector=57; count=1 diskread: sector=58; count=1 diskread: sector=59; count=1 diskread: sector=60; count=1 diskread: sector=61; count=1 diskread: sector=5582; count=1 Test data Fatfs!=5582; count=1 read_File_complite! Test=16 open_File_OK1! Тестовый код: int saccess = 0; Usart1_Send_String(buf1); char disk[8]; res = f_mount(&FatFs, disk, 1); sprintf(buf1, "disk_mount=%d #disk=%s\r\n", res, disk); Usart1_Send_String(buf1); if(res !=FR_OK) { Usart1_Send_String("Error_f_mount!\r\n"); } else { if(f_open(&File,"01.txt",FA_READ)!=FR_OK) //f_open(&, ptr, (BYTE)p1) { Usart1_Send_String("Error_open_File1!\r\n"); } else { UINT testBytes=0; f_read(&File, buff1, 256, &testBytes); Usart1_Send_hex((char*)buff1, strlen((char*)buff1)); sprintf((char*)buff1, "\r\nread_File_complite! Test=%d\r\n", testBytes); Usart1_Send_String((char*)buff1); f_close(&File); Usart1_Send_String("open_File_OK1!\r\n"); } А как номер диска узнать? пытаюсь подставить массив текстовый при монтировании , номер диска не показывает: char disk[5]={'T','E', 'S', 'T', 0}; res = f_mount(&FatFs, disk, 1); sprintf(buf1, "disk_mount=%d #disk=%s\r\n", res, disk); Выдает: Program start!.... diskread: sector=0; count=1 disk_mount=0 #disk=TEST
  13. Скачал библиотеку с сайта автора и подключил к проекту. Все снова прописал. И выдает также код 3! FR_NOT_READY, /* (3) The physical drive cannot work */ Вот: Program start!.... disk_mount=3 Error_f_mount! У меня уже голова закипает Что я еще забыл там прописать? Кстати в блок DRESULT disk_read () теперь не заходит, даже при монтировании. backup1.rar
  14. когда убрал первый пункт стало возвращать постоянно значение 3 при монтировании. А это: FR_OK = 0, /* (0) Succeeded */ FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ FR_INT_ERR, /* (2) Assertion failed */ FR_NOT_READY, /* (3) The physical drive cannot work */
  15. у меня HAL-вский Fatfs. Не пойму это везде так? у меня есть diskio.c и user_diskio.c я сначала правил diskio.c и вообще не работало. Потом вернул diskio.c к изначальному виду и поправил user_diskio.c, и появились некоторые изменения. Прикрепляю архив проекта. Тут где-то не до конца сконфигурирована библиотека Fatfs backup.rar
  16. После правок библиотек, достиг некоторого успеха! Монтируется успешно, и файлы открывает успешно, но читаются из файлов ноли.
  17. Подскажи пожалуйста. Есть строчка кода монтирования диска: f_mount(&SDFatFs, (TCHAR const*)USER_Path, 0); А в свою очередь char USER_Path[4]; /* logical drive path */ Объявлен в начале функции main.c И больше нигде этот массив не используется кроме монтирования. Так и должно быть? Или где-то нужно USER_Path еще прописать? Вопрос снимается
  18. Program start!.... disk_initialize=1 sector=0 disk_mount=13 sector=0 Error_open_File1! sector=0 Error_open_File2! Код отладки такой: int saccess = disk_initialize(SDFatFs.drv); sprintf(buf1, "disk_initialize=%d\r\n", saccess); Usart1_Send_String(buf1); saccess = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1); sprintf(buf1, "disk_mount=%d\r\n", saccess); Usart1_Send_String(buf1); Диск не монтируется, ошибка..
  19. Есть ретурны. DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { DSTATUS stat = RES_OK; if(disk.is_initialized[pdrv] == 0) { disk.is_initialized[pdrv] = 1; stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]); } return stat; } Общее понимание работы файловой системы есть. Нет пока понимания как пользоваться библиотекой Fatfs. Взялся за задачу, чтобы разобраться как работает файловая система и т.д. Все когда-то не понимали что и как работает. Сейчас сделаю и посмотрю что выдает. Спасибо что помогаешь!
  20. Она читает по 256 байт. Как правильно состыковать из ?
  21. Я написал там код точно также как у меня написан код в обработчике USB. Это рабочий код чтения с USB размер как раз 512 байт. В Fatfs не работает корректно, в USB работает корректно. //Чтение 512 байт в Fatfs DRESULT disk_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 */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); sprintf(buffer0, "sector=%lu\r\n", sector); Usart1_Send_String(buffer0); w25qReadPage(buff, sector*2); w25qReadPage(buff + 256, sector*2+1); res=RES_OK; return res; } //Чтение 512 байт в USB: /** * @brief . * @param lun: . * @retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 6 */ LED0; // 0 включение светодиода w25qReadPage(buf, blk_addr * 2); w25qReadPage(buf + 256, blk_addr * 2 + 1); LED1; // 1 выключение светодиода return (USBD_OK); /* USER CODE END 6 */ } Стоп, или нужно сразу 4КБ вычитывать из обработчика DRESULT disk_read()?
  22. Так это я форматировал виндой. Сейчас микроконтроллер и флеш память как USB флешка. Вот в винде я и отформатировал...
  23. Я вычитал полностью дамп , и начало у меня выглядит так:
×
×
  • Создать...