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

 
 
> LPC4337, DMA + SSP, В редких случаях приём не завершается полностью
haker_fox
сообщение Feb 13 2018, 09:08
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Добрый день, коллеги!
Есть связка на приём и передачу через SSP + DMA в упомянутом микроконтроллере. В некоторый момент при тестировании обнаружил, что иногда канал DMA оставляет 4 непринятых байта в регистре CONTROL в поле size. При этом контроллер DMA не выставляет ни одного флага ошибки. Соответственно бит ENABLE этого канала остаётся в единице.

Как устроены транзакции? Есть два канала dma. Канал 2 обслуживает передачу через SSP, канал 0 - приём через SSP (более приоритетный канал на приём). Далее, программируем одинаковое количество байт на передачу, соответственно и на приём тоже. Сначал включаем канал приёма. Затем - канал передачи, и именно по нему ждём завершения транзакции. Подразумевается, что канал приёма их завершит тоже, т.к. шина SSP - синхронная.

В целом всё работает. Запускаю циклический тест (на шине висит флешка). Флешку пишу и читаю из неё. Соответственно адреса буферов всегда одни и теже. На 1000, скажем, транзакций в очень редких случаях происходит описанная проблема.

Я уже умотался искать проблему. Несколько минимизировал её появление, установив burst size в 1 байт на приём и передачу. Если сделать 4 байта, то ошибка проявляется значительно чаще. Коллеги, я просто не понимаю источник ошибки, т.к. не один флаг не взводится. Флаги переполнения FIFO RX у SSP тоже обнулены. Из-за чего так может вести себя дмашник?

Что особенно печалит: я не могу воспроизвести ошибку, и нет флагов ошибки...

P.S. SSP - мастер. CS дёргаю программно, т.к. нужно выдерживать времянки.

P.S.S. 4 байта остатка вовсе не обязательно. Сейчас поймал 3 и 7.
P.S.S.S. Есть зависимость от оптимизации компилятора. Можно сказать, что ошибка не появляется, или слииишком редка, если оптимизация 0. И чуть чаще на максимальном уровне оптимизации.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Feb 13 2018, 10:52
Сообщение #2


Гуру
******

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



Цитата(haker_fox @ Feb 13 2018, 11:08) *
Сначал включаем канал приёма. Затем - канал передачи, и именно по нему ждём завершения транзакции. Подразумевается, что канал приёма их завершит тоже, т.к. шина SSP - синхронная.

Вроде как должно быть очевидным, что ждать завершения нужно по каналу приёма, но никак не передачи. wacko.gif

Цитата(haker_fox @ Feb 13 2018, 11:08) *
Подразумевается, что канал приёма их завершит тоже, т.к. шина SSP - синхронная.

Шина синхронная и что с того? Данные на передачу надо сперва записать, а потом они начнут выдвигаться, а на приём наоборот - сперва вдвигаются, а потом появляются в регистре приёма.

Цитата(haker_fox @ Feb 13 2018, 11:08) *
Коллеги, я просто не понимаю источник ошибки, т.к. не один флаг не взводится. Флаги переполнения FIFO RX у SSP тоже обнулены. Из-за чего так может вести себя дмашник?

Как можно не понимать очевидного??? wacko.gif Вы же сами пишете про FIFO.
Записали Вы в TX.FIFO последние данные - данных по TX у Вас больше нет, Вам приходит событие о завершении TX DMA-пересылки. Вы режете канал. А в это время SSP продолжает передачу из TX.FIFO находящихся там данных (ну и соответственно - приём в RX.FIFO).
Вроде должно быть очевидным, что работу с SSP нужно всегда завершать по завершению RX блока. Даже без FIFO.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 13 2018, 12:30
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (jcxz @ Feb 13 2018, 18:52) *
Вроде должно быть очевидным, что работу с SSP нужно всегда завершать по завершению RX блока. Даже без FIFO.

ОК! Но почему же тогда это проявляется очень редко? И зависит от burst size? Я действительно не понимаю, возможно от сильной усталости... Спасибо! Завтра на работе попробую следовать вашему совету!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 13 2018, 12:38
Сообщение #4


Гуру
******

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



Цитата(haker_fox @ Feb 13 2018, 14:30) *
ОК! Но почему же тогда это проявляется очень редко? И зависит от burst size? Я действительно не понимаю, возможно от сильной усталости... Спасибо! Завтра на работе попробую следовать вашему совету!

