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

STM32 аппаратная работа интерфейса SPI через DMA с запуском от TIM

13.04.2021, 07:50. Показов 1547. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Задача в проекте реализовать аппаратно интерфейсы по работе с внешними АЦП и ЦАП-ом
Столкнулся со следующей проблемой, которую не могу решить уже долгое время.
Реализовал механику работы интерфейса следующим образом:
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
void mySPI3_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
{
 hspi3.hdmarx->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME;
 hspi3.hdmarx->Instance->FCR |= DMA_IT_FE;
}
 
void Start_DMA_TIM_DAC(void)
{
    HAL_TIM_PWM_Start_IT(&htim5, TIM_CHANNEL_1);
  
    /* Start SPI RX DMA */
       hspi3.hdmatx->XferCpltCallback = mySPI3_DMAReceiveCplt;
    
    pdata[0] = 0xA5A5;
    pdata[1] = 0x5A5A;
    
    HAL_DMA_Start_IT(hspi3.hdmatx, (uint32_t)&pdata, (uint32_t)(&(hspi3.Instance->DR)), 2);
        SET_BIT(hspi3.Instance->CR2, SPI_CR2_TXDMAEN);
    
        __HAL_SPI_ENABLE(&hspi3);
 
        /* Prepare TIM DMA to SPI_DR */
       uint32_t DMA_stort[2];
       DMA_stort[0]=(hspi3.hdmatx->Instance->CR)| DMA_SxCR_EN;//(DMA1_Stream7->CR)| DMA_SxCR_EN;
        
       HAL_DMA_Start(htim5.hdma[TIM_DMA_ID_UPDATE], (uint32_t)&pdata, (uint32_t)&(hspi3.Instance->DR), 1);
        __HAL_TIM_ENABLE_DMA(&htim5, TIM_DMA_UPDATE);
 
      /* Start the timer */
      __HAL_TIM_ENABLE(&htim5);
}
SPI настроен на 16 бит. Данный код работает. Таймер дёргает пин CS 100к в секунду через ШИМ. При этом, этот же таймер посредством DMA дёргает SPI DMA на запись. Проблема в том что на отправку нужно 2 данных по 16 бит, а он отправляет одно каждый раз, хотя указывал HAL_DMA_Start_IT(hspi3.hdmatx, (uint32_t)&pdata, (uint32_t)(&(hspi3.Instance->DR)), 2);.
Что с этим делать, не понятно, почему он 2 то не отправляет? Меняя это число в большую сторону, всё равно отправляет одно данное.
Находил похожие темы на форумах, брал оттуда примеры, но не помогло окончательно решить проблему.
Миниатюры
STM32 аппаратная работа интерфейса SPI через DMA с запуском от TIM  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2021, 07:50
Ответы с готовыми решениями:

STM32 F4 ADC+DMA+TIM
Доброго времени суток! Проблема достаточно стандартная: необходимо настроить АЦП и ДМА так, чтобы по таймеру АЦП дергалось и дальше ДМА...

помогите с алгоритмом для DMA и TIM на STM32
здравствуйте. у меня такая задача: генерировать 2 периода скважности PWM-генератора используя DMA и буфер из байтов. причем 3 подряд идущих...

STM32 ili9341 SPI+DMA
Всем привет. У меня никак не получается правильно настроить работу дисплея ili9341. Сейчас подключен он по SPI с использованием DMA. ...

5
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
21.04.2021, 06:37
ivandor87, Я не особо советчик по программированию, так как сам еще кучу ошибок делаю, но попробуйте лучше эту порцию данных 32 бит отправлять в два этапа по 16 бит за раз.
Цитата Сообщение от ivandor87 Посмотреть сообщение
Проблема в том что на отправку нужно 2 данных по 16 бит, а он отправляет одно каждый раз
Насколько я понял, Вы выставляете CS потом пытаетесь пропихнуть 32 бита в SPI настроенный на 16 битную передачу и поднимаете CS.
Попробуйте так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
              for(i = 0; i < 2; i++)
              {
                  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
 
                  while(!LL_SPI_IsActiveFlag_TXE(SPI3)){};
                  LL_SPI_TransmitData16(SPI3, TxData);
 
                  while(!LL_SPI_IsActiveFlag_RXNE(SPI3)){};
                  DataRes[i] = LL_SPI_ReceiveData16(SPI3);
 
                  while (LL_SPI_IsActiveFlag_BSY(SPI3));
 
                  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
              }
