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

 
 
> Не срабатывает прерывание при чтении по DMA
avg33
сообщение Aug 21 2018, 18:22
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 7-08-18
Пользователь №: 106 564



Я общаюсь с SPI флэшкой через USART в синхронном режиме. Передача и прием организованы по DMA каналам. Посылки фиксированной длины (1024 байта).
Алгоритм обмена выглядит так:
1. Активирую флэш (CS=0)
2. Настраиваю DMA канал на прием 1024 байт. Разрешаю прерывание по чтению IRQ_RX
3. Настраиваю другой DMA канал на передачу 1024 байт. Разрешаю прерывание по передаче IRQ_TX - в этот момент начинается передача/прием
4. В обработчике IRQ_TX очищаю флаг разрешения прерывания, отключаю DMA канал передачи
5. В обработчике IRQ_RX очищаю флаг разрешения прерывания, отключаю DMA канал чтения + деактивирую флэш (CS=1)

Ну то есть стандартный SPI обмен: посылаю 1024 байта - одновременно принимаю 1024 байта. По окончанию передачи/приема обрабатываю прерывания.

И все вроде бы работает. Но иногда (очень и очень редко) бывает ситуация, когда прерывание по передаче срабатывает, а прерывание по чтению нет!
Что я вижу в дебагере в этот момент:
1. Счетчик DMA по передаче равен 0, а по чтению 1. То есть DMA отправил 1024 байта, а прочитал почему-то только 1023. Соответственно, прерывание по чтению не сработает никогда.
2. Ошибки переполнения при чтении (overrun error) нет. Все флаги ошибок равны 0.
3. В регистре чтения USART лежит последний байт посылки (0x89). То есть последний (1024-й) байт посылки похоже таки пришел в регистр. Но счетчик не обнулился
4. Аппаратный флаг прерывания по чтению равен 0. То есть, последний байт был вычитан из регистра буфер. Либо он даже не устанавливался в 1, когда последний байт пришел в регистр

Не могу понять чем это все вызвано. Ведь если отправлено 1024 байта, то и прочитать шина должна была 1024 байта. Байт ведь не мог "потеряться". Или мог? В чем может быть причина такого поведения?
Повторюсь, ошибка проявляется крайне редко, в остальном алгоритм четко работает

Сообщение отредактировал avg33 - Aug 21 2018, 18:24
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Aug 23 2018, 08:21
Сообщение #2


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

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



Почитайте мои пути про SPI + DMA. Там LPC4337, но вдруг поможет. Логика, в целом, одинаковая.
1. https://electronix.ru/forum/index.php?showt...=145765&hl=
2. https://electronix.ru/forum/index.php?showt...=146837&hl=

В кратце: приоритет канала на приём (RX) должен быть выше (выше!!!), чем приоритет канала на передачу!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
avg33
сообщение Sep 12 2018, 15:36
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 7-08-18
Пользователь №: 106 564



Цитата(haker_fox @ Aug 23 2018, 11:21) *
Почитайте мои пути про SPI + DMA. Там LPC4337, но вдруг поможет. Логика, в целом, одинаковая.
1. https://electronix.ru/forum/index.php?showt...=145765&hl=
2. https://electronix.ru/forum/index.php?showt...=146837&hl=

В кратце: приоритет канала на приём (RX) должен быть выше (выше!!!), чем приоритет канала на передачу!

спасибо, с интересом почитал. но сколько не бился ничего не помогает. приоритет на чтение у меня, кстати, выше. не пойму в чем может быть дело
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 12 2018, 19:34
Сообщение #4


Гуру
******

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



Цитата(avg33 @ Sep 12 2018, 18:36) *
спасибо, с интересом почитал. но сколько не бился ничего не помогает. приоритет на чтение у меня, кстати, выше. не пойму в чем может быть дело

Значит Вы чего-то не понимаете в работе периферии своего МК. И не зная Ваш МК никто тут не сможет помочь.
Кстати, непонятно - зачем и TX-прерывания и RX? При работе с SPI обычно достаточно или того или другого (обычно RX), но никак не вместе.
Да и судя по сообщениям, Вы путаете прерывания с DMA-запросами. Это вообще то совершенно разные вещи.
Go to the top of the page
 
+Quote Post
avg33
сообщение Sep 12 2018, 20:31
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 7-08-18
Пользователь №: 106 564



Цитата(jcxz @ Sep 12 2018, 22:34) *
Значит Вы чего-то не понимаете в работе периферии своего МК. И не зная Ваш МК никто тут не сможет помочь.
Кстати, непонятно - зачем и TX-прерывания и RX? При работе с SPI обычно достаточно или того или другого (обычно RX), но никак не вместе.
Да и судя по сообщениям, Вы путаете прерывания с DMA-запросами. Это вообще то совершенно разные вещи.

