Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50

I2C slave: прием и передача

30.08.2015, 18:43. Показов 8552. Ответов 5
Метки нет (Все метки)

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

Code
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
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
 
// Настройка GPIO, PB6,PB7 на I2C1
GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;   // AF
GPIOB->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7;      // Open-Drain
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR6_0 | GPIO_PUPDR_PUPDR7_0;   // Pull-Up
GPIOB->AFR[0] |= GPIO_AFRL_6_2 | GPIO_AFRL_7_2;            // AF4 -> I2C
 
// Настройка I2C1
I2C1->CR1 |= I2C_CR1_ACK;
I2C1->CR2 |= I2C_CR2_FREQ_1;
I2C1->OAR1 |= I2C_OAR1_ADD3 | I2C_OAR1_RESERVED_14;
I2C1->CCR &= ~I2C_CCR_CCR;
I2C1->CCR |= 0x0A;
I2C1->TRISE = 3;
I2C1->CR1 |= I2C_CR1_PE;
 
I2C1->CR1 |= I2C_CR1_START;  // Send START
while (!(I2C1->SR1 & I2C_SR1_SB));
 
(void) I2C1->SR1;
I2C1->DR = 0xA0;  // Send address
while (!(I2C1->SR1 & I2C_SR1_ADDR));
 
(void) I2C1->SR1;
(void) I2C1->SR2;
 
I2C1->DR = 0xCD;  // Transmit data
while (!(I2C1->SR1 & I2C_SR1_BTF));
На другой стороне никого нет, т.е. МК вещает в пустоту и после адреса ничего и не должно быть (т.к. фактически NACK придет, т.е. никто не принял адрес), но хотя бы передачу адреса хотелось бы видеть. Но нет, на экране осциллографа молчок полный.
Пока сделано без прерываний и прочего, потом можно будет уже улучшить код. Камень F407.

Куда копать, чтобы запахало?

З.Ы. SPL, HAL, CPAL - использоваться не будет, потому все именно так.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.08.2015, 18:43
Ответы с готовыми решениями:

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

stm32 и I2C Slave
Добрый день, не работает I2C slave использую STM32CubeMX и STM32CubeIDE. Пробовал через прерывания затем через DMA, ни в какую не хочет...

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

5
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
30.08.2015, 20:22
Цитата Сообщение от Dirdymyomsky
На другой стороне никого нет
F4 Дискавери?
И вот это GPIO_AFRL_6_2 , GPIO_AFRL_7_2 озвучьте .
0
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
30.08.2015, 21:03
Да, на дискавери.

Code
1
2
3
4
5
6
7
8
9
10
11
#define BIT(x)   (1<<x)
 
#define GPIO_AFRL_6_0   BIT(24)
#define GPIO_AFRL_6_1   BIT(25)
#define GPIO_AFRL_6_2   BIT(26)
#define GPIO_AFRL_6_3   BIT(27)
 
#define GPIO_AFRL_7_0   BIT(28)
#define GPIO_AFRL_7_1   BIT(29)
#define GPIO_AFRL_7_2   BIT(30)
#define GPIO_AFRL_7_3   BIT(31)
Просто биты, задающие альтернативную функцию. Для I2C находится в AF4, это соответствует комбинации 0100, соответственно 2й бит нужно проставить.

UPDATE1: ACK бит в I2C_CR1 выставлять нужно после установки бита PE там же, т.е. после включения модуля I2C.
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 50
30.08.2015, 21:15
// Настройка GPIO, PB6,PB7 на I2C1

GPIOB->AFR[0] |= GPIO_AFRL_6_2 | GPIO_AFRL_7_2; // AF4 -> I2C

Так писать нельзя , может быт куча ошибок .
Перед тем как установить нужные биты все остальные надо обнулить .
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
30.08.2015, 21:28
Цитата Сообщение от Dirdymyomsky
Да, на дискавери.
PB6 занят - SCL CS43L22

Цитата Сообщение от Dirdymyomsky
Просто биты, задающие альтернативную функцию. Для I2C находится в AF4, это соответствует комбинации 0100, соответственно 2й бит нужно проставить.
Я все это знаю. Не лишним будет проверить в дебаггере ...
0
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
31.08.2015, 18:03
Цитата Сообщение от IukimPKH
Так писать нельзя , может быт куча ошибок .
Перед тем как установить нужные биты все остальные надо обнулить .
По той же логике так писать нельзя и в MODER и прочие регистры. Здесь тестовый проект, данный код выполняется после резета, а после резета камень устанавливает значения, указанные в даташите. В местах, где требуется переинициализация, понятное дело, будет все нужное обнуляться.

Цитата Сообщение от dosykus_2
Я все это знаю. Не лишним будет проверить в дебаггере ...
Проверено, стоит. Все, как необходимо - AFRL7 = 0x4, AFRL6 = 0x4.

Цитата Сообщение от dosykus_2
PB6 занят - SCL CS43L22
Да, он заходит туда. Но CS43L22 имеет SDA на PB9, ответить он в принципе не сможет. Частота I2C 100 кГц, в ДШ к CS43L22 оная тоже указана, т.е. стретчем он не просадит частоту. В общем, по идее не должен CS43L22 на линию никак влиять, или я ошибаюсь?

Суть вопроса скорее в коде - есть ли в моей настройке что-то принципиально неверное?

Сейчас она выглядит вот так:
Code
1
2
3
4
5
6
7
I2C1->CR2 |= I2C_CR2_FREQ_1;
I2C1->OAR1 |= 0xD0;         // 7bit address: 0x68 (*2)
I2C1->CCR &= ~I2C_CCR_CCR;
I2C1->CCR |= 10;
I2C1->TRISE = 3;
I2C1->CR1 |= I2C_CR1_PE;      // Enable I2C btock
I2C1->CR1 |= I2C_CR1_ACK;
Только я не могу докумекать, как все таки слэйв должен передавать данные? По статье с основного сайта, мастер кидает адрес, мы отправляем ACK, затем смотрит, что происходит с линией SDA - если слейв просаживает, значит 0, нет - 1. Но при этом он должен генерировать такты. Т.е. на стороне мастера мы должны отправлять 0xFF в линию, а затем смотреть что получилось с значением в I2C_DR?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2015, 18:03
Помогаю со студенческими работами здесь

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

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

STM32F103 I2C прием не определенного количества байт.
Здравствуйте. Тема I2C в STM32 вроде обсосана и может есть где ответ на мой вопрос, но не нашел четкого ответа. I2C, прекрасно...

I2C, прием заранее неизвестного кол-ва байт.
Всем привет. Подскажите пжлста, как реализовать прием заранее неизвестного количества байт по I2C. Проект сделал в CubeMX, использую...

attiny2313 i2c slave
Доброго времени суток! Мне необходимо связать по шине I2C ATMEGA328 в режиме mostir и ATTINY2313 в режиме slave. У ATTINY нет...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru