Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-17 20:10

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 2017-сен-07 14:10 
Не в сети

Зарегистрирован: 2015-фев-25 09:17
Сообщения: 12
Реализовал обработку прерываний 1553 по аналогии с примером. А именно:

Код:
uint32_t status = MIL_STD_1553x->STATUS;

if((status & MIL_STD_1553_STATUS_ERR) != 0)
{
   ****
   MIL_STD_1553x->CONTROL &= ~MIL_STD_1553_CONTROL_RERR;
   MIL_STD_1553x->INTEN = MIL_STD_1553_INTEN_IDLEIE;
   return;
}

MIL_STD_1553x->CONTROL |= MIL_STD_1553_CONTROL_RERR;

if((status & MIL_STD_1553_STATUS_IDLE) != 0)
{
   ****
   MIL_STD_1553x->INTEN = MIL_STD_1553_INTEN_RFLAGNIE | MIL_STD_1553_INTEN_VALMESSIE | MIL_STD_1553_INTEN_ERRIE;
   return;
}

****
isr_status = status;

if((status & MIL_STD_1553_STATUS_VALMESS) != 0)
{
   mil_std_isr_valmess();
   MIL_STD_1553x->INTEN = MIL_STD_1553_INTEN_IDLEIE | MIL_STD_1553_INTEN_ERRIE;
   isr_status_post = MIL_STD_1553x->STATUS;
   return;
}

if(status & MIL_STD_1553_STATUS_RFLAGN)
{
   ***
   MIL_STD_1553x->INTEN = MIL_STD_1553_INTEN_VALMESSIE | MIL_STD_1553_INTEN_ERRIE;
}


Далее происходит следующее. Вызвается обработчик с isr_status=RCVA|VALMESS, после обработки mil_std_isr_valmess в isr_status_post=RCVA|ERR.
После этого прерывания перестают вызываться, и если прочитать MIL_STD_1553x->STATUS, там будет ERR|IDLE.
Вопросов два:
1. Почему при обработке прерывания VALMESS и выставлении флага ERR не пришел запрос на очередное прерывание (ERRIE стоит всегда)? На сколько я понял прерывания 1553 - по фронту, pending interrupt сбрасывается в момент входа в прерывание.
2. Как видно, в дальнейшем выставляется флаг IDLE при установленном IDLEIE, но прерывание все равно не срабатывает. Почему?

(кстати, замечено на 5 ревизии)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-сен-11 11:50 
Не в сети

Зарегистрирован: 2015-фев-25 09:17
Сообщения: 12
Техподдержка отписалась - вероятно проблема в 5 ревизии. Пока возможности потестить на другой нет, как будет отпишусь.
Было предложено попробовать способ работы с 1553 из ветки форума viewtopic.php?f=34&t=510&start=15 "1986VE1T_demoprogramms_part2".
Сходу несколько вопросов по данной реализации (раз уж техподдержка ссылается - есть вероятность, что реализация референсная):
1. Отличие от примера на отладочную плату (и как делал я) - отсуствие маскирования отдельных флагов прерываний, в зависимости от машины состояний. Теперь так и рекомендуется?
2. При обработки прервания ERR сбрасывается RERR, но отсутствует return, поэтому RERR опять устанавливается при выходе из блока. Объясните.
3. Если предположить ситуацию, что выполняется что-то более приоритетное, и после установки ERR до входа в обработчик успевает установиться IDLE, то такой код, судя по всему, не будет работать. Как быть?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-сен-12 08:34 
Не в сети

Зарегистрирован: 2015-фев-25 09:17
Сообщения: 12
Собрали блок на ревизии 1401. Проблема также наблюдается с кодом из шапки темы. Окружение прилично шумит, управление двигателем. Попутно постоянно идут ошибки MANERR и GAPERR.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-сен-14 12:02 
Не в сети

Зарегистрирован: 2015-фев-25 09:17
Сообщения: 12
Так как, судя по всему, разработчикам нет особого дела до проблем потребителей, раз они никак не участвуют в обсуждении, изложу результат своих изысканий на эту тему.
1. Код, предложенный техподдеркой, действительно содержит ошибку при манипуляции с битом RERR. Его установка, само собой, должна быть в блоке else.
2. Но даже это не помогает решить проблему, изложенную в шапке.
3. Я добился повторяемости проблемы. Она происходит, когда просто размыкаешь/замыкаешь разъем мкио при интенсивных обменах.
4. Дело в том, что разработчики везде при обработки прерывания ERR сбрасывают RERR (т.е. он почти все время установлен). Но так делать нельзя. Судя по описанию "0 – сброс ошибок происходит автоматически, после установки бита IDLE". Но бит IDLE может уже стоять на момент сброса RERR, поллингом статуса это не определить со 100% точностью.
5. Решил я вообще не сбрасывать RERR, а попробовать сбрасывать ошибки битом MR ("1 – ошибки могут быть сброшены только битом MR"). Но, как я уже привык, к сбросу флага и битов ошибок это не приводит.
6. Следовательно бит RERR должен быть сброшен АБСОЛЮТНО ВСЕГДА.

Хотелось бы разъяснений разработков по поводу наличия этого бита. И к чему может привести отсутствие его установки.

P.S. На самом деле в эррате про бит RERR есть замечание "0024 Возникновение ошибки GAPERR в режиме ОУ контроллера ГОСТ Р52070-2003". Но в описании все-таки подразумевается установка бита RERR.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-сен-15 13:42 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 44
Откуда: ПКК "Миландр"
Joker2k, я просил Вас проверить работу тестового примера, для того чтобы исключить вероятность того, что проблема связана исключительно с 5-й ревизией.
Судя по теме проблема остается и для 4-й ревизии так же. Для дальнейшего разбора нам необходима схемотехника включения и проект на котором наблюдается сбой.

Эти данные необходимо выслать на почту support@milandr.ru. Так же отмечу, что по этому адресу Вы можете обращаться к нам напрямую, минуя отдел маркетинга и форум.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-сен-15 16:29 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 44
Откуда: ПКК "Миландр"
По коду есть такое предложение, перед установкой INTEN в обработчике осуществлять сброс данного регистра, например

MIL_STD_1553x->INTEN = 0
MIL_STD_1553x->INTEN = MIL_STD_1553_INTEN_RFLAGNIE | MIL_STD_1553_INTEN_VALMESSIE | MIL_STD_1553_INTEN_ERRIE;

Дело в том, что импульсы которые генерятся при возникновении условий из данного регистра до 6-й ревизии имели большую длительность. Затем эти импульсы от разных источников объединяются по схеме ИЛИ и результирующий импульс передается на NVIC, который генерит прерывание. При наложении двух импульсов пришедших с разбежкой, тот импульс, который пришел раньше получается маскирует импульс пришедший позже. Таким образом защелка второго импульса в NVIC не происходит, поскольку на нем все еще импульс от первого. По сути это аналогично прерыванию по уровню.

В таком случае закончив обработку прерывания от первого источника, пересброс регистра INTEN вызовет прерывание от не защелкнутого второго источника.

В 6-й ревизии импульсы от источников стали короткие и друг другу не мешают. Это похоже на прерывания по фронту.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB