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

STM32L476 + SD. f_write выдает FR_DISK_ERR

Уже закипел. Функция открытия файла выдает ОК. А  f_write выдает ошибку. Копнул глубже - ошибку выдает функция 

res = validate(&fp->obj, &fs);            /* Check validity of the file object */

Если смотреть вглубь этой валидэйт, то там в условии проверки:

    if (!obj || !obj->fs || !obj->fs->fs_type || obj->fs->id != obj->id || (disk_status(obj->fs->drv) & STA_NOINIT)) {


Срабатывает даже первое условие - объект нулевой!!

Помогите советом - иначе как проблемы с памятью в мозг ничего не приходит. Но и памятью я вертел - не помогает. Закипел.

 

	sprintf((char*)fileName, "%d-data%d.txt",  stationNum, fileCounter);
	
  res = f_open(&outFile, (char*)fileName, FA_WRITE | FA_OPEN_APPEND);
	if(res == FR_OK)
	{
		isSdMount = true;
		
		int cikl = 0;
		char Cbuf[50];
		while(1)
		{
			cikl++;
			sprintf(Cbuf, "Start new session %d\r\n", cikl);
			int len = strlen(Cbuf);			
			res = f_write(&outFile, Cbuf, len, &fileBytes);
			if(res == 1)
			{
			PB9LedToggle();				
				//PB8LedOFF;
			}
		}


		SaveToOutputFile("Start new session\r\n");

	}

Спасибо.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, Димон Безпарольный said:

Срабатывает даже первое условие - объект нулевой!! 

Объект это ведь &outFile, нужно смотреть в эту сторону...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Integro said:

Объект это ведь &outFile, нужно смотреть в эту сторону...

Сей эффект обнаруживается только после программирования. Если передергивать питание, то все ок. Если кто попадется на эти грабли... Причина мне неизвестна такого поведения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как всегда все банально. Снизил тактовую в hsd.Init.ClockDiv = 9; и все заработало. Можно списать на неграмотную разводку потому что конденсатор я приляпал прямо к выводам слота. Тантал 100мкф.

Вот значения делителя:

//5 - не прокатило
//6 - не прокатило
//7 - не прокатило. Но держалась долго
//8 - не прокатило
//9 - работает даже после программирования     
//10 - работает только после подачи питания. После программирования не работает
//11 - не прокатило
//12 - не прокатило. Но держалась долго
//13 - работает даже после программирования    
//14 - работает даже после программирования
//15 - работает даже после программирования
//16 - работает даже после программирования
//17 - работает даже после программирования
//18 - работает даже после программирования
//19 - работает даже после программирования
//20 - работает даже после программирования

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересное подозрение.. А Вы точно полностью сбрасываете периферию в процессе инициализации? Именно через сброс периферийного блока.

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

В частности, где-то в недрах железки (хотя и на F7) используется такой код:

    // Enable clock
    RCC->APB2ENR |= RCC_APB2ENR_SDMMC1EN;
    // Сброс
    RCC->APB2RSTR |= RCC_APB2RSTR_SDMMC1RST;
    // Антисброс
    RCC->APB2RSTR &= ~RCC_APB2RSTR_SDMMC1RST;
    tempreg=0;            //Reset value
    tempreg|=SDMMC_CLKCR_CLKEN;    //Clock is enabled
    tempreg|=(uint32_t)0x76;    //Clock Divider. Clock=48000/(118+2)=400Khz
    //Keep the rest at 0 => HW_Flow Disabled, Rising Clock Edge, Disable CLK ByPass, Bus Width=0, Power save Disable
    SDMMC1->CLKCR=tempreg;
    //Power up the SDMMC
    SDMMC1->POWER = 0x03;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, AlanDrakes said:

Интересное подозрение.. А Вы точно полностью сбрасываете периферию в процессе инициализации? Именно через сброс периферийного блока.

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

В частности, где-то в недрах железки (хотя и на F7) используется такой код:


    // Enable clock
    RCC->APB2ENR |= RCC_APB2ENR_SDMMC1EN;
    // Сброс
    RCC->APB2RSTR |= RCC_APB2RSTR_SDMMC1RST;
    // Антисброс
    RCC->APB2RSTR &= ~RCC_APB2RSTR_SDMMC1RST;
    tempreg=0;            //Reset value
    tempreg|=SDMMC_CLKCR_CLKEN;    //Clock is enabled
    tempreg|=(uint32_t)0x76;    //Clock Divider. Clock=48000/(118+2)=400Khz
    //Keep the rest at 0 => HW_Flow Disabled, Rising Clock Edge, Disable CLK ByPass, Bus Width=0, Power save Disable
    SDMMC1->CLKCR=tempreg;
    //Power up the SDMMC
    SDMMC1->POWER = 0x03;

 

Да вроде так все стоит:

Screenshot_1.png.98c5422b9ce5d5a1a28f3cb4228daa70.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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