Да, видимо что-то делаю не так. Буду признателен, если покажете рабочий пример SPI обмена по DMA. Любого контроллера. Хочу понять принцип.
Вы не первый кто пишет, что TX прерывание не нужно. Но я не могу начать передачу по DMA, не разрешив TX прерывание.
После отправки последнего байта DMA передает пришедший запрос на прерывание контроллеру - вот и вызывается обработчик. Как же от этого уйти?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 13 2018, 05:46
Сообщение #6


Гуру
******

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



Цитата(avg33 @ Sep 12 2018, 23:31) *
Да, видимо что-то делаю не так. Буду признателен, если покажете рабочий пример SPI обмена по DMA. Любого контроллера. Хочу понять принцип.

А чем Вам поможет как это сделано в каком-то левом МК? Если даже разберётесь в десятках КБ кода...
В разных МК работа DMA-периферия организована по-своему.

Цитата(avg33 @ Sep 12 2018, 23:31) *
Вы не первый кто пишет, что TX прерывание не нужно. Но я не могу начать передачу по DMA, не разрешив TX прерывание.

Вы опять путаете и себя и всех. Прерывания (от периферийного блока) к работе DMA имеют очень мало отношения. Прерывание - это сигнал идущий от периферийного блока к контроллеру прерываний, запрос DMA - сигнал идущий от периферийного блока к DMA-контроллеру. И это как правило - разные сигналы. Более того - в некоторых МК есть несколько разных DMA-запросов (single- и burst-).
Во многих МК прерывания от периферии (если она работает через DMA) вообще следует запрещать (например так в LPC, XMC4xxx), а обрабатывать прерывания от DMA-канала.
Единственное - что на работу DMA-канала могут влиять сигналы прерываний от самого DMA-контроллера (замораживать работу DMA-канала до обработки прерывания от этого канала).

Цитата(avg33 @ Sep 12 2018, 23:31) *
После отправки последнего байта DMA передает пришедший запрос на прерывание контроллеру

Пришедший откуда и куда? На какой контроллер передаёт? У Вас каша в голове, Вы не понимаете как работает система прерываний и DMA в вашем МК. Читайте мануал на МК.
В большинстве МК, с которыми я работал, при работе некоей периферии через DMA, прерывания от неё запрещались, а разрешалось прерывание от DMA-канала, о завершении пересылки блока (или очередного блока).
В этом прерывании или завершалась работа с периферией, или обрабатывалась текущая порция данных от неё и DMA-канал программировался на новый блок пересылки.
Это - штатный механизм работы через DMA.
И поищите примеры работы с DMA для своего секретного МК.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- avg33   Не срабатывает прерывание при чтении по DMA   Aug 21 2018, 18:22
- - zombi   Цитата(avg33 @ Aug 21 2018, 21:22) Я обща...   Aug 21 2018, 18:42
|- - avg33   Цитата(zombi @ Aug 21 2018, 21:42) В Ваше...   Aug 21 2018, 18:55
- - zombi   Цитата(avg33 @ Aug 21 2018, 21:22) В реги...   Aug 21 2018, 19:13
|- - avg33   Цитата(zombi @ Aug 21 2018, 22:13) Раз зн...   Aug 21 2018, 19:57
|- - controller_m30   Цитата(avg33 @ Aug 21 2018, 22:57) 3. Обр...   Aug 21 2018, 20:43
|- - avg33   Цитата(controller_m30 @ Aug 21 2018, 23:4...   Aug 22 2018, 20:23
- - controller_m30   В чём может быть дело не знаю. Тем более не извест...   Aug 21 2018, 19:15
|- - V_G   Цитата(avg33 @ Sep 13 2018, 06:31) Буду п...   Sep 12 2018, 23:44
|- - avg33   ЦитатаПрерывания (от периферийного блока) к работе...   Sep 13 2018, 13:18
|- - HardEgor   Цитата(avg33 @ Sep 13 2018, 20:18) Очень ...   Sep 14 2018, 08:43
||- - avg33   Цитата(HardEgor)Возможно при переводе перепутали п...   Sep 16 2018, 12:24
||- - jcxz   Цитата(avg33 @ Sep 16 2018, 15:24) А поци...   Sep 16 2018, 13:16
||- - HardEgor   Цитата(avg33 @ Sep 16 2018, 19:24) F2MC-1...   Sep 16 2018, 16:41
|- - jcxz   Цитата(avg33 @ Sep 13 2018, 16:18) Очень ...   Sep 14 2018, 10:02
|- - HardEgor   Цитата(jcxz @ Sep 14 2018, 17:02) Не обяз...   Sep 15 2018, 09:09
- - Herz   Господа! Прошу без грубостей. Если есть какие-...   Sep 16 2018, 14:06


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

 


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


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