Это без DMA, но идею, я думаю понятно. И CS надо будет выставлять на каждые 16 бит отдельно, т.е. в Вашем случае на 32 бита надо будет уровень CS переключить 4 раза
0
0 / 0 / 0
Регистрация: 30.07.2018
Сообщений: 3
21.04.2021, 09:59  [ТС]
Приветствую! Немного не понял смысл, и как его уложить в DMA. CS дёргается один раз за передачу, т.ё. дёрнулся вверз вниз как на диаграмме и потом следом подряд 2 слова 32 байта. В функции же есть входное данное количество слов, почему некорректно проходит настройка в DMA?!
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
21.04.2021, 11:34
ivandor87,
Цитата Сообщение от ivandor87 Посмотреть сообщение
Таймер дёргает пин CS 100к в секунду через ШИМ
Цитата Сообщение от ivandor87 Посмотреть сообщение
CS дёргается один раз за передачу
Ну с CS еще ладно, дергаете таймером, в целом разницы нет, чем его дергать, но только смысл? Зачем дергать его таймером, когда можно выставляться низкий уровень перед передачей данных и высокий сразу после передачи.
Я пример выше скинул, это код на извлечение данных:
Выставили CS
извлекли/передали
Подняли CS
Надо передать 2 раза, делаем эту процедуру 2 раза.
Цитата Сообщение от ivandor87 Посмотреть сообщение
HAL_DMA_Start_IT(hspi3.hdmatx, (uint32_t)&pdata, (uint32_t)(&(hspi3.Instance->DR)), 2);
Вот на эту часть обратите внимание:
(uint32_t)&pdata, (uint32_t)(&(hspi3.Instance->DR)
У Вас 16 битный SPI, Вы пихаете в него 32 битные числа. Так не прокатит. Если у принимающей стороны стоит 32 битный регистр на вход, это еще не значит, что SPI на мк сможет за раз его заполнить.
На счет DMA: DMA это такая вещь, не всегда целесообразно ее использовать. DMA просто берет данные и перекладывает их с места на место, пока процессор занят чем-то другим, а по окончанию перекладывания DMA говорит, что закончило.
И вызывает прерывание, чтобы одернуть процессор.
Лучше сначала попробовать без DMA, а потом уже подключить.
Поэтому если хотите передать 32 бит, делайте передачу по 16 бит 2 раза
Вот передача 8 бит 128 раз
C
1
2
uint8_t testDataToSend[128];
HAL_SPI_Transmit_DMA(&hspi2, testDataToSend, 128);
И лучше будет использовать HAL_SPI_Transmit_DMA, я так думаю
https://microtechnics.ru/stm32... spi-i-dma/
0
0 / 0 / 0
Регистрация: 30.07.2018
Сообщений: 3
21.04.2021, 12:13  [ТС]
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Вот на эту часть обратите внимание:
(uint32_t)&pdata, (uint32_t)(&(hspi3.Instance->DR)

Это идея, гляну...

Цитата Сообщение от DmitryDDDD Посмотреть сообщение
CВыделить код
1
2
uint8_t testDataToSend[128];
HAL_SPI_Transmit_DMA(&hspi2, testDataToSend, 128);
Этот метод работает, если трансмит закинуть в прерывание, то работает канечно, но там огромные задержки, частота высокая, нужно гораздо быстрое срабатывание, его можно достичь только путём реализации на аппаратуре (TIM -> DMA -> SPI_TX/RX) * (от 100kSps до 2MSps)
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
21.04.2021, 12:25
ivandor87,
Цитата Сообщение от ivandor87 Посмотреть сообщение
но там огромные задержки
У Вас CS работает по таймеру, за то время, которое у Вас уходит на одну передачу 16 бит, можно 3 раз по 16 бит успеть передать. Поэтому смысл говорить про медленную работу и задержки, когда вот так реализована передача, из 9 мксек на передачу, у Вас код 5-6 мксек не делает ничего. Тут DMA не спасет. Хотите привязку к таймеру, привязывайте весь цикл передачи, а не одну его часть. Как это сделать я уже написал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2021, 12:25
Помогаю со студенческими работами здесь

stm32 SPI+DMA или I2C внешнее АЦП
Есть у меня задача контролировать 3фазы линейно .Внутренний ацп не подходит наверное.Какое ацп (микросхему) мне подойдёт. Что-бы не...

stm32 tim period,tim prescaler
Добрый день помогите разобраться с результат работы таймера. Код скопирован из интернета. Использую отладочную плату stm32f100rbt6b,...

Получение данных с акселерометра LIS2DH12 на микроконтроллере stm32 используя библиотеку "HAL", SPI+DMA
Задача: получить с акселерометра LIS2DH12 данные по SPI, используя DMA, то есть освободить процессорное время на сбор данных, ведь...

ADC + DMA +TIM
Добрый вечер. Есть таймер которым я генерю ШИМ таймер TIM_TimeBaseStructure.TIM_Pressotir = 0; ...

STM32 передача по I2C через DMA
Доброго времени суток! Имеется &quot;синяя пилюля&quot; stm32f103c8t6 и попытки пересылать данные по I2C через DMA. &quot;Классическим&quot;...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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