Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение Dataflash в обработчике прерывания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
athlon64
Процессор AT91SAM7X, IAR 5.4
Необходимо в обработчике прерывания производить чтение из Dataflash.
Если делать это из main то всё нормально. Если же читать Dataflash в обработчике прерывания от таймера (период 250 мс) или в другом обработчике прерывания, то происходит зацикливание при проверке (while (AT45_IsBusy(pAt45)) wink.gif. Для работы с Dataflash использовались библиотеки из примеров в IAR (at45.c и spid.c).

Обработчик прерывания от таймера:
Код
void IRQ_TIMER_TC0()
{
  unsigned char temp_char;
  volatile unsigned int dummy;

dummy = AT91C_BASE_TC0->TC_SR; // Сбрасываем статусный бит
temp_char=EPR_Rd(MyAdr);
}


Функции чтения из Dataflash:
Код
char EPR_Rd(unsigned int adr)
{
unsigned char temp;

AT45_Read(&at45, &temp, 1, adr);

return(temp);
}

Код
void AT45_Read (At45 *pAt45, unsigned char *pBuffer, unsigned int size, unsigned int address)
{
  AT45_SendCommand(pAt45, AT45_CONTINUOUS_READ_LEG, 8, pBuffer, size, address, 0, 0);  // Issue a continuous read array command
  while (AT45_IsBusy(pAt45));  // Тут зацикливаемся
}

MrYuran
Цитата(athlon64 @ Aug 2 2010, 13:25) *
Если делать это из main то всё нормально.

Ну так и делайте в main!
athlon64
Цитата(MrYuran @ Aug 2 2010, 15:49) *
Ну так и делайте в main!

Так у меня сейчас и сделано.
Но появилась необходимость выполнять некую процедуру периодически со строгим периодом, а процедура должна проводить чтение из Dataflash
aaarrr
Цитата(athlon64 @ Aug 2 2010, 13:25) *
Для работы с Dataflash использовались библиотеки из примеров в IAR (at45.c и spid.c).

Вообще-то ответ лежит на поверхности исходников "библиотек".
Если хотите использовать именно эти процедуры в прерывании таймера, то придется сделать две вещи:
1. Разрешить вложенные прерывания
2. Установить для таймера более низкий приоритет, чем для SPI

Но лучше, я так думаю, сочинить свой драйвер под свои нужды.
sonycman
Цитата(aaarrr @ Aug 2 2010, 15:34) *
Вообще-то ответ лежит на поверхности исходников "библиотек".
Если хотите использовать именно эти процедуры в прерывании таймера, то придется сделать две вещи:
1. Разрешить вложенные прерывания
2. Установить для таймера более низкий приоритет, чем для SPI

Но лучше, я так думаю, сочинить свой драйвер под свои нужды.

То есть, в этих "библиотеках" работа с SPI идёт через прерывания?
Но зачем? А если переделать под поллинг?
MrYuran
Цитата(sonycman @ Aug 2 2010, 15:49) *
Но зачем? А если переделать под поллинг?

Под поллинг лучше переделать опрос флага, для выполнения "неких периодических действий"
А флаг выставлять по таймеру.
aaarrr
Цитата(sonycman @ Aug 2 2010, 15:49) *
То есть, в этих "библиотеках" работа с SPI идёт через прерывания?
Но зачем?

Да, через прерывания. Потому что используется PDC.

Цитата(sonycman @ Aug 2 2010, 15:49) *
А если переделать под поллинг?

Лучше ничего не переделывать, а спокойно написать свое. Пара сотен строчек кода на весь SPI с DF.
sonycman
Цитата(aaarrr @ Aug 2 2010, 16:11) *
Да, через прерывания. Потому что используется PDC.

А разве нельзя сделать поллинг и с DMA?

Цитата(aaarrr @ Aug 2 2010, 16:11) *
Лучше ничего не переделывать, а спокойно написать свое. Пара сотен строчек кода на весь SPI с DF.

Согласен, сам всегда так и поступаю.
Но народ любит всё готовенькое smile.gif
aaarrr
Цитата(sonycman @ Aug 2 2010, 16:16) *
А разве нельзя сделать поллинг и с DMA?

Можно, но с прерываниями можно сделать красивее.
vadon
Потавьте простенькую переключалку задач (одна из задач занимается чтением DataFlash)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.