Jump to content

    

Сергей Борщ

Модераторы
  • Content Count

    9120
  • Joined

Everything posted by Сергей Борщ


  1. Общение с I2C через куб? Достался мне от коллеги проект (правда, на L072) с общением с датчиками по I2C через кубовые функции. Все вроде бы работает нормально, но очень редко и непредсказуемо вдруг оба датчика одновременно как-будто сходят с ума и начинают гнать чушь до снятия питания. Совершенно случайно такой отказ произошел у меня на столе под отладчиком. Что выяснилось: куб по какой-то причине вышел из функции чтения не считав принятый байт (возможно, по таймауту). При следующем чтении он сначала вычитывал оставшийся байт, потом пять байтов из новой транзакции и шестой снова оставлял в регистре приема. Таким образом, все принятые данные сдвигались на один байт. Никакого сброса периферии I2C в случае ошибки там не предусмотрено. Не стал пытаться это исправлять, просто перевел все на свои самописные функции.
  2. Понятия не имею про этот загрузчик, но общие соображения: 1) Состояние BOOTSZ должно соответствовать начальному адресу вашего загрузчика. На всякий случай проверьте. И учтите, что в документации на контроллер, в описании этих битов, начальный адрес области загрузчика указан в словах, а в hex-файле он в байтах, т.е. в два раза больше. 2) Состояние CKSEL указывает на внешний кварц. Он запаян? Его частота соответствует той, на которую расчитан собранный образ вашего загрузчика? Конденсаторы на нем стоят правильного номинала? Есть ли вообще генерация на кварце? 3) CKDIV у вас запрограммирован, т.е. часота кварца делится на 8. Сильно сомневаюсь, что загрузчик задуман работать на такой низкой частоте или что в его коде предусмотрена настройка предделителя (регистра CLKPR). Полагаю, что этот бит должен быть запрограммирован в 1, т.е должна стоять галочка. правильно писать "нибудь" Заведен ли какой-нибудь сигнал с вашего интерфейса на ногу RST? Если нет - то в описании этого загрузчика должна быть описана какая-то команда, при посылке которой ваше приложение должно делать программный сброс (единственный способ сделать это в AVR - запустить собаку (watchdog) и дать ей сработать). Если ничего этого нет - то значит такой команды не предусмотрено.
  3. Это же надо переключить язык, набрать три буквы вместо двух "шт", переключить язык взад. И все ради чего? Какое-то желание выделиться?
  4. А не включен ли у вас аппаратный подсчет контрольных сумм? Возможно, он при отправке учитывает и рассчитанное вами значение и получает в итоге ноль. Там в lwIP была куча #define включения программного подсчета CRC для разных типов пакетов (CHECKSUM_GEN_XXX и CHECKSUM_CHECK_XXX), при использоавании аппаратного подсчета они все должны быть равны нулю.
  5. А вот аналоговое питание надо подавать всегда. От него, кроме очевидных АЦП, компараторов и опоры еще питаетсчя порт C и схема BOR.
  6. Весь низкоуровневый вывод дисплея реализован в одной функции. При смене разводки переписать ее - плевое дело и совсем не напрягает. А вот плодить под каждый проц, порт, бит портянки шаблонов, в которых черт ногу сломит, я как-то пока не созрел. А кроме как в дисплеях мне параллельная шина и не требовалась никогда, все сигналы для ногодрыга однобитовые. Вот такое у меня пока что мнение.
  7. Купите новый чистый 32f103 (цена ему - копейки), впаяйте, делайте с ним все, что захочется. Когда надоест - впаяете на место родной.
  8. Не возбуждайтесь. Я прочитал ваше сообщение на предыдущей странице и, не заметив, что есть еще вторая страница, ответил на него. После публикации увидел предыдущие сообщения и в первом же после вашего, на которое я отвечал, было написано то же самое, что написал я. Именно поэтому я свое сообщение удалил. Удаление сообщений у меня никакими особыми флажками не помечено, я понятия не имею, что оно для своих сообщений доступно только модераторам. Так что на его отсутствие у себя жалуйтесь в лигу сексуальных реформ администраторам в соотвествующем разделе.
  9. Ладно, уговорили. Открывайте отдельную тему с подробным описанием: схема, какие конденсаторы, какой тиристор, особенности конструкции.
  10. Еще одна рекомендация: забыть про рекомендацию ST настраивать неиспользуемые ноги в аналоговый режим и настроить их на вывод. Даже те ноги, которые физически не выведены на корпус - на кристалле эти порты есть.
  11. тогда смотреть листинги других сишных функций и по ним угадывать параметры директивы $DEFFN.
  12. Где-то в тытрубе хвалили вот такой клей: https://www.aliexpress.com/item/Hot-sell-Fuji-red-glue-adhensive-40g-for-SMT-repair-bga-Consumables/32748750004.html Именно для приклеивания вырваных с дорожками USB-разъемов. Пока руки не дошли заказать и удостовериться.
  13. На тытрубе куча роликов, как народ делает контактную сварку из трансформатора от старой микроволновки. Вполне себе бюджетно.
  14. Это был утрированный пример элементарного выражения, приоритет операций в котором известен каждому школьнику старше второго класса. Даже после просмотра кода не понял, что означает "rb" в названии функции. Так что стараюсь давать полные, но не сильно длинные названия функциям. Максимум из двух слов. Остальное вкладываю в имя объекта.
  15. Вот именно поэтому, наверное, и не существует короткой записи "&&=". И более правильно говорить не "один из", а "второй", потому что порядок вычисления операндов для этого оператора строго определен.
  16. К чему споры? Неспособный запомнить элементарное может писать со скобками y = ax+b. И никто ему это запретить не сможет.
  17. Ясно. В програмах под управлением ОС у меня так и сделано. Как это реализовать без ОС я слабо представляю. "Отучаемся говорить за других". Это раз. Второе - как добавление WFI в цикл ожидания завершения прерывания может повлиять на потребеление чего-то за пределеами МК?
  18. Потому что сейчас кроме опроса датчика программа иногда выполняет кубовый стек lorawan, а когда я напишу вместо него свой - программа будет работать под управлением ОС.
  19. думал - чудо свершилось, поставил такой чип и точность любого I2C датчика повысилась. Ан нет, чудес не бывает. Бывают глупые переводчики заголовков.
  20. Буквально на доли процента. Если диаграмма (с WFI) в первом сообщении занимает 1.22 мс, то такая же без WFI - 1.15 мс на потребеление оно не влияет, проверял. Что-то не видел я такого в документации. В какой именно документации это описано? Это мне не подходит. По нулям. Беру паузу разобраться, кто же на плате жрет 3 мА во время сна в пустом цикле без опроса датчика.
  21. Мне проще было сделать бесконечный цикл вместо опроса датчика. Пустой цикл с ногодрыгом ноги - 8.85 мА. Пустой цикл с WFI - 3.05 мА. Хм. Тут тенденция с теорией сходится - с WFI потребеление меньше. Откуда такие огромные цифры - буду копать. В общем - чуда нет, надо трясти. Спасибо за подсказку. Надо разбираться, что там Semtech на пару с кубом в своем стеке наворотили: этот глубокий сон - часть их реализации стека LoRaWAN и что-то они там еще творят перед засыпанием и после просыпания. Просто поскольку в глубоком сне потребеление было вполне адекватное - я туда и не лез. Похоже, надо не датчики к стеку прикручивать, а стек понемногу к датчикам добавлять и смотреть, на каком этапе начнутся чудеса.
  22. И в описании каждого бита написано, что тактирование включается только для тех модулей, которые включены битом EN в регистрах самой периферии. Я решил, что "у нас принято джентельменам верить на слово". Может и врут, надо проверить. Исключений очень мало, SYSCFG, DBG и порты я выключал - не помогло, ПДП я во сне использую. Из остального в регистрах периферии включаю только I2C и TIM6. Да и сильно маловероятно, что даже вся периферия в сумме будет кушать в несколько раз больше ядра (оно по моим прикидкам должно есть 6 мА / 32 МГц = .188 мкА/МГц, каждая периферия в среднем 10 мкА/МГц). Тоже весь день думал об этих регистрах. Сейчас проверю, насколько изменится картина, если сбросить все биты неиспользуемой периферии.
  23. Это потребление всей схемы с датчиками. Датчики в обоих случаях опрашиваются идентично плюс-минус десяток микросекунд. Дерганье или не дерганье ноги TEST в обоих случаях на потребление влияет ниже порога разрешения моего микроамперметра. Дерганье было добавлено уже после обнаружения эффекта - чтобы убедиться, что программа действительно останавливается в одном случае и выполняется во втором.
  24. 5 секунд в режиме stop, sleepdeep установлен, выход из stop возможен по EXTI и по событиям RTC, который заведен на EXTI. В этом режиме с потреблением все красиво. Далее просыпаемся и работаем с I2C, во время ожидания прерываний от I2C переходим в sleep, sleepdeep сброшен. И вот в это время потребление больше, чем когда вместо перехода в sleep тупо в цикле опрашиваем переменную. Старался описать максимально подробно, чтобы было больше информации к размышлению. Может вы невнимательно прочитали?