|
Не срабатывает прерывание при чтении по DMA |
|
|
|
Aug 21 2018, 18:22
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Sep 12 2018, 15:36
|
Группа: Участник
Сообщений: 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) должен быть выше (выше!!!), чем приоритет канала на передачу! спасибо, с интересом почитал. но сколько не бился ничего не помогает. приоритет на чтение у меня, кстати, выше. не пойму в чем может быть дело
|
|
|
|
|
Sep 12 2018, 19:34
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(avg33 @ Sep 12 2018, 18:36)  спасибо, с интересом почитал. но сколько не бился ничего не помогает. приоритет на чтение у меня, кстати, выше. не пойму в чем может быть дело Значит Вы чего-то не понимаете в работе периферии своего МК. И не зная Ваш МК никто тут не сможет помочь. Кстати, непонятно - зачем и TX-прерывания и RX? При работе с SPI обычно достаточно или того или другого (обычно RX), но никак не вместе. Да и судя по сообщениям, Вы путаете прерывания с DMA-запросами. Это вообще то совершенно разные вещи.
|
|
|
|
|
Sep 12 2018, 20:31
|
Группа: Участник
Сообщений: 12
Регистрация: 7-08-18
Пользователь №: 106 564

|
Цитата(jcxz @ Sep 12 2018, 22:34)  Значит Вы чего-то не понимаете в работе периферии своего МК. И не зная Ваш МК никто тут не сможет помочь. Кстати, непонятно - зачем и TX-прерывания и RX? При работе с SPI обычно достаточно или того или другого (обычно RX), но никак не вместе. Да и судя по сообщениям, Вы путаете прерывания с DMA-запросами. Это вообще то совершенно разные вещи. Да, видимо что-то делаю не так. Буду признателен, если покажете рабочий пример SPI обмена по DMA. Любого контроллера. Хочу понять принцип. Вы не первый кто пишет, что TX прерывание не нужно. Но я не могу начать передачу по DMA, не разрешив TX прерывание. После отправки последнего байта DMA передает пришедший запрос на прерывание контроллеру - вот и вызывается обработчик. Как же от этого уйти?
|
|
|
|
Сообщений в этой теме
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    jcxz Цитата(avg33 @ Sep 12 2018, 23:31) Да, ви... Sep 13 2018, 05:46     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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|