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

 
 
> LPC1768+DMA+SSP, Как правильно сбросить переполненный канал
Golikov A.
сообщение Jan 19 2015, 16:36
Сообщение #1


Гуру
******

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



Всем привет!

Есть такая проблемка на LPC1768 настроен SSP в режиме slave
входные данные при помощи DMA перегружаться в буфер 1024 байта.

если на вход напихать данных так штук 2000, то буфер переполняется, для сброса этого дела
я
1. выключаю DMA каналы,
2. дожидаюсь что пропал битик включения канала
3. вычитываю буфер FIFO SSP
4. переинициализирую DMA канал

и мне приходит последний байт, хоть убейся об него...

Такая же переинициализация в середине обмена - все хорошо, а по переполнению вот такая фигня.

Кто сталкивался, как победить?

Как почистить кроме входного еще и выходной SPP FIFO?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jan 20 2015, 08:04
Сообщение #2


Гуру
******

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



Не будет...
Да сейчас я себе злобный буратино, но жизнь то она многообразная...
Интересно я один делаю тесты на устойчивость?

SSP-Slave, значит выдает данные только по клоку мастера. Вы начали ответный обмен, показали что у вас есть данные, положили их в буфер, настроили ДМА, тот их радостно набил в FIFO свое и SSP, все готовы, на низком старте. А тут мастер взял и сдох, или перегрузился, или передумал... дальше что?

Я фифо DMA смогу почистить, выключил канал, включил и оно якобы чистое (правда почему то в приемном 1 байт застревает, в ответном не знаю, не проверял). А вот фифо SSP никак выходное не почистишь...

Добавил требование после сброса обмена клочить на то чтобы выдавилось FIFO SSP

В обратную сторону, данные переменной длины, но никто не застрахован от того что во время инициализации или просто по дури мастер не напихает левых данных на вход. У меня входной буфер 1Кбайт, это больше нормальной посылки, DMA в штатном режиме никогда до конца его не набивает, и прерывания никакого нет на окончание посылки. Работа идет с принятой частью.

Но вот теперь у нас появился злобный мастер буратина, который взял и выдал свой клок на ногу клока SSP, что дальше? У нас весь буфер забит под завязку, данные не обработаются, не сойдется контрольная сумма и прочая байда, чтобы не было проблем DMA настроено на выключение после приема 1024 байт, и в целом оно это делает.
Но по какой-то неведомой причине после того как я его заново включаю оно мне досылает последний байт, хоть убейся об него...

То есть я так понимаю почему то не снимается бит запроса канала DMA от SSP, и как только тот включается, он сразу получает запрос и выполняет его, а в приемнике SSP лежит последний принятый байт. И вот это я не смог побороть.







------------------------------------------------------------------------------------------
Провел серию проверок, по ходу дела DMA на выход не набивает FIFO SSP целиком, а кладет по одному байтику по мере опустошения, по сигналы FIFO - пусто. Но 1 байт при обрыве обмена все же останется, это надо учитывать.

Вопрос как очистить выставленный запрос на канале DMA остается...

---------------------------------------------------------------------------------------------------------------------
Ну вот, если правильно локализовать проблему становиться понятно как с ней бороться.

Зависали не FIFO и не буферы, зависал сигнал запроса от SSP.

Правильный порядок сброса каналов
1. Отключаем каналы DMA
2. Ждем их выключения
3. Отключаем DMA на SSP
4. сбрасываем входное FIFO SSP (читаем 8 раз)
5. сбрасываем выходное FIFO SSP (тут надо мастеру вычитать 1 возможно оставшийся байт или перейти в мастер режим и выдавить его)
6. перенастраиваем каналы DMA
7. дожидаемся включения
8. включаем DMA в SSP

у меня оставшийся байт погоды не делает при начале обмена он пропадет, если же он мешает, то после это процедуры можно мастером его считать, но так чтобы не запустить новую передачу обратно и еще раз сбросить. А можно перевести SSP в режим мастера и выдавить все байты наружу, а потом вернуть в слейв режим.

Но в любом случае, такой перезапуск приводит систему в начальное состояние (с точностью до байта в выходном FIFO) и ура!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 20 2015, 08:15
Сообщение #3


Гуру
******

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



Цитата(Golikov A. @ Jan 20 2015, 13:15) *
SSP-Slave, значит выдает данные только по клоку мастера. Вы начали ответный обмен, показали что у вас есть данные, положили их в буфер, настроили ДМА, тот их радостно набил в FIFO свое и SSP, все готовы, на низком старте. А тут мастер взял и сдох, или перегрузился, или передумал... дальше что?
Я фифо DMA смогу почистить, выключил канал, включил и оно якобы чистое (правда почему то в приемном 1 байт застревает, в ответном не знаю, не проверял). А вот фифо SSP никак выходное не почистишь...

Вы уверены?
Вообще-то у канала нет бита выключения, а только бит разрешения. И я сильно сомневаюсь, что при его запрещении, FIFO канала очистится. Вроде в UM это явно не указано.
Оно даже может не очищаться при подаче аппаратного RESET на процессор.

