Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/30: Рейтинг темы: голосов - 30, средняя оценка - 4.50
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
1

DMA в F0: копирование periph-to-periph (на прим. SPI->USART)

12.10.2016, 05:44. Просмотров 5489. Ответов 20
Метки нет (Все метки)

Пытаюсь настроить DMA на копирование из SPI в USORT. Хочу обойтись одним каналом DMA и без промежуточных буферов в ОЗУ, чтобы сразу после получения данных DMA копировал содержимое регистра SPI1->DR в регистр USORT1->TDR. Камень STM32F030F4.

На самой низкой скорости это работает. Проблема в том, что если повысить скорость SPI, то на выходе USORT будет не то, что получено по SPI, притом, что скорость USORT выше скорости SPI. Впечатление, будто DMA не успевает забрать данные из SPI->DR перед тем, как туда попадает следующий принимаемый бит (насколько я понял из RM в режиме RXONLY FIFO не используется и DMA берёт данные напрямую из сдвигового регистра). Кто-нибудь еще сталкивался с подобным?

подробностиSPI настроен в режиме RXONLY (в этом режиме он выдает клок непрерывно после включения, и периодически после приема очередного слова генерит событие RXNE и DMA запрос). Канал DMA получает запросы от SPI.
Регистры:
DMA_CH->CPOR = (uint32_t)&USORT1->TDR;
DMA_CH->CMAR = (uint32_t)&SPI1->DR;
Бит направления DIR в CCR установлен, биты инкремента адреса сброшены.
USORT работает режиме эмуляции 9-бит SPI.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2016, 05:44
Ответы с готовыми решениями:

Как правильно выставить настройки порта USART. [Std Periph]
Добрый день. В настройках USORT библиотеке Std Periph есть следующие поля...

STM32 - Std Periph Lib
Хочу задать вопрос людям давно работающим с STM32: имеет ли смысл использовать...

STD Periph library для STM32
Кто нибудь работал с данной либой?

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для...

usart rx dma
Здравствуйте уважаемые форумчане! Подключил usart stm32f103 через cp1202....

20
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
12.10.2016, 15:48 2
Сейчас попробовал настроить DMA на прием из SPI в отдельный буфер в ОЗУ вместо прямого копирования в USORT->TDR и вылезла та же самая проблема.
Проверял на входе лог. анализатором - данные в буфере отличаются от показаний на входе SPI (в буфере данные сдвинуты на 1 разряд влево, т.е. если на входе 0x1AF, то в буфере оказывается 0x35E).
Удивляюсь как такое может быть. Получается, что SPI в F0 не дружит с DMA? У кого нить вообще получалось завести DMA на прием данных из SPI на вменяемой скорости? (на минимальной скорости SPI все работает нормально)
0
HotD
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
12.10.2016, 16:16 3
а без DMA все норм? Возможно режим SPI неверно выбран, по какому фронту считываются данные? Если сдвинуто аккурат на бит влево.
0
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
12.10.2016, 16:19 4
Цитата Сообщение от moymtoop
Получается, что SPI в F0 не дружит с DMA? У кого нить вообще получалось завести DMA на прием данных из SPI на вменяемой скорости? (на минимальной скорости SPI все работает нормально)
Думаю... что проблемы только у вас... SPI в F0 юзаю с ДМА основательно... и на максимальной скорости... всё как заявлено в референсе...
Уж не КУБом... случайно пользуетесь???
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
12.10.2016, 16:32 5
"USORT работает режиме эмуляции 9-бит SPI."
Для теста - переведите его в канонический UART 8 none.
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
12.10.2016, 17:11 6
Цитата Сообщение от Hotd
а без DMA все норм? Возможно режим SPI неверно выбран, по какому фронту считываются данные? Если сдвинуто аккурат на бит влево.
На опросе флагов все норм. С DMA норм только если скорость SPI задана самая минимальная - все биты BR[0:2] установлены в 1, в противном случае проявляется проблема со сдвигом. Пробовал несколько режимов - дуплекс и только прием, в обоих случаях такая-же фигня. Пробовал использовать два канала DMA один на отправку dummy данных, другой на прием в буфер.
Настройки протокола стандартные, данные считываются по первому фронту CPHA=0, полярность - low CPOL=0, лог. анализатор протокол распознает правильно.
Если подробнее, у меня по SPI подключена spi-flash с которой данные передаются на дисплей подключенный к USORT. Сам усарт настроен в режим эмуляции 9-бит SPI. Сначала я посылаю команды настройки дисплея на вывод пикселей в заданное окно, затем в режиме опроса флагов перевожу spi-флшку в режим чтения данных (посылаю команду Read Data с заданным адресом), потом выключаю SPI и настраиваю его на генерацию DMA запросов (RX и TX), настраиваю каналы DMA, включаю их и включаю сам SPI.
Цитата Сообщение от dork_usir
Цитата Сообщение от moymtoop
Получается, что SPI в F0 не дружит с DMA? У кого нить вообще получалось завести DMA на прием данных из SPI на вменяемой скорости? (на минимальной скорости SPI все работает нормально)
Думаю... что проблемы только у вас... SPI в F0 юзаю с ДМА основательно... и на максимальной скорости... всё как заявлено в референсе...
Уж не КУБом... случайно пользуетесь???Да, кубом конечно пользуюсь. Очень удобно в нем функции на пины назначать и конфигурировать частоты. Просто топовая тулза )
Цитата Сообщение от u37
"USORT работает режиме эмуляции 9-бит SPI."
Для теста - переведите его в канонический UART 8 none.
Какой в этом смысл, если я уже пробовал копировать в буфер и такая-же фигня выходит.
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
13.10.2016, 04:16 7
а если сначала положить в память, проверить что читается правильно, а потом из памяти отправить на usart.
если всё будет корректно, включить сквозной режим и если ошибка будет - написать гневное письмо в ST.
Если сделать остановку при дебаге и потом по шагам идти - тоже правильно.
Хотя, что тут советовать - профи и сами сделают.
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
13.10.2016, 11:26 8
Цитата Сообщение от x893
а если сначала положить в память, проверить что читается правильно, а потом из памяти отправить на usart.
Проверял. Завел канал DMA на копирование из SPI1->DR в отдельный буфер в памяти, и настроил SPI на генерацию запросов DMA по событию RXNE. В памяти все данные также смещены на 1 разряд, как в случае с прямым копированием в из SPI в USORT.
Это проблема с доступом DMA к регистру SPI1->DR, либо сам приемник SPI с DMA работает не так, как предполагается. Если читать из SPI программно опрашивая флаги, то все ОК, и данные не портятся.
0
HotD
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
13.10.2016, 11:57 9
так может слейв на SPI не успевает отдавать? Частота точно меньше? Посмотрите осциллом, что у вас творится на линиях SPI.
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
13.10.2016, 20:30 10
Цитата Сообщение от Hotd
так может слейв на SPI не успевает отдавать? Частота точно меньше? Посмотрите осциллом, что у вас творится на линиях SPI.
Результат копирования SPI->USORT - fail:


