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

 
 
 
Reply to this topicStart new topic
> Чтение 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
MrYuran
сообщение Aug 2 2010, 09:49
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Ну так и делайте в main!


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
athlon64
сообщение Aug 2 2010, 10:12
Сообщение #3


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

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



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

Так у меня сейчас и сделано.
Но появилась необходимость выполнять некую процедуру периодически со строгим периодом, а процедура должна проводить чтение из Dataflash


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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #5


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

Группа: Свой
Сообщений: 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
MrYuran
сообщение Aug 2 2010, 11:54
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Под поллинг лучше переделать опрос флага, для выполнения "неких периодических действий"
А флаг выставлять по таймеру.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2010, 12:11
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #8


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

Группа: Свой
Сообщений: 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
aaarrr
сообщение Aug 2 2010, 12:43
Сообщение #9


Гуру
******

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



Цитата(sonycman @ Aug 2 2010, 16:16) *
А разве нельзя сделать поллинг и с DMA?

Можно, но с прерываниями можно сделать красивее.
Go to the top of the page
 
+Quote Post
vadon
сообщение Aug 2 2010, 12:51
Сообщение #10


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

Группа: Свой
Сообщений: 97
Регистрация: 27-07-10
Из: харьков
Пользователь №: 58 632



Потавьте простенькую переключалку задач (одна из задач занимается чтением DataFlash)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:58
Рейтинг@Mail.ru


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