Потому что выключаете SSP Вы видимо в ISR, который активизируется завершением DMA? Из-за задержки входа в ISR (наложения других более приоритетных ISR или участков с запрещёнными прерываниями), иногда все данные из TX.FIFO успевают уйти (а в RX - все прийти). На эту задержку будет влиять и оптимизация и размер burst.
Тогда, уменьшив SCLK, получите в среднем более частое возникновение бага.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 13 2018, 12:53
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (jcxz @ Feb 13 2018, 20:38) *
Потому что выключаете SSP Вы видимо в ISR, который активизируется завершением DMA?

Я не выключаю SSP. SSP всегда включен. Перед транзакцией разрешатся всегда передача через DMA. А вот канал приёма DMA включатся только в том случае, если принятые данные нужны. Иногда же данные достаточно просто передать, а ничего вычитывать из слейва не требуется. В начале каждой транзакции через шину я вычитываю FIFO буфер SSP, т.к. там есть данные, если в предыдущей транзакции мы не использовали данные от слейва. Также очищаю флаг OVERRUN. В связи с этим понимаю, что зря NXP не сделала возможность отключить приёмник SSP. И всегда приходится вычитывать его FIFO.
Ну и включив передающий канал ДМА (предварительно включив, если требуется принимающий), я разу же жду события от прерывания TC (по передаче). Как только оно наступает, я читаю, что все транзакции на шине закончились.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 13 2018, 13:19
Сообщение #6


Гуру
******

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



Цитата(haker_fox @ Feb 13 2018, 14:53) *
Я не выключаю SSP. SSP всегда включен.
...
я разу же жду события от прерывания TC (по передаче). Как только оно наступает, я читаю, что все транзакции на шине закончились.

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

Сообщений в этой теме
- haker_fox   LPC4337, DMA + SSP   Feb 13 2018, 09:08
|- - haker_fox   QUOTE (jcxz @ Feb 13 2018, 21:19) Она ещё...   Feb 13 2018, 13:25
|- - jcxz   Цитата(haker_fox @ Feb 13 2018, 15:25) З....   Feb 13 2018, 13:45
|- - haker_fox   QUOTE (jcxz @ Feb 13 2018, 21:45) Поэтому...   Feb 13 2018, 14:03
|- - jcxz   Цитата(haker_fox @ Feb 13 2018, 16:03) Чт...   Feb 13 2018, 14:19
|- - haker_fox   QUOTE (jcxz @ Feb 13 2018, 22:19) И не за...   Feb 13 2018, 14:34
|- - jcxz   Цитата(haker_fox @ Feb 13 2018, 16:34) Ну...   Feb 13 2018, 16:07
|- - haker_fox   QUOTE (jcxz @ Feb 14 2018, 00:07) Если Вы...   Feb 14 2018, 04:41
|- - jcxz   Цитата(haker_fox @ Feb 14 2018, 06:41) Сл...   Feb 14 2018, 15:14
|- - haker_fox   QUOTE (jcxz @ Feb 14 2018, 23:14) Никак. ...   Feb 15 2018, 00:13
|- - jcxz   Цитата(haker_fox @ Feb 15 2018, 02:13) Ст...   Feb 15 2018, 09:00
|- - haker_fox   QUOTE (jcxz @ Feb 15 2018, 17:00) Драйвер...   Feb 15 2018, 09:14
|- - jcxz   Цитата(haker_fox @ Feb 15 2018, 11:14) Сп...   Feb 15 2018, 09:20
|- - haker_fox   QUOTE (jcxz @ Feb 15 2018, 17:20) Возможн...   Feb 15 2018, 10:06
|- - jcxz   Цитата(haker_fox @ Feb 15 2018, 12:06) В ...   Feb 15 2018, 10:57
|- - haker_fox   QUOTE (jcxz @ Feb 15 2018, 18:57) Для это...   Feb 15 2018, 13:07
|- - jcxz   Цитата(haker_fox @ Feb 15 2018, 15:07) Да...   Feb 15 2018, 13:16
|- - haker_fox   QUOTE (jcxz @ Feb 15 2018, 21:16) SCLK? В...   Feb 16 2018, 00:14
|- - jcxz   Цитата(haker_fox @ Feb 16 2018, 02:14) Не...   Feb 16 2018, 07:59
- - haker_fox   P.S.S.S. И всё-таки особенность есть. Я доделал в ...   Feb 15 2018, 08:27


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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 21:30
Рейтинг@Mail.ru


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