whale 6 20 марта, 2023 Опубликовано 20 марта, 2023 (изменено) · Жалоба Есть прога написана с HAL, нужно ее немного подправить, изучать cube смысла нет на один раз. Нужно загнать передачу по i2c в прерывания. Сама инициализация и HAL_I2C_Master_Transmit работает. Я так понимаю нужно разрешить прерывания , делаю так: HAL_I2C_EV_IRQHandler(&hi2c2); HAL_NVIC_SetPriority(I2C2_EV_IRQn, 1, 2); HAL_NVIC_EnableIRQ(I2C2_EV_IRQn); потом вызываем HAL_I2C_Master_Transmit_IT(&hi2c2, SSD1306_ADDRESS, ®Data, 2); на ней все и виснет, что тут сделать ? Нужно сбросить какой нить флаг, вызвать какую нить функцию ? Гугля как то слабо помогает скорее запутывает ) Изменено 20 марта, 2023 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 20 марта, 2023 Опубликовано 20 марта, 2023 · Жалоба что тут сделать ? Нужно сбросить какой нить флаг, вызвать какую нить функцию ? \Страшным голосом: \ Обработчик прерывания писАть... В ISR регистр гляньте (для общего развития) - сколько там флагов\признаков у I2C есть; не меньше трёх обрабатывать ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 8 21 марта, 2023 Опубликовано 21 марта, 2023 (изменено) · Жалоба 10 часов назад, whale сказал: Нужно загнать передачу по i2c в прерывания. А в какое прерывание вы хотите загнать передачу? По изменению уровня на каком-то пине и потом инициализировать передачу? Или ещё по какому событию? Изменено 21 марта, 2023 пользователем Vlad_G Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 марта, 2023 Опубликовано 21 марта, 2023 (изменено) · Жалоба Вроде разобрался, подскажите функцией HAL_I2C_Master_Transmit_IT (&hi2c2, SSD1306_ADDRESS, ®Data, 8); можно отправить за один раз несколько команд с одним адресом или хотя бы с повстартом без танцев с бубном ? Или только один вариант адрес+последовательно байты Те хотелось бы за один раз отправить адрес+байты...адрес+байты итд или адрес+байты+повстарт+байт ...+повстарт и все это загнать в regData Просто для управления дисплеем ssd1306 даже переход на нужную позицию занимает 3 разные команды а вывод сразу всей памяти дисплея слишком долго получается. Изменено 21 марта, 2023 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 21 марта, 2023 Опубликовано 21 марта, 2023 · Жалоба 3 часа назад, whale сказал: можно отправить за один раз несколько команд с одним адресом или хотя бы с повстартом без танцев с бубном ? Можно. На XMC4xxx И даже без халов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 марта, 2023 Опубликовано 21 марта, 2023 (изменено) · Жалоба 7 hours ago, jcxz said: И даже без халов. Прога не моя так что без hal тут затруднительно, вообщем во всем разобрался всем спасибо. Давно заметил как куда нить опишешь проблемму так она сама начинает решаться ) Изменено 21 марта, 2023 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 42 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба Название этой темы подходящее для моего вопроса, а потому задам свой вопрос здесь. Прошу извинить меня, если такой вопрос кто-то раньше уже задавал и получился на него ответ, т.к. просмотреть поиском все сообщения, касающиеся I2C, невозможно (очень долго пришлось бы искать). Вопрос мой таков: возможно ли у контроллера STM32F103C8T6 подтянуть обе линии (SCL и SDA) к питанию с помощью механизма PULLUP? Мой CubeMX (v5.3) не дает это сделать - для этого контроллера установки PULLUP и PULLDOWN вообще нет, а в таблице значится "n/a". Пыталась установить PULLUP вручную, вот так: /**I2C1 GPIO Configuration PB8 ------> I2C1_SCL PB9 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); Но никакого эффекта это действие не произвело - на обоих линиях вижу низкий уровень. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба 9 минут назад, Xenia сказал: Вопрос мой таков: возможно ли у контроллера STM32F103C8T6 подтянуть обе линии (SCL и SDA) к питанию с помощью механизма PULLUP? Внутренняя подтяжка слишком высокоомная, чтобы обеспечить нормальную работу I2C. С другой стороны это может быть немного опасно, если вы подключаете 3.3 В микроконтроллер к 5В I2C. Поэтому мне кажется вы хотите странного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 75 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба 12 минут назад, Xenia сказал: GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; У вас написано AF_OD - Alternative Open Drain, скорее всего он не дает включить pullup Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 15 апреля, 2023 Опубликовано 15 апреля, 2023 (изменено) · Жалоба У 103-го нет такого режима - выхода OD с подтяжкой. У F030 - есть. Но внутренняя подтяжка около 50 кОм, а для нормальной работы I2C требуется в диапазоне 1,5 - 4,7 кОм А вообще, лучше всего заглянуть в мануал: Изменено 15 апреля, 2023 пользователем EdgeAligned 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 42 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба 53 минуты назад, makc сказал: Внутренняя подтяжка слишком высокоомная, чтобы обеспечить нормальную работу I2C. С другой стороны это может быть немного опасно, если вы подключаете 3.3 В микроконтроллер к 5В I2C. Поэтому мне кажется вы хотите странного. Я не странного хочу, а хочу увидеть напряжение подтяжки с помощью вольтметра/тестера. У STM32 внутренний резистор подтяжки около 30 К, а потому его должно быть достаточно, чтобы обнаружить это напряжение обычным вольтметром, не требуя применения особо высокоомного. Тогда как у себя я вижу чистый ноль до 2-го знака после десятичной точки. Тем более что подтяжкой на STM32 я и раньше пользовалась, а потому вполне могу судить о том, есть она или нет. 49 минут назад, HardEgor сказал: У вас написано AF_OD - Alternative Open Drain, скорее всего он не дает включить pullup Когда передачи нет, то потенциал обеих линий (SCL и SDA) высокий. Стало быть, установленный режим Open Drain не может быть в этом виноват. Тем более что даже при наличии передачи по линии I2C среднее напряжение на линиях не только не упадет до нуля, но и не уменьшится более чем вдвое по отношению у напряжению подтяжки на линии. Между тем, прежде я уже создавала PULLUP-подтяжку на Open Drain и она нормально работала. Только это было на контроллерах STM32F407VET6 и STM32F407ZGT6, а линия то была - MOSI от интерфейса SPI. /**SPI1 GPIO Configuration PB3 ------> SPI1_SCK PB4 ------> SPI1_MISO PB5 ------> SPI1_MOSI */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4; // MISO, SCK GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_5; // MOSI to open drain! GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // alternate with open drain! GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); И тогда не только напряжение на PB5 было, то и связь на такой подтяжке работала (правда с невысокой скоростью - 1312 КГц) с магнитным датчиком TLE5011. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба RM четко отвечает, что нельзя подтянуть. Цитата 9.1.9 Alternate function configuration When the I/O Port is programmed as Alternate Function: The Output Buffer is turned on in Open Drain or Push-Pull configuration The Output Buffer is driven by the signal coming from the peripheral (alternate function out) The Schmitt Trigger Input is activated The weak pull-up and pull-down resistors are disabled. The data present on the I/O pin is sampled into the Input Data register every APB2 clock cycle A read access to the Input Data register gets the I/O state in open drain mode A read access to the Output Data register gets the last written value in Push-Pull mode Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 42 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба 12 минут назад, EdgeAligned сказал: У 103-го нет такого режима - выхода OD с подтяжкой. Благодарствую за ответ! Примерно это я и подозревала, когда увидела, что, несмотря на мои потуги, подтяжка так и не появилась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 42 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба А тогда еще один вопрос про I2C: бывало ли у кого, чтобы I2C "сгорела"? В смысле того, что напряжения на линиях на холостом ходу нормальное (3.23 V), но STM32 (всё тот же STM32F103C8T6) в режиме мастера никаких сигналов не выдает (логический анализатор на линиях ничего не видит). А то у меня уже вторая плата "подыхает" по этой же причине - I2C "отваливается", хотя в остальном всё вроде бы в порядке. Плату меняла на другую (точно такую же), после чего примерно сутки работало, а утром при включении снова I2C попало. Режим линий у STM32 - Open Drain, напряжение на линиях внешнее +3.23 V, а если закротить на землю, то получаю ток 0.325 mA. Т.е. ток вроде бы совсем небольшой, чтобы повредить контроллеру. А началось всё с того, что силовой ключ себе купила, вот такой: https://wiki.iarduino.ru/page/power-key-4p-i2c-datasheet/ , а управление им только через I2C. Силовым напряжением я него не нагружала, а питала от источника 5 V, причем того же самого, из которого LDO на плате делает напряжение 3.3 V для питания этого STM32. Подтяжку на линиях I2C тоже он создает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 апреля, 2023 Опубликовано 15 апреля, 2023 · Жалоба Переведите ноги в режим OUT Open-Drain. И помахайте ногами этими программно. Если работают, то дело явно где-то в коде)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться