Димон Безпарольный 2 3 мая, 2019 Опубликовано 3 мая, 2019 (изменено) · Жалоба Уже закипел. Функция открытия файла выдает ОК. А 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"); } Спасибо. Изменено 3 мая, 2019 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 4 мая, 2019 Опубликовано 4 мая, 2019 · Жалоба 12 hours ago, Димон Безпарольный said: Срабатывает даже первое условие - объект нулевой!! Объект это ведь &outFile, нужно смотреть в эту сторону... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 4 мая, 2019 Опубликовано 4 мая, 2019 · Жалоба 2 hours ago, Integro said: Объект это ведь &outFile, нужно смотреть в эту сторону... Сей эффект обнаруживается только после программирования. Если передергивать питание, то все ок. Если кто попадется на эти грабли... Причина мне неизвестна такого поведения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 5 мая, 2019 Опубликовано 5 мая, 2019 · Жалоба Как всегда все банально. Снизил тактовую в hsd.Init.ClockDiv = 9; и все заработало. Можно списать на неграмотную разводку потому что конденсатор я приляпал прямо к выводам слота. Тантал 100мкф. Вот значения делителя: //5 - не прокатило //6 - не прокатило //7 - не прокатило. Но держалась долго //8 - не прокатило //9 - работает даже после программирования //10 - работает только после подачи питания. После программирования не работает //11 - не прокатило //12 - не прокатило. Но держалась долго //13 - работает даже после программирования //14 - работает даже после программирования //15 - работает даже после программирования //16 - работает даже после программирования //17 - работает даже после программирования //18 - работает даже после программирования //19 - работает даже после программирования //20 - работает даже после программирования Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 7 мая, 2019 Опубликовано 7 мая, 2019 · Жалоба Интересное подозрение.. А Вы точно полностью сбрасываете периферию в процессе инициализации? Именно через сброс периферийного блока. Это можно быть причиной, когда после перепрограммирования программа начинает выполняться не после аппаратного сброса, а посредством установки указатетя выполнения на начальный адрес. В частности, где-то в недрах железки (хотя и на 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 7 мая, 2019 Опубликовано 7 мая, 2019 · Жалоба 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; Да вроде так все стоит: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться