Как настроить I2C с DMA на микроконтроллерах STM32. Какие преимущества дает использование DMA для I2C. Как реализовать обмен данными по I2C с помощью DMA на STM32.
Основы I2C на микроконтроллерах STM32
I2C (Inter-Integrated Circuit) — это последовательный протокол связи, широко используемый для соединения микроконтроллеров и периферийных устройств. Микроконтроллеры STM32 имеют встроенные аппаратные модули I2C, что упрощает реализацию этого интерфейса.
Основные особенности I2C на STM32:
- Поддержка стандартного (100 кГц) и быстрого (400 кГц) режимов
- 7- или 10-битная адресация
- Мультимастерный режим
- Режимы мастера и ведомого
- Программируемая тактовая растяжка
- Поддержка DMA для передачи данных
Преимущества использования DMA с I2C
Прямой доступ к памяти (DMA) позволяет передавать данные между периферийными устройствами и памятью без участия процессора. Использование DMA с I2C дает следующие преимущества:
- Снижение нагрузки на процессор
- Увеличение скорости передачи данных
- Возможность параллельного выполнения других задач
- Уменьшение энергопотребления
Как работает DMA с I2C? DMA-контроллер автоматически считывает данные из памяти и отправляет их в буфер передачи I2C, или считывает принятые данные из буфера приема I2C и записывает их в память. Это происходит без участия процессора.

Настройка I2C с DMA на STM32
Для настройки I2C с DMA на микроконтроллерах STM32 необходимо выполнить следующие шаги:
- Настроить выводы GPIO для I2C
- Включить тактирование I2C и DMA
- Настроить параметры I2C (скорость, адрес и т.д.)
- Настроить каналы DMA для передачи и приема
- Включить прерывания DMA
- Инициализировать I2C и DMA
Рассмотрим каждый шаг подробнее.
Настройка выводов GPIO
Для работы I2C необходимо настроить два вывода: SCL (тактовый сигнал) и SDA (линия данных). Они должны быть сконфигурированы как выходы с открытым коллектором и подтяжкой к питанию.
Пример настройки для STM32F4:
GPIO_InitTypeDef GPIO_InitStruct;
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_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
Включение тактирования
Необходимо включить тактирование для используемого модуля I2C и DMA:
__HAL_RCC_I2C1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
Настройка параметров I2C
Основные параметры I2C, которые необходимо настроить:

- Скорость передачи данных
- Режим работы (мастер/ведомый)
- Собственный адрес (для ведомого режима)
- Формат адреса (7 или 10 бит)
Пример настройки I2C в режиме мастера на скорости 100 кГц:
I2C_HandleTypeDef hi2c1;
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
Настройка DMA для I2C
Для использования DMA с I2C необходимо настроить отдельные каналы для передачи и приема данных. Основные параметры, которые нужно задать:
- Направление передачи (память -> периферия или периферия -> память)
- Режим работы (нормальный или циклический)
- Приоритет
- Размер передаваемых данных
- Инкремент адресов памяти
Пример настройки DMA для передачи данных по I2C:
static DMA_HandleTypeDef hdma_i2c1_tx;
hdma_i2c1_tx.Instance = DMA1_Stream6;
hdma_i2c1_tx.Init.Channel = DMA_CHANNEL_1;
hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_i2c1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&hdma_i2c1_tx);
__HAL_LINKDMA(&hi2c1, hdmatx, hdma_i2c1_tx);
Реализация передачи данных по I2C с использованием DMA
После настройки I2C и DMA можно приступать к передаче данных. Для этого используется функция HAL_I2C_Master_Transmit_DMA():

uint8_t data[] = {0x01, 0x02, 0x03, 0x04}; HAL_I2C_Master_Transmit_DMA(&hi2c1, SLAVE_ADDRESS << 1, data, sizeof(data));
Эта функция инициирует передачу данных по I2C с использованием DMA. Процессор может выполнять другие задачи, пока идет передача.
Для обработки завершения передачи можно использовать колбэк-функцию:
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
if(hi2c->Instance == I2C1)
{
// Передача завершена
}
}
Особенности использования I2C с DMA на STM32
При работе с I2C и DMA на микроконтроллерах STM32 следует учитывать некоторые особенности:
- Не все серии STM32 поддерживают DMA для I2C. Необходимо проверить документацию на конкретный микроконтроллер.
- DMA может использоваться только для передачи данных. Генерация START и STOP условий, а также передача адреса выполняются без участия DMA.
- При использовании DMA важно правильно обрабатывать ошибки и исключительные ситуации.
- Для оптимальной производительности рекомендуется использовать выравнивание данных по границе слова.
Отладка I2C с DMA на STM32
Отладка I2C с использованием DMA может быть сложной задачей. Вот некоторые рекомендации:
- Используйте логический анализатор для просмотра сигналов на линиях SCL и SDA
- Проверяйте флаги ошибок в регистрах статуса I2C и DMA
- Используйте точки останова в обработчиках прерываний DMA и I2C
- Мониторьте регистры DMA для отслеживания прогресса передачи
Правильная отладка поможет быстро выявить и устранить проблемы при работе с I2C и DMA.

