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

Подскажите по HAL stm32 и I2C

Есть прога написана с 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, &regData, 2);

на ней все и виснет, что тут сделать ?

Нужно сбросить какой нить флаг, вызвать какую нить функцию ? Гугля как то слабо помогает скорее запутывает )

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что тут сделать ? Нужно сбросить какой нить флаг, вызвать какую нить функцию ?
\Страшным голосом: \ Обработчик прерывания писАть...
В ISR регистр гляньте (для общего развития) - сколько там флагов\признаков у I2C есть; не меньше трёх обрабатывать ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, whale сказал:

Нужно загнать передачу по i2c в прерывания.

А в какое прерывание вы хотите загнать передачу? По изменению уровня на каком-то пине и потом инициализировать передачу? Или ещё по какому событию?

Изменено пользователем Vlad_G

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде разобрался, подскажите функцией 

HAL_I2C_Master_Transmit_IT (&hi2c2, SSD1306_ADDRESS, &regData, 8);

можно отправить за один раз несколько команд с одним адресом или хотя бы с повстартом без танцев с бубном ?

Или только один вариант адрес+последовательно байты 

Те хотелось бы за один раз отправить 

адрес+байты...адрес+байты итд 

или адрес+байты+повстарт+байт ...+повстарт

и все это загнать в regData

Просто для управления дисплеем ssd1306 даже переход на нужную позицию занимает 3 разные  команды

а вывод сразу всей памяти дисплея слишком долго получается. 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, whale сказал:

можно отправить за один раз несколько команд с одним адресом или хотя бы с повстартом без танцев с бубном ?

Можно. На XMC4xxx  :wink:

И даже без халов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, jcxz said:

И даже без халов.

Прога не моя так что без hal тут затруднительно, вообщем во всем разобрался всем спасибо.

Давно заметил как куда нить опишешь проблемму так она сама начинает решаться )

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Название этой темы подходящее для моего вопроса, а потому задам свой вопрос здесь. Прошу извинить меня, если такой вопрос кто-то раньше уже задавал и получился на него ответ, т.к. просмотреть поиском все сообщения, касающиеся 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);

Но никакого эффекта это действие не произвело - на обоих линиях вижу низкий уровень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, Xenia сказал:

Вопрос мой таков: возможно ли у контроллера STM32F103C8T6 подтянуть обе линии (SCL и SDA) к питанию с помощью механизма PULLUP?

Внутренняя подтяжка слишком высокоомная, чтобы обеспечить нормальную работу I2C. С другой стороны это может быть немного опасно, если вы подключаете 3.3 В микроконтроллер к 5В I2C. Поэтому мне кажется вы хотите странного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Xenia сказал:

GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

У вас написано AF_OD - Alternative Open Drain, скорее всего он не дает включить pullup

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У 103-го нет такого режима - выхода OD с подтяжкой. У F030 - есть.  Но внутренняя подтяжка около 50 кОм, а для нормальной работы I2C требуется в диапазоне 1,5 - 4,7 кОм

А вообще, лучше всего заглянуть в мануал:

Снимок экрана 2023-04-16 012613.png

Снимок экрана 2023-04-16 012741.png

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, EdgeAligned сказал:

У 103-го нет такого режима - выхода OD с подтяжкой.

Благодарствую за ответ! Примерно это я и подозревала, когда увидела, что, несмотря на мои потуги, подтяжка так и не появилась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А тогда еще один вопрос про 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 тоже он создает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переведите ноги в режим OUT Open-Drain. И помахайте ногами этими программно. Если работают, то дело явно где-то в коде))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...