реклама на сайте
подробности

 
 
> SAM4L, DMA и проц
sifadin
сообщение May 22 2014, 17:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698



Здравствуйте!
Использую массив памяти, разбитый на две части для записи во флэш
DMА заполняет одну половину массива, а другую проц перекидывает во флэш
Потом они меняются
итд
При считывании ошибки, неясно почему.
Вот думаю
Могут ли процессор и DMA одновременно обращатся к SRAM?
Останавливается ли проц когда работает DMA?
В документации не нашел. В глаза не бросилось.
Странно такой важный пункт могли бы почетче
Подскажите плз, если кто знает
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение May 31 2014, 07:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Да я не говорю про проблемы, я говорю про сложности.
вот типа завершение через Channel enable как раз из того раздела.

If a channel must be disabled without losing data in the FIFO, the Halt bit must be se
so that further DMA requests are ignored. The Active bit must then be polled until it
reaches 0, indicating that there is no data left in the FIFO. Finally, the Channel Enable
bit can be cleared.

ибо
A channel can be disabled by clearing the Enable bit. This causes the current AHB
transfer (if one is in progress) to complete and the channel is then disabled. Any data
in the FIFO of the relevant channel is lost. Restarting the channel by setting the
Channel Enable bit has unpredictable effects, the channel must be fully re-initialized.

Но это все для LPC на случай переключения руками. А что в этом проце фиг знает... Но я бы осцилом поглядел на SPI обмен, не возникает ли в момент переключения каких тупней, типа пропусков клоков, их дрожания и так далее... Проц в SPI слейв или мастер, не очень понятно из вводного сообщения. SPI железный или на прерываниях, есть ли у него ФИФО. То есть я бы поискал вокруг ДМА проблеммы
Go to the top of the page
 
+Quote Post
sifadin
сообщение May 31 2014, 10:25
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698



Цитата(Golikov A. @ May 31 2014, 15:20) *
SPI железный или на прерываниях, есть ли у него ФИФО. То есть я бы поискал вокруг ДМА проблеммы


SPI железный, в режиме SLAVE, фифо есть он выключен
байты группируются в кадры по 12штук, те 3три 32бит слова

между кадрами интервал 30мкс
частота spi 2мгц
проц 10мгц
DMA перегружается автоматически. У нее есть регистры перегрузки MARR, TCRR
Одновременно срабытывает прерывание и в регистры перегрузки пишеться новое значение

А проблемы не со стороны DMA а со стороны проца
Потому что есть передавать константы то проблем нет. Это значит проц считывает не с того адреса поэтоиу если все константы то результат неискажается
То же самое - если DMA остановить то последние данные считывается без ошибок
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 31 2014, 14:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sifadin @ May 31 2014, 20:35) *
SPI железный, в режиме SLAVE, фифо есть он выключен
байты группируются в кадры по 12штук, те 3три 32бит слова

Зачем выключен FIFO???

Цитата(sifadin @ May 31 2014, 20:35) *
между кадрами интервал 30мкс
частота spi 2мгц
проц 10мгц

DMA-контроллер скорей всего тактируется от тех-же 10МГц и шина внутри МК - тож.
А 2МГц - это уже в таком случае должно хорошо нагружать шину.
По-крайней мере у меня на LPC1758 SPI на 2МГц работающий через DMA и CPU на 6МГц уже возникали иногда
overflow SPI.FIFO. И это при том что у меня FIFO включен! Правда у меня ещё параллельно несколько каналов DMA
работало. Но всё равно - пришлось снизить частоту SPI - помогло.
Какой у вашего CPU приоритет доступа к шине и какой приоритет у DMA-контроллера?

Подумайте что будет, если у CPU приоритет доступа выше, он делает fetching блока инструкций (из-за выполнения инструкции перехода например),
а в это время DMA надо в память записать, а вы ещё и FIFO отключили...
Ещё неизвестно - на какой шине сидит ваш SPI, и к каким шинам обращается CPU - возможно к низкочастотным и из-за этого
могут возникать ожидания. А у вас DMA-контроллеру срочно записать данные надо.
И вообще - вы обрабатываете события переполнения SPI?

Совет (в порядке убывания важности):
сделайте приоритет доступа к шине для DMA выше чем для CPU (если это позволяет SAM4L),
включайте FIFO, повышайте частоту CPU (шины), если есть возможность - понижайте частоту SPI.

PS: Да, у вас-же два DMA-канала используются - для SPI.TX и для SPI.RX. Надеюсь для TX-канала Вы поставили приоритет ниже, чем для RX-канала?

PPS: Также полезно строить циклы ожидания флага не так как у вас - while(!blocktowrite) - это-же загружает шину непрерывными бессмысленными транзакциями чтения -
одно только это может забивать шину (если у CPU приоритет доступа к шине выше чем у DMA).
Полезно в таком цикле выполнять инструкцию WFE (или WFI) если уж у вас без ОС. Или использовать ОС, выполняющую в Idle-процессе эти же WFE/WFI.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 04:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016