Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96

stm32 и I2C Slave

21.09.2020, 22:54. Показов 9383. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, не работает I2C slave использую STM32CubeMX и STM32CubeIDE.
Пробовал через прерывания затем через DMA, ни в какую не хочет принимать данные, да использую HAL библиотеку.
Скорее всего я что-то делаю не так.
Дайте ссылку на рабочий пример или подскажите, мучаюсь уже 2 недели.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.09.2020, 22:54
Ответы с готовыми решениями:

I2C slave
Приветствую всех! Пытаюсь реализовать I2C Slave на плате stm32f429-disco (нужно эмулировать один датчик). Мой слэйв должен принять 0х00...

I2C slave: прием и передача
Добрый день! Понадобилось поднять I2C-slave режим на stm32, чтобы данные принимались и передавались, но что-то не могу догнать как все...

I2C Slave STOP Event
Привет. Есть две отладочные платы на базе stm32f103. Есть желание заставить их общаться по I2C. Сначала я сделал обмен на одной...

25
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
21.09.2020, 23:17
Начните с мастера - так вы хотя бы узнаете, что правильно настраиваете ноги, и физический интерфейс правильно расключен (то бишь, подключены подтяжки). Потом переходите к слейву, предварительно проверив входной сигнал, правильность настройки адреса (попробуйте подвигать его вправо-влево на 1бит, часто в библиотеках R/W бит вставляют прямо в адрес).
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
22.09.2020, 22:41  [ТС]
Всем привет, в режиме мастер работает, передает адрес и не получает ответ т.к. нет slave устройства.
передаю так:
C
1
HAL_I2C_Master_Transmit_DMA(&hi2c1, 0x0E, transmitI2C, 3);
0x0E - адрес.

Как слей не получается, в роли мастера выступает PIC (пакет точно правильный т.к. работает с экраном 1602, а также с памятью).

в main.c
C
1
HAL_I2C_EnableListen_IT(&hi2c1);
описываю прерывания:
C
1
2
3
4
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t direction, uint16_t addrMatchCode);
и ни в одно прерывание не заходит.
Адрес пробовал сдвигать на 1 бит вправо и влево.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
22.09.2020, 23:03
Покажите сгенеренную функцию инициализации I2C, клоков и пинов. I2C у вас 3.3В, надеюсь?
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
23.09.2020, 20:40  [ТС]
Да I2C через делитель подключил т.к. у PIC 5В.
Функция инициализации I2C.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
static void MX_I2C1_Init(void)
{
 
  /* USER CODE BEGIN I2C1_Init 0 */
 
  /* USER CODE END I2C1_Init 0 */
 
  /* USER CODE BEGIN I2C1_Init 1 */
 
  /* USER CODE END I2C1_Init 1 */
  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x0000020B;
  hi2c1.Init.OwnAddress1 = 28;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Analogue filter 
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Digital filter 
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C1_Init 2 */
 
  /* USER CODE END I2C1_Init 2 */
 
}
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.09.2020, 22:22
Цитата Сообщение от pvg_79 Посмотреть сообщение
I2C через делитель подключил т.к. у PIC 5В.
это неправильно. Используйте специфичные решения для I2C (в сети есть красивое решение на полевиках).
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
24.09.2020, 22:37
Цитата Сообщение от pvg_79 Посмотреть сообщение
Да I2C через делитель подключил т.к. у PIC 5В.
Посмотрите в даташите... у STM32 некоторые пины толерантны к 5 В. Какой контроллер и какие пины используются для I2C ?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
24.09.2020, 23:39
Цитата Сообщение от Voland_ Посмотреть сообщение
Используйте специфичные решения для I2C (в сети есть красивое решение на полевиках).
на хрена козе баян? выводы то толерантны
сопротивления нужно смотреть, я когда баловался ставил рекомендованные на 10 КОм, но устойчивой работы добился на 2.2 КОм
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.09.2020, 15:51
Цитата Сообщение от ValeryS Посмотреть сообщение
на хрена козе баян? выводы то толерантны
сопротивления нужно смотреть
В вопросе кроется ответ . На шинах с разными резисторами будет некая "неразбериха" на клоке, т.к. устройства на 3.3В будут ловить его несколько раньше, чем устройства на 5,0В (из-за разницы в компараторах).

ЗЫ: я точно непомню где, но вынужден был использовать эти level-shifter'ы, и именно на шине I2C, т.к. они двунаправленные. Я тут даже ноты от NXP нашел https://www.nxp.com/docs/en/ap... N10441.pdf.
1
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
26.09.2020, 20:27  [ТС]
Контролер STM32F373CC, в даташите написано что 20 ног из 36 толерантны к 5В. но что I2C этого не нашел!
Сделал на резисторах для проверки приема и только, для полной проверки еще не думал сделаю как написал Voland на n10441 или что-то подобное на полевиках, а если входы поддерживают 5 В подключать тупо напрямую???
Ну а по коду, кто ни будь подскажет, как правильно настроить i2C Slave на HAL "ПРИМЕР" лучше всего.

Добавлено через 8 минут
Забыл PA15 - SCL
PB7 - SDA

Добавлено через 10 минут
38 PA15 I/O FTf - I2C1_SCL, ...
43 PB7 I/O FTf - I2C1_SDA, ...

GPIOs Normal I/Os (TC, TTa)
5 volts Tolerant I/Os (FT, Ftf)