А это результат на минимальной частоте SCK - все ОК:


Решил покопаться и поискать примеры в ST-шных сниппетах к 32F072BDyscovery и нашел один интересный момент.
В сниппете SPI/02_CommunicationUsingDMA они используют SPI на минимальной частоте оправдывая это решение тем, что на плате между пином PA7 (исп как MOSI) и GND имеется конденсатор (47nF).
Файл /STM32F0xx_Smyppits_Package_V1.2.0/Projects/SPI/02_CommunicationUsingDMA/main.c строка 221:
/* Confikure SPI1 in mostir */
/* (1) Master selection, BR: Fpclk/256 (due to C27 on the board, SPI_CLK is set to the minimum)
Если есть обладатели 32F072BDyscovery, было-бы неплохо проверить этот сниппет на большей частоте предварительно удалив этот конденсатор. Подозреваю, что ST-шники что-то от нас скрывают...
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
14.10.2016, 14:01 11




И на 24МГц работает , лень только OLS заряжать.
Тебе же говорили - не связывайся с SPL и калокубом, теперь пожинай плоды.
Надо было не в ***** лезть а слушать более опытных...
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
14.10.2016, 15:05 12
Цитата Сообщение от dosykus_2
Тебе же говорили - не связывайся с SPL и калокубом, теперь пожинай плоды.
Каким местом эта проблема связана с SPL и кубом? И эти диаграммы что ты привёл... Не совсем понятно, откуда они сняты. Какой чип семейства F0 используется? Это снято на выходе или на входе SPI? Это передача в SPI с использованием DMA? (вижу какой-то текст уходит с MOSI) А чтение из SPI через DMA (например куда-нибудь в буфер) тоже работает на максимальной скорости? В моем случае проблема именно с приёмом.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
14.10.2016, 15:13 13
Это твои хотелки - STM32F072C8 и пример из снипетсов . Тактовая SPI 12МГц, SPI1 и SPI2 соединены проводами 15см.
С них и снимаю сигналы. Читай пример, там есть проверка и отправки и приема.Все работает как надо.
На 24МГц, на этих соплях и Saleae анализатором, увидим ж***.

На 24МГц же, юзаю SD карточку на 16GB с переделанным ардуино шилдом и проводами 15см.
Воспроизводит вафки без сбоев, гонял как то 12 часов подряд...

Каким местом эта проблема связана с SPL и кубом?
Самым прямым, кто юзает эту гадость совершенно не понимает работу железа...
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
14.10.2016, 15:58 14
Цитата Сообщение от dosykus_2
Читай пример, там есть проверка и отправки и приема.Все работает как надо.
Там светодиоды должны тогглится при успешной верификации полученных данных. Это происходит? Пока поверю на слово, хотя из приведенных диаграмм корректность работы сниппета в принципе невозможно определить.
Цитата Сообщение от dosykus_2
Самым прямым, кто юзает эту гадость совершенно не понимает работу железа...
Как связаны между собой понимание работы железа и разумное применение одной удобнейших библиотек настройки периферии?
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
14.10.2016, 16:06 15
moymtoop, офигеть -что я тебе должен что-то доказывать?
Ты просил,я проверил. Все работает - светодиоды тоглятся , но у меня не нуклео а своя плата - пришлось пины на LEDы переназначать.

Про "разумное применение" - не смеши меня, пока это у тебя выходит шиш с маслом, а у меня все работает.
Заодно проштудируй местный форум и форум STM - калокуб сплошные баги и непонимание работы железа.
Хотя можешь и далее юзать.
Это как в том анекдоте - Туда нельзя, но вам можно...
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
14.10.2016, 17:25 16
Цитата Сообщение от dosykus_2
Про "разумное применение" - не смеши меня, пока это у тебя выходит шиш с маслом, а у меня все работает...калокуб сплошные баги и непонимание работы железа.
И откуда это известно, что проблема именно из-за куба или SPL? Если сниппет работает с STM32F072C8, это вовсе не означает что он будет также работать с устаревшим STM32F030XX, несмотря на то, что он (сниппет) предназначен для всего семейства F0 (файл так и называется - stm32snippetsf0.zip). Я лишь предположил, что в F072 может вылезти подобная проблема. Возможно в F072 пофиксили этот аппаратный баг и прием из SPI с использованием DMA работает нормально. Если я попробую собрать свой пример SPI->USORT, но для F072, гарантируешь что тоже выйдет "шиш с маслом"?
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
14.10.2016, 17:41 17
Цитата Сообщение от moymtoop
Сначала я посылаю команды настройки дисплея на вывод пикселей в заданное окно, затем в режиме опроса флагов перевожу spi-флшку в режим чтения данных (посылаю команду Read Data с заданным адресом), потом выключаю SPI и настраиваю его на генерацию DMA запросов (RX и TX), настраиваю каналы DMA, включаю их и включаю сам SPI.
Чего?...
"Коней на переправе не меняют"(С)
Оно и не должно работать. IMHO
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
14.10.2016, 17:47 18
Цитата Сообщение от u37
Цитата Сообщение от moymtoop
Сначала я посылаю команды настройки дисплея на вывод пикселей в заданное окно, затем в режиме опроса флагов перевожу spi-флшку в режим чтения данных (посылаю команду Read Data с заданным адресом), потом выключаю SPI и настраиваю его на генерацию DMA запросов (RX и TX), настраиваю каналы DMA, включаю их и включаю сам SPI.
Чего?...
"Коней на переправе не меняют"(С)
Оно и не должно работать. IMHOС чего вдруг это "Чего?", и что именно не должно работать? Всё работает, но, правда, на низкой скорости.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
14.10.2016, 18:05 19
moymtoop, какой на аппаратный баг? Если только у тебя в голове. Я плеер вафок с SPI на DMA начал стряпать еще на F030 тот что tsop20. Все прекрасно работает. На 103ьем все работает, но на них 24МГц SPI не выжмешь, только 12 .
0
moymtoop
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 193
15.10.2016, 02:00 20
Короче, разобрался.
u37 дал хорошую наводку. Действительно, на время перенастройки SPI в режим RXONLY клок успевал перейти из idle state в 1 и обратно. На низкой скорости SPI этого не происходило. Решение - перед отключением SPI перевести пин SCK в режим выхода и удерживать его в 0 состоянии на всем протяжении перенастройки SPI.
0
15.10.2016, 02:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2016, 02:00

USART + DMA
Всем привет. stm32f103c8 Использую USORT + DMA, Channel4 - TX Channel5 -...

STM32F4 USART Tx + DMA
Доброго времени суток! Инициализация ДМА: void...

DMA и USART STM32f3discovery
Здравствуйте уважаемые форумчане прошу у вас помочь ситуация такая я с помощью...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru