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

artos5

Moderators
  • Постов

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

  • Посещение

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

    7

Сообщения, опубликованные artos5

  1. 5 минут назад, donec сказал:

    А где Я сказал, что его нужно на cnt умножать?

    К переменной 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 */
    }

     

  2. Вот так подправил код, и теперь читает больше 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 - Тебе большое спасибо за терпение и помощь! 

  3. Проверил точно поведение программы. В общем, если читаешь меньше 512 и файл больше 512 байт, то тоже нормально все читается.
    Если файл больше 512 и читаешь больше 512, то не читает вообще ничего из файла. Но при этом отображается что прочитаны байты все.

  4. Смотри, может это наведет на мысли что не так?
    Когда читаешь данные меньше 512 (именно когда файл содержит меньше 512 байт данных), то читается нормально.
    Но вот когда файл более 512 байт, то не читается вообще ничего. Даже первые 512 байт.

  5. Осталось победить корректное чтение более 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--;
        }

     

  6. 1 час назад, donec сказал:

    char disk[5]={0};

    Program start!....
    diskread: sector=0; count=1
    disk_mount=0 #disk=

     

    35 минут назад, donec сказал:

    f_read дана команда прочесть 256 байт, а он читает всего 16 байт,

    Странно... А может это из-за того что это текстовый файл, и в нем мало данных?

    В текстовом файле содержится строка:

    Test data Fatfs!

    Как раз 16 байт))

    Дописал символы:
     

    Test data Fatfs!12345

     Победа похоже близка ))))
    Нужно проверить как будет читать более крупные файлы!

  7. Скинь пожалуйста свои библиотеки, которые работают у тебя...

    Кстати в секции 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--;
        }

     

  8. Поставил на 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");
    	}

     

    45 минут назад, donec сказал:

    А номер диска равен 0?

    А как номер диска узнать? пытаюсь подставить массив текстовый при монтировании , номер диска не показывает:
     

    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

     

  9. Скачал библиотеку с сайта автора и подключил к проекту. Все снова прописал. И выдает также код 3! 
     

    FR_NOT_READY,			/* (3) The physical drive cannot work */

    Вот:
     

    Program start!....
    disk_mount=3
    Error_f_mount!

    У меня уже голова закипает :)

    Что я еще забыл там прописать?
    Кстати в блок 
     

    DRESULT disk_read ()

    теперь не заходит, даже при монтировании.

    backup1.rar

  10. 10 минут назад, donec сказал:
    success = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);

    когда убрал первый пункт стало возвращать постоянно значение 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 */

     

  11. у меня HAL-вский Fatfs.

    Не пойму это везде так?
    у меня есть

    diskio.c
    и user_diskio.c


    я сначала правил diskio.c
    и вообще не работало. Потом вернул diskio.c к изначальному виду и поправил user_diskio.c, и появились некоторые изменения.

    Прикрепляю архив проекта. Тут где-то не до конца сконфигурирована библиотека Fatfs

    backup.rar

  12. После правок библиотек, достиг некоторого успеха!
     

    Спойлер
    Program start!....
    disk_initialize=1
    sector=0
    disk_mount=0
    sector=0
    sector=32
    sector=33
    sector=34
    sector=35
    sector=36
    sector=37
    sector=38
    sector=39
    sector=40
    sector=41
    sector=42
    sector=43
    sector=44
    sector=45
    sector=46
    sector=47
    sector=48
    sector=49
    sector=50
    sector=51
    sector=52
    sector=53
    sector=54
    sector=55
    sector=56
    sector=57
    sector=58
    sector=59
    sector=60
    sector=61
    open_File_OK1!
    sector=0
    sector=32
    sector=33
    sector=34
    sector=35
    sector=36
    sector=37
    sector=38
    sector=39
    sector=40
    sector=41
    sector=42
    sector=43
    sector=44
    sector=45
    sector=46
    sector=47
    sector=48
    sector=49
    sector=50
    sector=51
    sector=52
    sector=53
    sector=54
    sector=55
    sector=56
    sector=57
    sector=58
    sector=59
    sector=60
    sector=61
    open_File_OK2!
    TestBytes=0
    <0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>read_File_complite!
    

     

    Монтируется успешно, и файлы открывает успешно, но читаются из файлов ноли.

  13. Подскажи пожалуйста. 
    Есть строчка кода монтирования диска:
     

    f_mount(&SDFatFs, (TCHAR const*)USER_Path, 0);

    А в свою очередь
     

    char USER_Path[4]; /* logical drive path */

    Объявлен в начале функции main.c
    И больше нигде этот массив не используется кроме монтирования. Так и должно быть? Или где-то нужно USER_Path еще прописать?

    Вопрос снимается :)

  14. 2 часа назад, donec сказал:
    uint8_t success = disk_initialize();
    success - вывести в отладку, что выдает
    
    uint8_t success = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);
    success - вывести в отладку, что выдает
    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);

    Диск не монтируется, ошибка..

  15. 42 минуты назад, dolmatovva сказал:

    но в disk_initialize нет ретурнов...

    Есть ретурны.

    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;
    }
    43 минуты назад, dolmatovva сказал:

    у ТСа нет понимания работы файловой системы, вопрос, для чего он взялся за этот проект ?

    Общее понимание работы файловой системы есть. Нет пока понимания как пользоваться библиотекой Fatfs.

    Взялся за задачу, чтобы разобраться как работает файловая система и т.д. Все когда-то не понимали что и как работает.

    1 час назад, donec сказал:

    Для тебя это должна быть заглушка которая возвращает 0.

    Сейчас сделаю и посмотрю что выдает. Спасибо что помогаешь!

  16. 44 минуты назад, donec сказал:

    Примерно так

    Я написал там код точно также как у меня написан код в обработчике USB. Это рабочий код чтения с USB размер как раз 512 байт.
    119839048_2024-03-29130738.png.f2e3091574b4009e46095c08fb2e01ae.png
     

    В 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 */
    }

     

    52 минуты назад, donec сказал:

    Можно еще проверку внести считаны ли уже данные этого сектора w25g, чтоб быстрее было.

    Стоп, или нужно сразу 4КБ вычитывать из обработчика DRESULT disk_read()?

×
×
  • Создать...