Я правильно понимаю, что структура входов PA15 и PB7 (Ftf) - I/O толерантные к 5В?
и я могу их на прямую подключить к PIC&
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
26.09.2020, 21:38
Цитата Сообщение от pvg_79 Посмотреть сообщение
и я могу их на прямую подключить к PIC&
да
и про подтяжку к 3.3 В, или 5 В, не забудь
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
26.09.2020, 22:08
Цитата Сообщение от ValeryS Посмотреть сообщение
и про подтяжку к 3.3 В, или 5 В, не забудь
3.3 PIC может не понять. Лучше к 5 В.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
26.09.2020, 23:07
Цитата Сообщение от Humanoid Посмотреть сообщение
3.3 PIC может не понять.
а 3.6 поймет, допустимое питание для STM
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
27.09.2020, 08:56
вот нашел сайтик, про логические уровни
https://themagicsmoke.ru/cours... evels.html
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
27.09.2020, 16:24  [ТС]
С железом разобрались, подключил через резистор 1к, напрямую что-то боязно.
Давайте попробуем разобраться с кодом, что надо сделать для правильной работы I2C Slave, почему он не принимает и не попадает в прерывания, в отладчике видно что буфер пуст.
Кто ни будь поможет?????
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
27.09.2020, 19:23
Цитата Сообщение от pvg_79 Посмотреть сообщение
подключил через резистор 1к, напрямую что-то боязно.
где? между выводами микроконтроллеров? зря будут завалы фронтов и ничего работать не будет
если между шиной и плюсом питания то нормально, больше ток круче фронты
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
27.09.2020, 19:42  [ТС]
Между контролерами.
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
27.09.2020, 21:24
Цитата Сообщение от pvg_79 Посмотреть сообщение
подключил через резистор 1к
Не будет так работать. У вас внешняя подтяжка к 5 В через резистор (не знаю, какой у вас... обычно ставят от 2 до 5 кОм... иногда до 10 кОм). Допустим, что у вас около 5 кОм (если меньше, то с вашим резистором всё будет ещё хуже). Подтягивающий резистор обеспечивает логическую единицу, а контроллер работает в режиме Open-Drain и может только притягивать к нулю. Но если вы поставили ещё и последовательный резистор 1 кОм, то получится делитель в 6 раз. Т.е. когда контроллер попытается притянуть линию к нулю, то на на линии останется 0.83 вольта. Это слишком высокое напряжение и оно может не восприняться как логический ноль.
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
27.09.2020, 22:11  [ТС]
Заработало!!!
принимает и отвечает НО после ответа линии SDA и SLC притянуты к нулю, определил что притягивает SLAVE.
Мастер из-за этого тупит и зацикливается, ждет окончания операции.
С резисторами и без них работает одинаково, а линии подтянуты к 5В через сопротивление 4к7.
Т.к. контроллер не сгорел, сейчас подключено напрямую без сопротивлений.

Добавлено через 1 минуту
Вот мой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
{
    if(HAL_I2C_EnableListen_IT(hi2c) != HAL_OK)
    {
       //Error
    }
}
 
 
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
{
  UNUSED(AddrMatchCode);
  if(hi2c->Instance == I2C1)
  {
    switch (TransferDirection)
        {
            case I2C_DIRECTION_TRANSMIT:
                if (HAL_I2C_Slave_Seq_Receive_DMA(hi2c, receiveI2C, 1, I2C_FIRST_FRAME) != HAL_OK)
                {
                    //Error;
                }
                //while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_BUSY_RX_LISTEN); //HAL_I2C_STATE_LISTEN
            break;
 
            case I2C_DIRECTION_RECEIVE:
                if (HAL_I2C_Slave_Seq_Transmit_DMA(hi2c, transmitI2C, 2,  I2C_LAST_FRAME) != HAL_OK)
                {
                    // Error here!!! (HAL_BUSY)
                    //Error;
                }
                //while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_BUSY_TX_LISTEN); //HAL_I2C_STATE_READY
            break;
        }
  }
}
Добавлено через 1 минуту
Как заставить его закончить правильно операцию???
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 96
28.09.2020, 23:01  [ТС]
Всем доброго вечера, я так понимаю здесь сидят железячники? А где сидят программеры?
Здесь вообще кто ни будь может помочь по программированию??????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2020, 23:01
Помогаю со студенческими работами здесь

I2C в режиме slave и библиотека CPAL.
Всем добрый день! Вопрос про I2C в режиме slave и библиотеку Lib CPAL. Процессор STM32 F103 VET6 на отладочной плате от WaveShare ...

Master/Slave I2C для ARM на LUFA
Здравствуйте, в качестве лабы в универе задали реализацию общения Slayer и Master по i2p для arm после мучительной пытки гугл всё же...

STM32 F103 и i2c
Здравствуйте! В общем то хотел по шине подключить дисплей (который прекрасно работал с ардуино), но столкнулся с проблемой, что...

STM32 I2C + HP03M
Доброго времени суток! Знаю, что тема уже заезжена, но опять проблема с I2C2. К STM32F4Dyscovery (частота ядра 160MHz) подключен датчик...

STM32 -> I2C -> LCD2004
Добрый день, символьный 4-строчный LCD связан по шине I2C c платой Nucleo F412ZG. Запитан дисплей от вывода 3,3V Nucleo, сама Nucleo...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru