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

eengineer

Новичок
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация

  • Город
    Array

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Благодарю за ответ! Оффтоп - буквально сегодня думал, что форум не активен... Совершенно верно, так и поступил в данном случае. Иностранцы сами не жалуют SparkFun и советуют держаться от них подальше. У меня же проблема двойная - чип mpu9250 без магнетометра(поддельный/бракованный) и библиотека с примерами написана для SAMD плат. Ну и проблема/не проблема, что использую все же не "прямой" доступ к stm32, а надстройку над mbed в "лице" ядра от STMicroelectronics. Безусловно это мой выбор и риски, которые нивелируются огромным сообществом и сотнями библиотек, что очень повышает скорость разработки нужных устройств. Касательно моего вопроса - было просто интересно, почему работа на шине I2C прекращается, без видимых на то причин. В настоящее время просто заменил датчик mpu9250 на Bosch-sensortec BMI160 Одна беда, нет магнитометра, но его получил от другого устройства, отдельным магнитометром на шину I2C. Мануалы читать это очень и очень нудное занятие, тем более в век ИИ и доступной информации на ютубах. Кто-то скажет - это путь неверный, и будет прав. Но в любом случае, кто хочет - всегда найдет истину.
  2. Не сочтите за наглость, но о проблеме писал на гитхабе, но мне там не смогли помочь, т.е. дело вероятно не в ядре, а в примере на библиотеке от SparkFun, для модуля mpu9250 не оптимизированной для STM32. Напишу здесь максимально кратко о проблеме. Имею железо в виде stm32f401ccu6 и esp32 wroom. На esp32 плата mpu9250 в этими примерами прекрасно работает и по I2C и по SPI. А вот с stm32 у библиотеки, что то не заладилось, ни по одному из интерфейсов. Основной интерфейс использую I2C. На том же гитхабе, максимально подробно, описал все шаги, с информацией от анализатора сигналов, что и в какое время происходит на шине I2C. Для BlackPill использую ядро для ардуино это, а для esp32 использую это. В ядрах разные реализации библиотеки TwoWire, файлы wire.cpp и wire.h хоть и имеют начало одного автора, но для стм32 библиотека 2012 года, ну самое главное, в целом она работает нормально. Но в wire для esp32 чего то "подмешали", и она нормально обрабатывает код примеров и как результат, данные с датчика mpu9250 видно в serial порту. С stm32 какие то проблемы, 3 пакета на шине I2C такие же как у esp32, а потом все прекращается, зависает, шина замерзает или что там с ней. 1. write to 0x68 ack data: 0x6B 0x80 2. write to 0x68 ack data: 0x6B 0x00 write to 0x68 ack data: 0x1D 0x48 write to 0x68 ack data: 0x1B 0x18 write to 0x68 ack data: 0x1C 0x00 write to 0x68 ack data: 0x1A 0x03 write to 0x68 ack data: 0x19 0x13 write to 0x68 ack data: 0x1A 0x04 write to 0x68 ack data: 0x38 0x00 write to 0x68 ack data: 0x6A read to 0x68 ack data: 0x00 write to 0x68 ack data: 0x6A 0x00 3. write to 0x68 ack data: 0x37 0x82 write to 0x0C nak read to 0x0C nak write to 0x0D nak read to 0x0D nak write to 0x0E nak read to 0x0E nak write to 0x0F nak read to 0x0F nak write to 0x68 ack data: 0x34 0x04 write to 0x68 ack data: 0x6B 0x40 write to 0x68 ack data: 0x6C 0x3F write to 0x68 ack data: 0x6A read to 0x68 ack data: 0x00 write to 0x68 ack data: 0x64 0x10 write to 0x68 ack data: 0x6A 0x00 Stop Ну и как результат никакие данные от сенсора mpu9250 не получаются. Шина I2C прекрасно работает с другими датчиками BMI160 - аксель и гиро, с BMP180/280 - давление. Да даже с самим датчиком mpu9250 с помощью простого, самописного кода, без библиотеки. #include "Wire.h" const int MPU_addr = 0x68; // sensor address // data array // [accX, accY, accZ, temp, gyrX, gyrY, gyrZ] // acc - acceleration, gyr - angular velocity, temp - temperature (raw) int16_t data[7]; void setup() { // initialization Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up) Wire.endTransmission(true); Serial.begin(115200); } void loop() { getData(); // get data // print for (byte i = 0; i < 7; i++) { Serial.print(data[i]); Serial.print('\t'); } Serial.println(); delay(200); } void getData() { Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers for (byte i = 0; i < 7; i++) { data[i] = Wire.read() << 8 | Wire.read(); } } И все работает. Что то с самой библиотекой от SparkFun, а конкретно следы идут от файла inv_mpu.c и кода на странице 1617. i2c_write(st.hw->addr, st.reg->user_ctrl, 1, &user_ctrl Этот код, согласно комментарию, что то делает с режимом master/slave шины I2C. И вот, stm32 после этого прекращает работу с шиной, а esp32 прекрасно работает и как уже писал выше.... Может, кто-нибудь более "подкован" с железом, и подскажет, что не так делаю или в библиотеке что то "подправить". Я что за эту библиотеку, древнюю, от SparkFun то ухватился вообще? Да потому, что она единственная, кто запустилась(хоть и на esp32) для датчика mpu9250. Остальные, а их перепробовал порядком: https://github.com/kriswiner/MPU9250 https://github.com/asukiaaa/MPU9250_asukiaaa https://github.com/hideakitai/MPU9250 https://github.com/thejmart/GY_91- https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU9250 Ну и, цель была, библиотека: https://github.com/bolderflight/invensense-imu Потому, что она использует для работы EKF с 15-ю состояниями. Но ничего не получилось..stm32 не захотела работать с этим датчиком. Любые дополнительные вопросы по теме приветствуются. Автор ядра от меня отмахался, якобы не проблема его кода, ну что кстати наверное так и есть. Правда, не знаю почему, но когда ставишь скорость шины I2C 100 кГц, то 100 и получается. А вот когда ставишь 400 кГц, то получаешь всего 333 кГц. На том же ядре для esp32 была аналогичная проблема, и ее решили. Так что, что-то с ядре, адаптированном для ардуино под стм32 не так.
  3. Столкнулся с проблемой, которая на 100% связана с НЕ пониманием процесса работы библиотек ардуино и отсутствием собственной базы знаний по программированию. Но это ведь не повод, не заниматься любимым делом, хобби и просто не пообщаться со знающими специалистами на этом форуме? Исходные данные: 1. доступный на гитхабе пример кода, который написан "для" и запускается на устройстве - m5stack 2. микроконтроллер esp32-wroom(D0WDQ5 Rev 3) и дисплей на контроллере ST7789 который подключен по параллельному интерфейсу 8-бит 3. давно использую библиотеку TFT_eSPI и "железо", указанное в пункте 2 успешно работает и отображает все примеры из библиотеки Что сделано: 1. скачаны примеры кода и установлены как библиотека в папку C:\Users\Admin\Documents\Arduino\libraries 2. скачаны файлы m5stack и также установлены в папку с библиотеками Собственно сборка(компиляция) кода. По умолчанию, код примера GaugeWidgets_demo.ino написан в виде скетча и включает следующие библиотеки #include <GaugeWidgets.h> #include <M5Stack.h> #include <Free_Fonts.h> Если начать компиляцию, предварительно выбрав плату в менеджере(забегая вперед, скажу, что результат не изменяется в зависимости от выбранной платы) ESP32 Dev Module или M5Stack-Core-ESP32 Код примера успешно компилируется, загружается в плату esp32 и работает...только изображения нет. А оно и понятно, у меня же дисплей подключен не по SPI как у M5Stack, а по 8-битному параллельному интерфейсу. Используя библиотеку TFT_eSPI, как писал выше, хочу запустить исходный код на своем "железе". Стал разбираться, в головном файле-скетче GaugeWidgets_demo.ino включен файл библиотеки #include <M5Stack.h> Файл подключен именно как "библиотека" и должен быть в своей папке, как я писал выше. Файл, собственно и является, точкой входа во все будущие приключения. В этом файле подгружаются файлы библиотек для работы с кнопками устройства, с датчиками положения и динамиком. Ну и собственно, самой интересной для меня части - дисплеем и файлом #include "M5Display.h" который подключается как вложение из той же папки, что и библиотека. В файле * происходит подключение файлов для работы с дисплеем #include "utility/Config.h" #include "utility/In_eSPI.h" Файлы In_eSPI.h и In_eSPI.cpp это урезанные и устаревшие файлы библиотеки TFT_eSPI Bodmer'а В файле In_eSPI.h есть файл In_eSPI_Setup.h, подключенный так #include "In_eSPI_Setup.h" В этом файле настройки самой библиотеки TFT_eSPI и я стал экспериментировать. Добавил следующие дефайны #define ESP32_PARALLEL #define ST7789_2_DRIVER взамен #define ILI9341_DRIVER Также добавил файлы, определяющие настройки инициализации моего дисплея ST7789 #include "In_eSPI_Drivers/ST7789_2_Defines.h" #define TFT_DRIVER 0x7789 Добавил все в папки, проверил, что файлы открываются и пути правильные. Код примера GaugeWidgets_demo.ino успешно откомпилировался, но дисплей белый... Могу только менять яркость кнопками, это говорит лишь об одно - библиотека дисплея не подключилась должным образом. Пробовал включить библиотеку TFT_eSPI в главный файл скетча GaugeWidgets_demo.ino Но получаю ошибки шрифтов Free_Fonts.h Вообще не понятна линковка в ардуино IDE - файл находиться выше на два уровня, чем папка со скетчем, подключаешь файл через кавычки и файл не определяется при компиляции. #define "../../Free_Fonts.h" И компилятор выдает ошибку. Пробовал и в главном файле скетча добавлять библиотеку #include <TFT_eSPI.h> Но результат нет. Как вообще правильно собрать проект? Столько разных проектов и кодов раньше запускал, пробовал, а здесь прям мистика какая то. Можно вообще как то исключить эту "надстройку" для m5stack и инициализировать библиотеку дисплея TFT_eSPI как то в файле GaugeWidgets_demo.ino Понимаю, у меня пока сумбур, много текста и отсутствие результата. Кто как играми с отдельными проектами, написанными для вывода логотипа в формате PROGMEM на той же библиотеке TFT_eSPI Но различные расширения класса дисплея, в файлах проекта extern TFT_eSprite gdraw; Окончательно запутали следы. Отдельно библиотеку TFT_eSPI использую именно на этом "железе" и проблем никогда не было, ни с инициализацией, ни с подгрузкой шрифтов ни со спрайтами ни с extern. Этот скетч как аномалия... Поэтому прощу помощи с объяснением процесса, и разборками что и как.
×
×
  • Создать...