gladov
Jan 19 2008, 22:26
Здравствуйте.
Наступил на такие грабли: в одном проекте с вышеобозначенным камнем использую 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 регистра, то все работает как надо. Почему - не понимаю.
RDRF: Переполнение приемного регистра хранения данных ППИ
0 = C момента последнего чтения SPI_RDR не было принято данных
1 = Данные были приняты и принятые данные переданы из последовательно - параллельного преобразователя в SPI_RDR с момента последнего чтения SPI_RDR
OVRES: Состояние ошибки переполнения
0 = С момента последнего чтения регистра состояния не было обнаружено ошибок переполнения.
1 = С момента последнего чтения регистра состояния была обнаружена ошибка переполнения. Ошибкой считается состояние, когда в SPI_RDR (регистр хранения принимаемых данных) были загружены данные из последовательно - параллельного преобразователя как минимум два раза без чтения.
gladov
Jan 20 2008, 11:04
Цитата(KAlex @ Jan 20 2008, 12:38)

RDRF: Переполнение приемного регистра хранения данных ППИ
0 = C момента последнего чтения SPI_RDR не было принято данных
1 = Данные были приняты и принятые данные переданы из последовательно - параллельного преобразователя в SPI_RDR с момента последнего чтения SPI_RDR
OVRES: Состояние ошибки переполнения
0 = С момента последнего чтения регистра состояния не было обнаружено ошибок переполнения.
1 = С момента последнего чтения регистра состояния была обнаружена ошибка переполнения. Ошибкой считается состояние, когда в SPI_RDR (регистр хранения принимаемых данных) были загружены данные из последовательно - параллельного преобразователя как минимум два раза без чтения.
Я знаю про эти флаги. Да, приемник переполнятеся если я не вычитываю данные, а я их иногда не вычитываю, если они мне не нужны. Ну и пусть себе переполняется! Почему при этом не срабатывает TXEMPTY?
Насколько я понимаю, при работе с DMA следует использовать прерывание по TXBUFE. Внизу кину пример. Я периодически запускаю DMA для SPI (к которому прикручен АЦП) в шедулере. Может поможет.
наступал на те же грабли. Именно приём через DMA и переставал работать. Пока перед запуском SPI на приём не добавил следующие строчки.
Код
uint32_t dummy;
while (AT91C_BASE_SPI1->SPI_SR & AT91C_SPI_RDRF)
dummy = AT91C_BASE_SPI1->SPI_RDR;
gladov
Jan 21 2008, 07:18
Цитата(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;
Вот-вот. Только я добавил это в перывании сразу после приема/передачи и тоже заработало.

Цитата(Dimmy @ Jan 20 2008, 17:21)

Насколько я понимаю, при работе с DMA следует использовать прерывание по TXBUFE. Внизу кину пример. Я периодически запускаю DMA для SPI (к которому прикручен АЦП) в шедулере. Может поможет.
Спасибо, попробую по TXBUFE отслеживать.