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

murmur

Участник*
  • Постов

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

  • Посещение

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


  1. Друзья, ну никак не получается if (f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 1) == FR_OK) { } if (f_mount(&SDFatFS, (TCHAR const*)SDPath, 1) == FR_OK) {} CurrentPath="0:"; res = f_opendir(&dir, CurrentPath); files_found=0; res3 = f_readdir(&dir, 0); while(1) { res4 = f_readdir(&dir, &fileInfo); if (res4==FR_OK && fileInfo.fname[0]) { files_found++; } else break; } f_closedir(&dir); CurrentPath="1:"; res = f_opendir(&dir, CurrentPath); files_found2=0; res3 = f_readdir(&dir, 0); while(1) { res4 = f_readdir(&dir, &fileInfo); // ВОТ ЗДЕСЬ res4 равен FR_DISK_ERR if (res4==FR_OK && fileInfo.fname[0]) { files_found2++; } else break; } f_closedir(&dir); Монтирую оба диска - второй (USB) при таком коде не читается Если не понтировать SD диск, то все хорошо.
  2. Вторую проблему решила принудительной переинициализацией SD.
  3. Вопрос №1 Нужно ли при смене диска на новый деинициализировать старый? То есть, как правильно, вот так f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0); f_mount(&SDFatFS, (TCHAR const*)SDPath, 0); или вот так? f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0); f_mount(NULL, (TCHAR const*)USBPath, 0); f_mount(&SDFatFS, (TCHAR const*)SDPath, 0); Вопрос №2. У меня на STM32H743, в сгенерированном калокубом проекте настроены USB MassStorage Class и SD интерфейс. Инициализирована FatFS, по умолчанию подключен USB диск. f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0); По таймеру вызываю функцию проверки статуса DSTATUS DS0,DS1; DS0=disk_status(0); DS1=disk_status(1); Извлечение и повторное подключение флешки ловятся на ура. Ну и с чтением после повторного подключения флешки все нормально. Извлечение SD карты тоже ловится, однако при повторном вставлении карты она уже не читается. Монтирование диска выдает ошибку FR_INVALID_OBJECT. До перезагрузки. Как бороться с этой бедой? Добавлю - если карта единожды извлечена, то потом, даже если ее вставить, SD_STATE=BSP_SD_GetCardState(); всегда выдает ошибку...
  4. Возможно, но с 0 и 1 работало.
  5. FatFS + SD и USB одновременно

    Проект для STM32H743, генерированный столь нелюбимым всеми калоКубом. Вроде бы раньше у меня получалось отдельно запускать SD и отдельно USB. А вот вместе - никак..... Железо инициализируется без проблем. Проблемы начинаюся в FATFS. Вот я (а точнее, не я, а любезный калокуб) инициализирую FatFS под два носителя void MX_FATFS_Init(void) { /*## FatFS: Link the SD driver ###########################*/ retSD = FATFS_LinkDriver(&SD_Driver, SDPath); /*## FatFS: Link the USBH driver ###########################*/ retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath); /* USER CODE BEGIN Init */ /* additional user code for init */ /* USER CODE END Init */ } Когда USB драйвер полностью инициализирует все необходимое для работы с флешкой, пишу вот это if (f_mount(&USBH_fatfs, (TCHAR const*)USBHPath, 0) != FR_OK) { sprintf((char *)MSC_str, "Cannot Initialize FatFs! \r\n "); HAL_UART_Transmit(&huart7, MSC_str, strlen((char *)MSC_str), 3000); } else { sprintf((char *)MSC_str, "INFO : FatFs Initialized \r\n "); HAL_UART_Transmit(&huart7, MSC_str, strlen((char *)MSC_str), 3000); res=f_open(&MyFile, "0:/USBHost.txt", FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK) { sprintf((char *)MSC_str, "Cannot Open 'USBHost.txt' file \r\n "); /// Брейкпоинт срабатывает здесь, выдает ошибку FR_NOT_ENABLED HAL_UART_Transmit(&huart7, MSC_str, strlen((char *)MSC_str), 3000); } FR_NOT_ENABLED - вроде как ошибка буквы диска. Меняю вызов файла 0:/USBHost.txt на 1:/USBHost.txt Получаю там же другую ошибку - FR_NO_FILESYSTEM В другом месте есть работавший ранее с SD код CurrentPath="0:/"; if (f_mount(&fileSystem, "", 0) == FR_OK) { res = f_opendir(&dir, CurrentPath); files_found=0; res = f_readdir(&dir, 0); while(1) { res = f_readdir(&dir, &fileInfo); if (res==FR_OK && fileInfo.fname[0]) { files_found++; } else break; } } Там уже другая ошибка - FR_INVALID_OBJECT Что не так? Я даже не могу понять, что какие диски (0:\ и 1:\) чему соответствуют - что относится к USB, а что к SD. Где это задается?
  6. Легко расслаивала платы скальпелем, в чем проблема? Кстати, а вы думали, что обрыв может быть не в проводнике, а в переходном отверстие? Как вам расслоение сможет помочь?
  7. Занят FS. Ну и речь шла о том, чтобы использовать не просто контроллер, а все плату. Собственно плата, хотя и предназначена под конкретную задачу, ничем специфическим не отличается - разведен интерфейс под дисплей и QSPI, наружу на разъемы выведены ЦАП и АЦП, а также гребенка из 18 GPIO, ну и USB_HS. Воткнуть такую плату можно куда угодно, хоть в умный дом (умную дачу, что в общем то было в далеких планах). Случалось сопли не замечать на соседних ногах. Случалось, подавая в режиме отладки меандр, щупом осциллографа замыкать соседние ноги, иногда эти ноги соседствовали с GND и VCC - никогда ничего не выгорало. За всю жизнь кривыми руками спалила штук STM32, они всегда выгорали наглухо, превращая микросхему в нагревательный элемент, причиной были какие-то косяки с землей (конфликты с землей компьютера, землей сопрягаемой платы).
  8. Вот как раз в подобном случае вероятность перегорания наименее вероятна. В моей ситуации было 2 особенности 1. Вторая микросхема была "чужеродна". 2. Вторая микросхема к тому же была и неисправна. У нее есть еще ноги, которые только на выход, почему у контроллера перегорела в обоих случаях именно DIR Вот именно. У меня есть куда воткнуть оба контроллера, ну подумаешь, USB нельзя использовать.
  9. Вот ведь как... Все было дело в неисправной USB3300. Поменяла её, поменяла Stm32, все заработало, осциллограммы в норме, инициализация usb проходит, класс MSC регистрируется. Маленькие дети! Ни за что на свете! Не подключайте, дети, push pull к земле...
  10. Было бы смешно, если бы не было так грустно... Как я написала выше, проблема исчезла. Это значит, что после смены контроллера я получила на ноге меандр. Напаяла я обратно USB3300, с которой посредством сгоревшей линии контроллер и связывается - не определяется флешка... Дай, думаю, проверю, вдруг не пропай где - меняю код, вывожу на все ноги меандр. И что вы думаете - через какое-то время та же самая нога сдыхает. Начинаю понимать, что моё предположение о том, будто нога была убита статикой, в результате чего свзяка STM+USB3300 не работала, оказался неверным. Скорее всего проблема первично локализовалась в USB3300, а попытка включить все ноги в режим меандр выжигала одну из ног. Лезу в даташит. Из даташит узнаю, что линия DIR оказывается дёргается не контроллером, а микросхемой USB3300, то есть, она является мастером, а не STM. А вход DIR у Stm32 является именно входом Отсюда вопрос - мог ли, исходя из особенностей схемотехники портов ввода-вывода, подобный конфликт убить ногу контроллера? Иными словами, если есть две микросхемы, обе ноги которых расстроены на выход, то возможен ли выход из строя одной из них, если на этих выводах появятся разноименные сигналы? Насколько я знаю, ногу Stm32 можно припаять к земле и подать на неё логическую 1, при этом с ней ничего не случится... Что скажете? К сожалению, в даташите на USB3300 нет ничего про схемотехнику линий управления...
  11. Да... это была сгоревшая нога. После смены контроллера проблема исчезла
  12. Да я уже в общем то контроллер сдула. Новый не напаяла но вы меня так пугаете. Перспективой переделывать плату. Это намёк на что? На то, что нога железно присоединена к АЦП? И настройками это не вырубить? Вряд ли - у этой ноги есть альтернативная функция - ULPI_DIR, она есть только на этой ноге, стало быть как то это можно отключать. Но я АЦП не использую. Так что вряд-ли причина в этом. К тому же на другой плате я уже использовала USB HS на данном контроллере и именно эту ногу, проблем не было.
  13. STM32H7 Все пины порта C настроены на выход, и на все пины подан меандр. Вот осциллограмма со здорового пина А вот с проблемного пина - PC2 Причем пин отпаян от контактной площадки и приподнят над ней. До этой операции на осциллограмме всегда был ноль, хотя дорожка ведет в никуда (к микросхеме, которая пока не напаяна). Вот настройка GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); Вот что видно в отладчике Как видно, в регистрах нормального пина PC0 и проблемного PC2 - все идентично (в остальных, не приведенных в скринах) все так же. Резюмируя - нога отпаяна, посторонние влияния, коротыши, исключены. С регистрами тоже все в порядке, никакой "жучок" их состояния не портит. Вопрос - контроллер на выброс? Или могут быть другие неочевидные, но труднопроверяемые наугад причины - настройки питания и бог знает еще чего, неисправные блокировочные конденсаторы.... Уж очень не хочется возиться с перепайкой да и выкидывать недешевый камень. К слову - на абсолютно идентичной плате впаян STM32F7 - с ним проблем нет, значит как минимум ошибок монтажа нет. P.S. - в настроенном на альтернативную функцию режиме ( ULPI_DIR) пин тоже не работает....
  14. Друзья, контроллер STM32F7, рисуется у меня картинка - сначала фон на весь экран, потом мелкий фрагмент. Хочу предварительно сохранить фон где-нибудь за пределами графической области, а потом вставлять оттуда при случае. Для того, чтобы понять принцип DMA2D копирования в режиме Memory-to-Memory, написала простенький код. который сначала делит экран на 4 области и раскрашивает каждую разными цветами, затем копирует одну область экрана в другую. Все это в цикле, переменные на лету меняю в отдладчике, дабы не перепрошивать каждый раз uint32_t offset=0x00000000; uint32_t source_addr=0xD0000000; uint32_t dest_addr=0xD00F0000; uint16_t width=500; uint16_t height=450; while(1) { TFT_FillRectangle(0,0,511,299,0xFF0000); // левый верхний - в красный цвет TFT_FillRectangle(512,0,1024,299,0x00FF00); //правый верхний - в зеленый TFT_FillRectangle(0,300,511,600,0x0000FF); //левый нижний - в синий TFT_FillRectangle(512,300,1024,600,0xFFFF00); //правый нижний - в желтый HAL_Delay(500); // Смотрим hdma2d.Init.Mode = DMA2D_M2M; hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB888; hdma2d.Init.OutputOffset =offset; if(HAL_DMA2D_Init(&hdma2d) == HAL_OK)// Настраиваем { if(HAL_DMA2D_Start(&hdma2d, source_addr, dest_addr, width, height) == HAL_OK) // копируем { HAL_DMA2D_PollForTransfer(&hdma2d, 10); } } HAL_Delay(500); } С указанными начальными данными полоса из верхней области экрана, шириной во весь экран, копируется куда-то вниз. Параметры source_addr, dest_addr, width, height мне интуитивно понятны. Но так и не получилось скопировать ограниченную прямоугольную область. Подскажите, как этой функцией скопировать прямоугольник размерами 100х100 из координат 50,50 в координаты 400,400 ?
  15. То есть, программатор отключать после отключения основного питания?
  16. Накаркали! Контроллер сгорел. Я не знаю от чего, возможно из-за кривизны рук - гирлянда могла платы контактом коснуться, проводки, переменный резистор. Но.... хотелось бы все-таки понять ваш намек на опасность сгорания - он о чем? О согласовании путем перевода в OD и подтяжки от 5 вольт? Смотрите, как сделала я - перевела ногу в OD, резистор 300 ом к 5 вольтам. Но на плате у меня 5 вольт нет, я их взяла от китайского свистка ST-link V2 - там 5 вольт наружу выведено. Блок питания у меня высокоамперный (при КЗ на проводах плавится изоляция). Так вот в моем случае расплавился провод GND, ведущий от ST-Link к плате. На плате больше ничего не сгорело, только контроллер. Могла быть причиной примененная мной схема согласования, раз уж вы об этом завели речь? У меня такое уже бывало несколько раз, это не может быть как-то связано с взаимодействием земель компьютера и контроллера?
  17. Гре...ные китайцы. По даташиту, если на SET единица, то это LowSpeed, если висит в воздухе - HighSpeed. Распознав висящий в воздухе пин и прочитав даташит, я решила, что это великая задумка - включить режим HighSpeed. Но все оказалось по китайски просто - видать поставили микросхемы из рисовой муки, не поддерживающие HighSpeed. А раз не поддерживающие, то и вывод SET можно оставить в воздухе. Это то меня и сбило с толку - я поставила половинные тайминги. Изменила тайминги на обычные, все заработало как часы. Вот только R,G и B у них действительно перепутаны. Что до пуллап-резистора - схема работает в широких его пределах, но красивая и идеологически правильная осциллограмма получается только при 300 ом.
  18. То есть, приведено к интуитивно-логически понятному формату, единица - это закрытый транзистор? Эмиттерный повторитель... по количеству деталей проще одногейтовый согласователь))) А по поводу осциллограммы - у меня переменный резистор на 10 к. И такая осциллограмма появляется при очень узком диапазоне сопротивлений, так что даже руками трудно выставить.... может резистор гнилой.... Устала что-то.... к черту все до завтрашнего дня... То есть, даем команду опустить на 100 мкс, и на 51 мкс диоды обновятся? Или зажгутся? Пока идет программирование, они выдают предыдущее состояние или гаснут?
  19. И не работает..... Ни с OpenDrain ни с PushPull Взяла 5 вольт от программатора, прицепила резистор. Ножку вот так GPIO_InitStruct.Pin = LED_DATA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); Получила осциллограмму Светодиода беспорядочно мерцают. Первая мысль - из за заваленных фронтов опять сбои чтения. Но..! Во первых, светодиод моргают одним и тем же цветом (то есть нет случайных ошибок чтения), во вторых цвет смещен. То есть, если писать 255,0,0 - горит не красный, а синий, если 0,0,255 - не синий, а зеленый. Может глянете код выше - там где то собака порылась? Вопрос - после того как записалось - линию в ноль на 50 мкс, а дальше - ее нужно в единицу? Когда гореть должно начать? После прошествия 50 мкс или после 50 мкс и перевода в единицу? Второй вопрос - уже по STM. Если бит установить в единицу, то транзистор открывается и притягивает линию к земле? Или закрывается и отпускает? Эх... похоже проблема нерешаема на OPENDRAIN Вот - все уже опробовано до нас http://we.easyelectronics.ru/STM32/gpio-vyhod-v-rezhime-opendrain.html
  20. Так.... поставила первое, что попалось под руку - 5.1 к. Выход настроила так GPIO_InitStruct.Pin = LED_DATA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); Получила такую осциллограмму Верхняя точка - 3.3 вольт. Кто виноват? Резистор поменьше надо?
  21. не более 50 см. в данный момент 10 см Так ведь вот чего Din и VDD рядом
  22. Господа, а финт ушами с OpenDrain и подтяжкой пройдет?
  23. Так звоны делают свое дело. И там не 5 вольт надо, а 0.7 от VDD. Переключила выход на VERY_HIGH - светодиод замигали веселее. Скажите, а в качестве меры согласования уровней можно включить выход в OPEN_DRAIN и подтянуть резистором к 5 вольтам? Будет работать?
×
×
  • Создать...