Цитата(Golikov A. @ Jan 20 2015, 13:15) *
Добавил требование после сброса обмена клочить на то чтобы выдавилось FIFO SSP

Вы сначала выясните где именно у вас байты остаются в каком FIFO - SSP или DMA. Может оба нужно выфлушивать.
Странно у вас как-то система построена - часть может вдруг сброситься (мастер), а остальная - нет. Может это надо как-то исправить? Сброс общий для обоих сделать.

Цитата(Golikov A. @ Jan 20 2015, 13:15) *
В обратную сторону, данные переменной длины, но никто не застрахован от того что во время инициализации или просто по дури мастер не напихает левых данных на вход. У меня входной буфер 1Кбайт, это больше нормальной посылки, DMA в штатном режиме никогда до конца его не набивает, и прерывания никакого нет на окончание посылки. Работа идет с принятой частью.

Не понимаю - в чём тут проблема?
Программируете DMA на какой-то блок данных. Даже пускай не зная сколько передаст мастер. Когда этот блок закончится - придёт прерывание, в нём запрограммируете на след. блок, пока он заполняется - разгребаете предыдущий.
Если у Вас перегрузился мастер, то заводИте ещё реакцию на прерывание от снятия сигнала CS и в этом ISR чистите (выфлушиваете) FIFO. SSP на это время надо наверное перевести в режим мастер
(с отключенными пинами). А для мастера требование - задержка от момента старта ПО до ближайшей транзакции по SSP достаточная для очистки.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Golikov A.   LPC1768+DMA+SSP   Jan 19 2015, 16:36
- - jcxz   Цитата(Golikov A. @ Jan 19 2015, 22:36) К...   Jan 20 2015, 03:34
- - Golikov A.   ЦитатаВы уверены? Вообще-то у канала нет бита выкл...   Jan 20 2015, 09:02
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 15:02) б...   Jan 20 2015, 09:26
- - Golikov A.   ЦитатаУ Вас неоптимально сконфигурён DMA для SSP. ...   Jan 20 2015, 09:51
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 15:51) ч...   Jan 20 2015, 10:04
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 15:51) а...   Jan 20 2015, 10:35
- - Golikov A.   правильно не 1 микросекунда, а 100 тактов. И это в...   Jan 20 2015, 10:14
- - Golikov A.   Пробросить один сигнал периферии на 2 ноги не выхо...   Jan 20 2015, 10:41
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 16:41) П...   Jan 20 2015, 11:19
- - Golikov A.   ЦитатаНе хватает авторитета попросить схемотехника...   Jan 20 2015, 11:48
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 17:48) К...   Jan 20 2015, 14:23
- - Golikov A.   ЦитатаЭто короткий проводок, может даже - сопля на...   Jan 20 2015, 14:43
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 20:43) В...   Jan 20 2015, 16:27
- - Golikov A.   ну теперь разбивкой на пакеты будет сигнал CS, кот...   Jan 20 2015, 16:45
|- - jcxz   Цитата(Golikov A. @ Jan 20 2015, 22:45) п...   Jan 20 2015, 17:40
- - Golikov A.   Переписал, да чудо - чудесное. Наконец то заработа...   Jan 20 2015, 18:51
|- - jcxz   Цитата(Golikov A. @ Jan 21 2015, 00:51) П...   Jan 21 2015, 04:03
- - Golikov A.   однако ДМА поддерживается весьма небольшим числом ...   Jan 21 2015, 08:13
|- - jcxz   Цитата(Golikov A. @ Jan 21 2015, 14:13) о...   Jan 21 2015, 09:21
- - Golikov A.   Доступ к периферии у ДМА ограничен, не знаю можно ...   Jan 21 2015, 10:16
|- - jcxz   Цитата(Golikov A. @ Jan 21 2015, 16:16) Д...   Jan 21 2015, 10:55
- - Golikov A.   написано что периферийный блоки поддерживающие GP_...   Jan 21 2015, 11:22
|- - jcxz   Цитата(Golikov A. @ Jan 21 2015, 17:22) н...   Jan 22 2015, 03:09
- - Golikov A.   а синхронизация как? Прерывание по первому пришедш...   Jan 22 2015, 07:00
|- - jcxz   Цитата(Golikov A. @ Jan 22 2015, 13:00) а...   Jan 22 2015, 08:57
- - бомж   Цитата(Golikov A. @ Jan 19 2015, 18:36) В...   Feb 2 2015, 20:05
- - Golikov A.   ЦитатаЯ вот так справился с такой проблемой: ну пл...   Feb 2 2015, 20:52
|- - бомж   > ну плохо вы справились и не с той проблемой.....   Feb 3 2015, 22:17
- - Golikov A.   Цитата>читая из регистра данных вы вычитываете ...   Feb 4 2015, 06:01


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:14
Рейтинг@Mail.ru


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