Оптимизация производительности I2C с DMA
Для достижения максимальной производительности при работе с I2C и DMA на STM32 можно применить следующие методы оптимизации:
- Использование циклического режима DMA для непрерывной передачи данных
- Буферизация данных для уменьшения количества операций I2C
- Оптимизация размера передаваемых пакетов
- Использование прерываний DMA вместо опроса флагов
- Правильный выбор приоритетов DMA и прерываний
Применение этих методов позволит максимально эффективно использовать возможности I2C и DMA на микроконтроллерах STM32.
⭐ Stm32 i2c slave dma example, stm32 hal i2c slave dma example — Рейтинг сайтов по тематике на RANKW.RU
⭐ Stm32 i2c slave dma example, stm32 hal i2c slave dma example — Рейтинг сайтов по тематике на RANKW.RU
0/5.0 оценка (Голосов: 0) |
Главная - Slave Holder - Реализуй свои желания slave-holder. slave holder Google PageRank: 0 из 10 Яндекс ТИЦ: 0 |
Рейтинг: 16.6 |
0/5.0 оценка (Голосов: 0) |
slave-ns. slave-ns.ru Google PageRank: 0 из 10 Яндекс ТИЦ: 0 |
Рейтинг: 16.3 |
0/5.0 оценка (Голосов: 0) |
Как построить частный дом своими руками | Умный дом своими руками- ДРУиД Умный дом своими руками
Разработка электронных устройств своими руками
Уроки по STM32
Программирование STM32
Изучение STM32
Строительство частного дома своими руками
Девайсы для быта своими руками
Умный дом концепция
Видео уроки по STM32
Видео уроки. druid.su Рейтинг Alexa: #1,675,701 Google PageRank: 0 из 10 Яндекс ТИЦ: 10 |
Рейтинг: 15.5 |
0/5.0 оценка (Голосов: 0) |
secohshop | Ещё один сайт на WordPress Games like giga slave On 12th February 2010, Korean developer GNi Soft announced the Closed Beta Registration phase for their latest MMO, Giga Slave. secohshop.ru Google PageRank: 0 из 10 Яндекс ТИЦ: 0 |
Рейтинг: 14.5 |
0/5.0 оценка (Голосов: 0) |
Slave Master €гра с выводом денег: онлайн игра с выводом slave-mas. заработать, ферма, денежная ферма Рейтинг Alexa: #716,710 Google PageRank: 0 из 10 Яндекс ТИЦ: 0 |
Рейтинг: 14.4 |
0/5.0 оценка (Голосов: 0) |
Linux for Cortex-M: STM32, LPC, Kinetis, and SmartFusion - Emcraft Systems Embedded Linux solutions for Cortex-M3. 3dtelemetry.ru cortex-m3, stm32, lpc17xx, smartfusion, gui Google PageRank: 0 из 10 Яндекс ТИЦ: 20 |
Рейтинг: 14.4 |
0/5. |
EasySTM32 - Главная страница Микроконтроллеры STM32 easystm32.ru микроконтроллеры, электроника, stm32 Рейтинг Alexa: #295,817 Google PageRank: 0 из 10 Яндекс ТИЦ: 70 |
Рейтинг: 13. |
0/5.0 оценка (Голосов: 0) |
PKLab | Электроника, микроконтроллеры STM32, программирование на С++,С#, Python Электроника, микроконтроллеры STM32, программирование на С++,С#, Python pklab. c#, marmalade sdk, msp430, windows 8, блог Рейтинг Alexa: #6,284,698 Google PageRank: 1 из 10 |
Рейтинг: 12.1 |
0/5.0 оценка (Голосов: 0) |
Slave Nation: How Slavery United the Colonies and Sparked the American Revolution by Alfred W. Slave Nation: How Slavery United the Colonies and Sparked the American Revolution. Author: Alfred W. Blumrosen. Pages: 1402206976. ISBN: 304. Format: pdf, epub, fb2, txt booktheau.yyglasses.com
|
Рейтинг: 11.6 |
0/5.0 оценка (Голосов: 0) |
slave-expert. бесплатные игры онлайн настройка интернета и локальной сети настрой wifi безопасность в сети распространенные виды мошенничество афера знаменитые мошенники slave-expert.ru игры бесплатно, бесплатные игры, бесплатно, игры, онлайн Рейтинг Alexa: #5,025,115 Google PageRank: 2 из 10 Яндекс ТИЦ: 0 |
Рейтинг: 11.5 |
0/5. |
Slave-owner slave-owner.ru Рейтинг Alexa: #314,088 Яндекс ТИЦ: 0 |
Рейтинг: 11.3 |
0/5. |
MicroTechnics | Микроконтроллеры, электроника и программирование MicroTechnics.ru - микроконтроллеры, электроника и программирование microtechnics.ru электроника, stm32, приложения qt, stm32 с нуля Google PageRank: 1 из 10 |
Рейтинг: 11. |
0/5.0 оценка (Голосов: 0) |
Slave of the Lamp Блог красноглазика lampslave.ru Рейтинг Alexa: #4,129,728 Google PageRank: 1 из 10 |
Рейтинг: 10. |
0/5.0 оценка (Голосов: 0) |
Slave Master Регистрация пользователя в игре slavemasters.ru Рейтинг Alexa: #562,244 Яндекс ТИЦ: 0 |
Рейтинг: 10. |
Динамика популярности - Stm32 i2c slave dma example
Google Тренды это диаграмма для отслеживания сезонности ключевых слов. Этот график позволяет лучше понять сезонное изменение полулярности запросов по определенной тематике.
Значения приведены относительно максимума, который принят за 100. Чтобы увидеть более подробную информацию о количестве запросов в определенный момент времени, наведите указатель на график.
I2c dma stm32
Инициализация контроллера DMA как и любого переферийного устройства начинается с подачи на него тактовых импульсов. Делается это следующим образом:. Вот так выполняется настройка адресов источника и приемника канала DMA. Ничего сложного.
Поиск данных по Вашему запросу:
Схемы, справочники, даташиты:
Прайс-листы, цены:
Обсуждения, статьи, мануалы:
Дождитесь окончания поиска во всех базах.
По завершению появится ссылка для доступа к найденным материалам.
Содержание:
- Implementation of Simple I2C Slave on STM32 Microcontroller
- STM32 I2C.
- I2C через IRQ, Polling или DMA STM32 демо от st.com
- 20. STM32. Программирование STM32F103. I2C Slave
- STM32.
Использование I2C.
- Вопросы с тегами [stm32]
- I2C часть 2 (перевод из книги Mastering STM32)
- Программирование STM32. Часть 10: SPI + DMA
- STM32F4 I2C с DMA не работает
ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: STM32F0 Tutorial 7: I2C example Part 1
Implementation of Simple I2C Slave on STM32 Microcontroller
Шина I2C существует уже достаточно давно: ее в х создала компания Philips для низкоскоростных устройств. В настоящий момент она достаточно широко применяется, и, скорей всего, дома у вас есть хоть одно устройство с данной шиной. Название шины расшифровывается как Inter-Integrated Circuit. Хардварным модулем I2C в настоящее время обладает большинство микроконтроллеров, в некоторых их и вовсе несколько, как у тех же STM32 в серии F4 есть целых три модуля I2C. Шина представляет собой 2 линии, одна из которых данные SDA , другая — синхросигнал SCL , обе линии изначально притянуты к питанию.
Устройства в линии не одноранговые, как в CAN, поэтому всегда должно быть Master-устройство. Допускается наличие нескольких Master-устройств, но это все же гораздо реже, чем один Master и ворох Slave устройств. Передача данных инициируется мастером, который отправляет в шину адрес необходимого устройства, тактирование осуществляется так же мастером.
Наибольшее распространение получили в текущий вариант реализации I2C с частотой шины kHz Standard mode и kHz Fast mode. Существует реализация I2C версии 2. Так же у линии есть ограничение по емкости в пФ. Отдельно стоит отметить то, что обычно линию I2C не рекомендуют делать длинной, да и чаще всего она встречается на печатных платах для обмена между некими цифровыми устройствами, гораздо реже I2C пускают по проводам но не стоит думать, что это редкость, и то и другое вполне нормально. Если у вас возникла надобность сделать длинную линию I2C, да еще на кГц, то стоит уменьшить сопротивление резисторов подтяжки.
Только не забывайте, что уменьшая сопротивление резисторов, вы увеличиваете ток в линии, что при переизбытке может привести к повреждению устройств. С программной точки зрения обмен по шине I2C выглядит следующим образом: Master отправляет стартовую последовательность START при высоком уровне SCL к нулю притягивается SDA , затем отправляет адрес с бит-флагом, указывающим режим чтения или записи, причем в следующим формате:.
Если бит режима равен нулю, то это значит, что Master будет записывать информацию в Slave устройство, единица — чтение из Slave. Исходя из этого появляется ограничение на количество устройств в шине: После получения адреса Slave устройство должно сообщить мастеру о принятии адреса, что подтвердит сам факт существования Slave устройства с таким адресом на линии.
Подтверждение — это специальный 9й бит, который равен нулю, если адрес совпал и готовы работать, и единице, если не совпал. Так же, ACK используется при последующим приеме и передаче данных. Если мастер записывает в слейв, то слейв должен каждый байт подтверждать сигналом ACK.
Если слейв отправляет данные мастеру, то мастер должен на все байты отвечать ACK, кроме последнего — это будет сигналом, что больше отправлять данные не требуется. Теперь можно перейти к рассмотрению работы с данной шиной на микроконтроллере STM Сразу стоит заметить, что во всех сериях данный модуль приблизительно одинаковый, за исключением регистра фильтра в старших сериях например, STM32F , поэтому единожды написанный код сможет работать и далее. Для начала следует включить тактирование модуля I2C, что, впрочем, необходимо и для всей периферии.
Так же необходимо включить и настроить пины в режим альтернативной функции. Чтобы посмотреть на какой шине что находится, необходимо обратиться к даташиту, в раздел Device Overview для F4, это, например, страница 18 рис.
И, наконец, можно настроить I2C. Показывать регистры не имеет смысла, они есть все в reference manual, все, что нужно для стандартного случая будет ниже. До включения непосредственно модуля I2C следует в регистр CR2 записать текущее значение частоты той шины, на которой сидит модуль I2C, в данном случае это частота шины APB1.
В рамках даташита это значение называется PCLK. В разных контроллерах количество и именование шин разное. Чтобы посмотреть или высчитать конкретную частоту тактирования шины можно воспользоваться приложением CubeMX, которое загружается с официального сайта ST Microelectronics.
В регистре CR2 так же включаются прерывания от данного модуля. Под этим понимается то, что будет ли модуль сообщать в NVIC о том, что что-то произошло, либо же просто поставит нужные флаги в статусном регистре. Стоит заметить, что в статусном регистре всегда будут ставиться событийные флаги, что логично.
Можно обойтись вполне и только событиями, как наиболее общим. Можно и без запаса, главное не меньше — ничего не заработает. Данный показатель важен, но не настолько, как сбившаяся частота тактирования. Но все же лучше делать правильно, по спецификации шины. Да-да, она на английском языке. После того, как данные действия будут выполнены, можно включать модуль и прерывания в модуле NVIC если нужны. После настройки модуля, есть два варианта как вы будете с ним работать.
Вариант первый — поллингом, то есть вы будете ждать появления флага в цикле while и контроллер будет занят только этим, что в большинстве случаев плохо , либо вариант второй — на прерываниях. Я рассмотрю второй вариант, так как он предпочтительный, а если понять логику состояний по прерываниям, то перейти на поллинг не является проблемой.
Итак, первое что необходимо сделать — добавить в код обработчик прерываний событий от модуля I2C. Функция должна называться определенным образом, и ее название можно взять из startup-файла. Поэтому в необходимый. Именование данного метода, понятное дело, можно изменять. В startup-файле в ассемблерном коде просто создаются метки, которые не требуют обязательного наличия данной функции. Когда уже будет происходить окончательная сборка, все это сведется воедино и вместо имени будет присутствовать переход в нужную позицию в коде.
Поэтому можно изменять название метки как заблагорассудится по правилам именования функций, конечно , хотя и не рекомендуется — другие разработчики могут просто не понять, обработчик прерываний это или нет. Для написания обработчика прерываний можно обратиться напрямую к документации, reference manual, там есть достаточно подробные схемы для разных режимов работы. Для начала возьмем отправку slave-устройству данных:. Например, мы хотим просто отправить 1 байт данных устройству и прекратить передачу.
Данную строку можно поставить по ходу программы там, когда нужно начинать передачу. Например, после того, как инициализировали переменную data. Дальше уже будет код внутри функции-обработчика прерываний. Для начала необходимо в отдельные переменные сохранить значение статусов:. После отправки стартовой последовательности произойдет прерывание с событием EV5.
В данном случае в статусном регистре должен выставиться бит SB. Если данный бит выставлен, нам необходимо отправить адрес с битом режима чтения или записи. Для упрощения можно сделать так:. А рамках Master-режима, ADDR означает, что адрес отправлен и воспринят slave-устройством, а TXE означает, что буфер свободен для внесения данных для последующей передачи. В обработчике TXE все, что нужно — это передавать данные. Так как передавать мы хотим только 1 байт, то сразу же отправим и последовательность STOP:.
Таким образом, заполнив переменную data и дав команду формирования последовательности START, вся работа будет идти в прерываниях, а контроллер тем временем будет занят другой полезной работой большую часть времени то есть другая работа кроме, собственно, обработчика прерываний. Если данных требуется отправить больше 1 байта, то изменения в коде минимальны. Так как глобальные переменные целого типа по умолчанию равны нулю, то явно инициализировать переменную iter не требуется.
Изменения в обработчике же вообще минимальные — требуется переписать блок обработки события EV Код можно модифицировать и далее, создав, например, контекст модуля, сделать одну функцию-обработчик, которая будет на вход принимать только контекст и делать необходимые действия с необходимым модулем и так далее. Например, можно сделать такую функцию:. Это позволит одну и ту же функцию использовать сразу в двух модулях. Например, мы можем ее вставить вот так:. Еще раз напомню, что адрес устройства, который мы видим в документации — это биты [] из того байта, который передается модулем, а бит 0 — это режим.
Так, указав выше в аргументах адрес 0x14 и режим передачи данных, я получу на передачу байт 0x Так как в макросе проверки нет, стоит не забывать, что передавать в него можно максимум адрес 0x7F, иначе получите чехарду. Итак, возьмем наш предыдущий код и просто внесем в него дополнительный обработчик такого вида, чтобы принять 10 байт данных:. Данных выше хватает, в общем-то, для очень многих случаев, и, поняв логику написания кода выше, можно по документации будет расширить код необходимым.
И еще одно — часто для того, чтобы что-то прочитать из slave-устройства, необходимо в него что-то записать. Главная Без рубрики Поделиться с друзьями:.
STM32 I2C.
Довольно часто возникает необходимость связать микроконтроллер STM32 c другим микроконтроллером или с другим девайсом, например, внешней памятью. И тут на помощь приходит шина I2C , о которой до сих пор не было написано статьи на нашем сайте. И снова для начала обсудим теоретические аспекты этой замечательной шины. Итак, I2C — последовательная шина данных, разработанная Philips около тридцати лет назад. Интерфейс I2С очень часто применяется в различных девайсах для реализации внутренней связи между устройствами. Возможные применения I2С включают, например:.
I2C STM32 2 ПОСЛЕДОВАТЕЛЬНЫЙ ИНТЕРФЕЙС I2 С STM32 1. KamlachPV. DMA STM KamlachPV. АЦП STM32(2).
I2C через IRQ, Polling или DMA STM32 демо от st.com
Рассмотрена архитектура и состав его регистров, а также приведены практические примеры программ. Блок DMA позволяет обеспечить высокоскоростную передачу данных между внешними устройствами и памятью микроконтроллера, а также передачу данных типа память-память без участия процессора. Это позволяет освободить процессор от рутинной операции по пересылке данных, ускорить данную процедуру за счёт прямой пересылки данных и выполнять различные операции в микроконтроллере одновременно и независимо самим процессором и блоком DMA. Во многих программах процессор часто бывает загружен операциями, требующими непрерывной передачи данных. Это и опрос состояния датчиков, и регулярные расчёты. Примером таких процедур могут служить: вывод информации на графический индикатор, опрос клавиатуры, чтение данных с карты памяти и тому подобное. Если в это время ещё потребуется обслуживать запрос от компьютера по последовательному порту, то процессор может начать притормаживать выполнение некоторых операций.
20. STM32. Программирование STM32F103. I2C Slave
Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях. Перейти к основному содержанию. Вы здесь Главная. Забыли пароль? Как оказалось, для обмена данными есть только один путь - протокол I2C.
Шина I2C существует уже достаточно давно: ее в х создала компания Philips для низкоскоростных устройств.
STM32. Использование I2C.
Получаем прерывание что отослан адрес. Игнорируем, так как должно сразу придти прерывание TxE. Вот тут хочется послать стоп. Реально байт еще не ушел. Когда он уйдет, то, судя по эрате, должен выставиться битик BTF.
Вопросы с тегами [stm32]
Первая часть по ссылке. Обе предыдущие функции выполняют транзакции в режиме опроса. Для транзакций на основе прерываний мы можем использовать функции:. Эти функции работают так же, как и другие процедуры, описанные в предыдущих главах например, те, которые касаются передачи UART в режиме прерывания. Таблицу векторов прерываний для вашего микроконтроллера. Существует десять различных функций обратного вызова, используемых в CubeHAL. В Таблице 3 перечислены они все вместе с ISR, который вызывает обратный вызов.
Почти сразу я наткнулся на HALMX STM Причем .. Подозрение падает на HAL и реализацию I2C от .. Опять туда: I2C через DMA.
I2C часть 2 (перевод из книги Mastering STM32)
Главная Вопросы Теги пользователей. Вопросы с тегами [stm32]. Из соображений производительности, это должно быть сделано с помощью DMA. До сих пор, однако, я не мог заставить его работать.
Программирование STM32. Часть 10: SPI + DMA
ВИДЕО ПО ТЕМЕ: STM32 I2C: Pt 2
Anonymous comments are disabled in this journal. Your IP address will be recorded. Log in No account? Create an account. Remember me.
Slideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising.
STM32F4 I2C с DMA не работает
Меня частенько упрекают, что я даю материал в слишком трудной манере и не по порядку. Спешу вас расстроить, я и дальше буду следовать этой логике. Учат они чему-то? Не уверен. Они лишь дают возможность разобраться в какой-то функции, когда возникает потребность.
Сегодня мы попробуем с помощью библиотеки LL поработать с шиной I2C. Там эта шина называлась TWI. Причём микросхему мы использовали с часовым модулем на микросхеме DS Данный модуль мы будем использовать и сегодня.
- I2C: требуется ли DMA?
спросил
Изменено 10 лет, 7 месяцев назад
Просмотрено 8к раз
\$\начало группы\$
Я пытаюсь перенести пример кода из примеров стандартной библиотеки ST. В частности, есть файл с именем stm32_eval_i2c_tsensor.c
, которые считывают и записывают регистры для датчика температуры и считывают температуру.
Я не понимаю, зачем здесь использовали DMA. Ответы от датчика температуры имеют длину не более двух байтов. Самая сложная часть переноса — это DMA, и я бы предпочел вместо этого использовать «опрос».
Действительно ли здесь требуется DMA для считывания температуры датчика температуры?
- температура
- стм32
\$\конечная группа\$
3
\$\начало группы\$
Вполне возможно, что причина использования DMA может быть найдена в опечатках STM32 (ссылка на подсемейство «высокой плотности» stm32f101/103), документе столь же увлекательном, как и само руководство. По сути, периферийные устройства I2C имеют много интересных особенностей. В одном из пунктов опечаток (2.11.1) указано, что определенные аппаратные события необходимо обслуживать немедленно, иначе может возникнуть какое-либо состояние аппаратной гонки:
Когда события EV7, EV7_1, EV6_1, EV6_3, EV2, EV8 и EV3 не управляться до того, как текущий байт будет передан, проблемы могут быть сталкивались, например, с получением дополнительного байта, чтением тех же данных дважды или отсутствуют данные.
По сути, правильная работа не гарантируется во всех случаях, если I2C не обслуживается прерываниями с наивысшим приоритетом (Временное решение 2) или DMA (Временное решение 1). Теперь, если я правильно понимаю, простая передача по запросу со всеми отключенными прерываниями тоже будет работать, но это противоречит всей философии дизайна Cortex-M (параллелизм выходит за рамки). Если используется вытесняющая RTOS, все еще хуже.
Тем не менее, у многих людей I2C работает как в режиме опроса, так и в режиме прерывания без строгого следования рекомендациям по ошибкам и без явных проблем. Однако это, конечно, не может рассматриваться как указание на то, что проблемы никогда не возникнет. Если вы собираетесь реализовать свой собственный драйвер I2C, я бы рекомендовал вам обрабатывать не только все возможные состояния ошибок, о которых сигнализирует периферийное устройство, но и тайм-ауты. Если происходит ошибка или тайм-аут, обязательно отправьте STOP (для сброса ведомых устройств) и сбросьте сам контроллер, как описано в руководстве. Получение неверных данных от подчиненных также является возможностью, о которой вам следует подумать. Вы можете найти много обсуждений этой проблемы на форумах ST и в других местах.
\$\конечная группа\$
\$\начало группы\$
Вы не говорите, как подключен датчик, за исключением упоминания IIC в названии. Если это IIC, то все, что ему действительно нужно, это реализовать IIC на двух выводах. DMA — это средство внутри процессора для работы с данными ввода-вывода, которое не имеет прямого отношения к тому, как это периферийное устройство передает сигналы внешнему миру.
Другими словами, IIC и DMA являются независимыми концепциями. Я удивлен, что DMA даже подходит для чего-то столь же медленного, как IIC, но, судя по тому, что вы говорите, ваш процессор реализует это. Я не знаком с этим процессором, но, скорее всего, периферийное устройство IIC может работать в других режимах ввода-вывода, таких как явный опрос или управление прерыванием.
Сделайте шаг назад и подумайте о проблеме, которую вы пытаетесь решить. IIC — это простой протокол, который можно легко реализовать с помощью микропрограммы, напрямую управляющей двумя линиями ввода-вывода, если вы являетесь ведущим. Если процессор считывает показания датчика температуры, процессор будет главным, так что это не проблема.
Это отличный пример того, как тратить больше времени на то, чтобы заставить чужой код работать на вас, чем на то, чтобы сделать это самостоятельно. В мире небольших встроенных систем вам все равно нужно понимать нижние уровни. Если вы не понимаете, как работает IIC, остановитесь и изучите его, прежде чем продолжить. Это часть работы. Просто слепой вызов чьей-то чужой библиотеки приведет к неприятностям, и вы уже потратили впустую больше времени, чем (удушье!) Написание собственного кода.
\$\конечная группа\$
2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
.
stm32 - Можно ли отправлять данные через I2C с TIM без прерывания ЦП и только с прерыванием DMA
\$\начало группы\$
Поскольку я видел HAL_TIM_Base_DMA_START() в библиотеке таймеров HAL STM32F7, я подумал, что возможно, например, вызвать HAL_TIM_Base_DMA_START() и таймер, постоянно запрашивая DMA для передачи данных в I2C предварительно без активности ЦП?
- stm32
- i2c
- таймер
- dma
- прямой
\$\конечная группа\$
4
\$\начало группы\$
Нет, потому что откуда таймеру знать что-либо о том, как управлять периферийным устройством I2C, чтобы что-то делать по каналу DMA. В лучшем случае вы можете отправлять байты с определенной скоростью, запуская передачу DMA с помощью таймера, но транзакция I2C должна быть предварительно настроена на этот момент заранее.
Транзакции I2C поддерживают DMA, и вы можете использовать прерывания таймера для запуска транзакций I2C, которые могут выполнять фазу передачи данных с DMA в фоновом режиме.
\$\конечная группа\$
4
\$\начало группы\$
Ну, вы можете настроить таймер для запуска DMA для записи байтов в периферийное устройство I2C, но маловероятно, что это приведет к чему-то полезному.
Успешная транзакция I2C требует условий запуска и остановки, возможных перезапусков, частых проверок подтверждения и т. д. Ни одно из этих действий не может быть легко решено только с помощью управляемого таймером прямого доступа к памяти, отправляющего байты в I2C.
Вы можете настроить таймер таким образом, чтобы его прерывание начинало транзакцию I2C (отправляло стартовый бит) и запускало ее до момента, когда вам теперь нужно отправить только блок данных, а затем настроить DMA для отправки этих данных в периферийное устройство I2C, но вы не задействовали бы там таймер — вы бы сконфигурировали периферийное устройство I2C для прямого запуска DMA всякий раз, когда оно готово для нового байта.