Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7X256, SPI, прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
gladov
Здравствуйте.

Наступил на такие грабли: в одном проекте с вышеобозначенным камнем использую SPI. Причем в основном с PDC, иногда (если 1 байт) то без оного. Но в любом случае, окончание операции отсекаю по прерыванию TXEMPTY. После нескольких удачных операций перестает срабатывать прерывание. При отладке в RAM через JTAG если остановить выполнение, в памяти наблюдается следующая картина:
- В регистре SPI_SR бит TXEMPTY установлен;
- В SPI_IMR TXEMPTY установлен;
- В AIC_IPR установлен бит периферии SPI
- В AIC_IMR установлен бит периферии SPI
- В соотв. AIC_SMR прерывание сконфигурировано по уровню
- В ядре (CPSR) прерывания разрешены
И прерывание НЕ ВЫЗЫВАЕТСЯ!!!

Кто может подсказать, где еще могут быть запрещены прерывания?

ЗЫ: Работа с SPI организована так, что чтение осуществляется только через PDC, поэтому я использую только одно прерывание - TXEMPTY. Ессно, свалившись в прерывание, я запрещаю TXEMPTY (т.к. по уровню работаем), а потом, при очередной посылке данных, готовлю передатчик и разрешаю TXEMPTY. Напомню, что первые несколько операций проходят успешно. Путем шаманских плясок выяснилось, что если в начале каждого прерывания выполнять чтение SPI_RDR регистра, то все работает как надо. Почему - не понимаю.
KAlex
RDRF: Переполнение приемного регистра хранения данных ППИ
0 = C момента последнего чтения SPI_RDR не было принято данных
1 = Данные были приняты и принятые данные переданы из последовательно - параллельного преобразователя в SPI_RDR с момента последнего чтения SPI_RDR

OVRES: Состояние ошибки переполнения
0 = С момента последнего чтения регистра состояния не было обнаружено ошибок переполнения.
1 = С момента последнего чтения регистра состояния была обнаружена ошибка переполнения. Ошибкой считается состояние, когда в SPI_RDR (регистр хранения принимаемых данных) были загружены данные из последовательно - параллельного преобразователя как минимум два раза без чтения.
gladov
Цитата(KAlex @ Jan 20 2008, 12:38) *
RDRF: Переполнение приемного регистра хранения данных ППИ
0 = C момента последнего чтения SPI_RDR не было принято данных
1 = Данные были приняты и принятые данные переданы из последовательно - параллельного преобразователя в SPI_RDR с момента последнего чтения SPI_RDR

OVRES: Состояние ошибки переполнения
0 = С момента последнего чтения регистра состояния не было обнаружено ошибок переполнения.
1 = С момента последнего чтения регистра состояния была обнаружена ошибка переполнения. Ошибкой считается состояние, когда в SPI_RDR (регистр хранения принимаемых данных) были загружены данные из последовательно - параллельного преобразователя как минимум два раза без чтения.


Я знаю про эти флаги. Да, приемник переполнятеся если я не вычитываю данные, а я их иногда не вычитываю, если они мне не нужны. Ну и пусть себе переполняется! Почему при этом не срабатывает TXEMPTY?
Dimmy
Насколько я понимаю, при работе с DMA следует использовать прерывание по TXBUFE. Внизу кину пример. Я периодически запускаю DMA для SPI (к которому прикручен АЦП) в шедулере. Может поможет.
xelax
наступал на те же грабли. Именно приём через DMA и переставал работать. Пока перед запуском SPI на приём не добавил следующие строчки.

Код
uint32_t dummy;
  while (AT91C_BASE_SPI1->SPI_SR & AT91C_SPI_RDRF)
    dummy = AT91C_BASE_SPI1->SPI_RDR;
gladov
Цитата(xelax @ Jan 21 2008, 09:55) *
наступал на те же грабли. Именно приём через DMA и переставал работать. Пока перед запуском SPI на приём не добавил следующие строчки.

Код
uint32_t dummy;
  while (AT91C_BASE_SPI1->SPI_SR & AT91C_SPI_RDRF)
    dummy = AT91C_BASE_SPI1->SPI_RDR;


Вот-вот. Только я добавил это в перывании сразу после приема/передачи и тоже заработало. 07.gif

Цитата(Dimmy @ Jan 20 2008, 17:21) *
Насколько я понимаю, при работе с DMA следует использовать прерывание по TXBUFE. Внизу кину пример. Я периодически запускаю DMA для SPI (к которому прикручен АЦП) в шедулере. Может поможет.


Спасибо, попробую по TXBUFE отслеживать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.