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

 
 
> Чтение Dataflash в обработчике прерывания, зависания
athlon64
сообщение Aug 2 2010, 09:25
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Процессор 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));  // Тут зацикливаемся
}



--------------------
Руслан
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Aug 2 2010, 11:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(athlon64 @ Aug 2 2010, 13:25) *
Для работы с Dataflash использовались библиотеки из примеров в IAR (at45.c и spid.c).

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

Но лучше, я так думаю, сочинить свой драйвер под свои нужды.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 2 2010, 11:49
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



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

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

То есть, в этих "библиотеках" работа с SPI идёт через прерывания?
Но зачем? А если переделать под поллинг?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2010, 12:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

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

Лучше ничего не переделывать, а спокойно написать свое. Пара сотен строчек кода на весь SPI с DF.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 2 2010, 12:16
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aaarrr @ Aug 2 2010, 16:11) *
Да, через прерывания. Потому что используется PDC.

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

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

Согласен, сам всегда так и поступаю.
Но народ любит всё готовенькое smile.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 04:30
Рейтинг@Mail.ru


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