Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-10 17:42 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Есть знатоки CMSIS Driver?
Написал CMSIS Ethernet Driver, работает ping (ответ ICMP) со статическим IP, но через некоторое время отваливается полностью соединение (похоже на уровне физики), а также не работает ни одна служба MDK Middleware 6.5.0, в том числе DHCP :(
Кто чем может помочь?
С beta MDK Middleware Dual TCP/IPv4/IPv6 Stack вообще один crash - ничего не работает :?


Вложения:
ReleaseEthKeil5_16a.zip [2.68 МБ]
Скачиваний: 158
CMSIS_ping_Keil_5.zip [926.47 КБ]
Скачиваний: 152

_________________
Hack the Planet!
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-12 11:35 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
Не нашёл в составе проекта ETHERNET_IRQHandler (net_initialize () и net_main () ), или плохо искал?
Если не секрет, дайте посмотреть. Возможно, что дело в нём.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-12 19:07 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
ЧумА, операционная система на компьютере случаем не XP?
В Keil 5-й версии есть баг, если устанавливать среду проектирования в Windows 7, то CMSIS-Core & MDK-Middleware 6.5.0 (стек TCP/IP, собственно содержит функции net_initialize () и net_main () в бинарнике C:\Keil_v5\ARM\Pack\Keil\MDK-Middleware\6.5.0\Network\Lib\ARM\Net_CM0_L.lib, дефайны в файле <rl_net.h>) устанавливаются автоматически вместе с установкой, например MDK Keil Professional ver. 5.16.
Если же ОС Windows XP, то необходимо скачать паки ARM.CMSIS.4.3.0.pack (закладка CMSIS (Cortex Microcontroller Software Interface Standard) и Keil.MDK-Middleware.6.5.0.pack (закладка Keil MDK-ARM Professional Middleware for ARM Cortex-M based devices) отсюда https://www.keil.com/dd2/pack/ и установить их вручную, запустив эти файлы.
Также необходимо установить ReleaseEthKeil5_16a.pack из архива ReleaseEthKeil5_16a.zip во вложении - обработчик прерывания ETHERNET_IRQHandler находится в строке номер 661 в файле C:\Keil_v5\ARM\Pack\Keil\MDR1986BExx\1.4\CMSIS_Driver\MDR1986VE1T\MDR1986VE1T_ETH_MAC.c и выглядит так:
Открыть
void ETHERNET_IRQHandler (void)
{
uint16_t ifr, event = 0;

ifr = MDR_ETHERNET1->ETH_IFR;
MDR_ETHERNET1->ETH_IFR = ifr;

if (ifr & ETH_IFR_RF_OK)
event |= ARM_ETH_MAC_EVENT_RX_FRAME;

if (ifr & ETH_IFR_XF_OK)
event |= ARM_ETH_MAC_EVENT_TX_FRAME;

/* Callback event notification */
if (event && emac.cb_event)
emac.cb_event (event);
}
Закрыть

Открыть
Вложение:
Ping.jpg
Ping.jpg [ 237.21 КБ | Просмотров: 6557 ]
Закрыть

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-12 21:28 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
Сложно всё у Вас как-то :). Паки какие-то, шняга сплошная :))).
Короче, гляньте тему: http://forum.milandr.ru/viewtopic.php?f=34&t=2678&p=15299#p15034 и ниже http://forum.milandr.ru/viewtopic.php?f=34&t=2678&p=15299#p15236
Методом подбора и через N+1 итерацию получен код рабочего обработчика прерывания ethernet. Любой шаг в сторону, типа как у Вас:
Код:
if (ifr & ETH_IFR_RF_OK)
event |= ARM_ETH_MAC_EVENT_RX_FRAME;

if (ifr & ETH_IFR_XF_OK)
event |= ARM_ETH_MAC_EVENT_TX_FRAME;

приводит к состояниям "совсем не работает", "поработает и затыкается", "работает пол-дня и затыкается", "...". Техподдержка на форуме при этом молчит, как рыба об лёд... Делают вид, что не знают как их ethernet контроллер работает :))).
Если заработает (или наоборот) обработчик "как у меня", отпишитесь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-12 22:26 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Чума, видел я всё это :D , вопрос как написать правильный код для логики драйвера CMSIS. И в прерывании вроде кроме эвентов больше ничего не надо, в принципе можно и без прерываний на поллинге, только всё равно не работает.

P.S.
ЧумА писал(а):
Сложно всё у Вас как-то :). Паки какие-то, шняга сплошная :))).
Ну рыбку-то охота съесть (IPv6, ну и вообще более свежая библиотека TCP/IP), здесь вроде съели viewtopic.php?f=34&t=2664 (кстати логика там та же: вместо tapdev_read() как в uIP используется put_in_queue (frame)) ... а техподдержка работает нормально, но это не ST с полной поддержкой чипов в CMSIS Driver или программных стеков для конкретного железа. А изобретание велосипедов типа поддержки SD Card, TCP/IP, USB
Цитата:
Методом подбора и через N+1 итерацию получен код рабочего обработчика прерывания ethernet
чёт надоело, вот оставили бы в компьютерах и всяких приборах типа таких http://www.gwinstek.com/en-global/produ ... PSW-Series RS-232 - вопросов ноль :( . В-общем сидим тогда на Keil4 ... :wink:

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 08:21 
Не в сети

Зарегистрирован: 2015-фев-06 11:48
Сообщения: 53
У меня Ethernet вроде как заработал, правда не в кейле и даже с использованием FIFO. Для чтения: считывать из приёмника слов ровно (Rx_Bytes+3)/4 и вычитаем 1 из количества принятых пакетов в регистре статуса; для записи: size + (Tx_bytes+3)/4 + "нулевое слово (статус передачи)". При приёме по прерыванию MDR_ETH_RF_OK считываю пакеты пока в регистре статуса есть непрочитанные пакеты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 09:50 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
Цитата:
R Max:
И в прерывании вроде кроме эвентов больше ничего не надо, в принципе можно и без прерываний на поллинге, только всё равно не работает.

У меня сложилось субъективное мнение, что буфер приёмника надо вычитывать всегда и весь, предварительно разрешив приём всего и всегда. Иначе, через непредсказуемое время имеем ситуацию - пакеты идут, но прерывание не вызывается.

Что касается Кейла, то Кейлы приходят и уходят, а проекты некоторые живут лет по 15, соответственно иногда поддержкой приходиться заниматься. По этой причине подсаживаться на стек Кейла не хочется, введут очередную инновацию и разбирайся.
Мне, кажется, удалось uIP подпилить, даже без warning-ов собирается :). Для моих целей uIP даже избыточен. Итог, неделями демо-плата на ВЕ1 стоит воткнутой в хаб на ветке с тремя компами, пингуется постояно и не виснет.

Не в тему: компилятор 5.06 (кажется) из состава 5.16 внезапно объявил, что __ldrex(), __strex() устарели и давайте встроенным, типа, ассемблером заменять.

Цитата:
Yurock:
...и даже с использованием FIFO. Для чтения: считывать из приёмника слов ровно (Rx_Bytes+3)/4 и вычитаем 1 из количества принятых пакетов в регистре статуса

Боюсь я FIFO, интуитивно кажется, что не все баги там пока нашли.
Приведите код, пожалуйста, с вычитанием регистра статуса. Интересует два вопроса:
1 Вроде, согласно техописанию он должен сам при чтении статуса декременироваться. Разработчики, правда не уточняют :(.
2 А что будет, если в момент вычитания он аппаратно прибавиться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 12:29 
Не в сети

Зарегистрирован: 2015-фев-06 11:48
Сообщения: 53
Уже писали, что в регистре статуса нужно вручную декрементировать.
В общем, обработчик прерываний, приём и отправка построены так:
Код:
void EthernetHendler(){
   uint32_t intr_flags = MDR_ETH->IFR;
   /* Обработка приёма пакета */
   if (intr_flags & MDR_ETH_RF_OK) {
      while (MDR_ETH->STAT & 0xE0){
         receive_packet(u);
         MDR_ETH->IFR |= MDR_ETH_RF_OK;
      }
   }
   uint32_t intr_flags = MDR_ETH->IFR;
   if (intr_flags & MDR_ETH_MISSED_F) {
      MDR_ETH->IFR |= MDR_ETH_MISSED_F;
      if (MDR_ETH->STAT & 0xE0)
         MDR_ETH->STAT -= 0x20;
   }
   ...
}


static void receive_packet(eth_t *u) {
   unsigned *dst = (unsigned *)u->rxbuf_physaddr;  // физический адрес буфер для приёма
   uint32_t Rx_Stat, sizeBytes, sizeWords, i;
   Rx_Stat = MDR_ETH_RX_FIFO; /* Прочитать состояние приёмника в ОЗУ*/
   sizeBytes = Rx_Stat & 0xFFFF;
   sizeWords = (sizeBytes + 3) / 4;
   for (i = 0; i < sizeWords; i++) {
      *dst++ = MDR_ETH_RX_FIFO;   // вычитать фифо
   }
   ARM_ETH->STAT -= 0x20;    // декрементировать количество пакетов
   ...
   /* дальнейшая обработка */
}

static void transmit_packet(eth_t *u, unsigned char *data, unsigned size) {
   unsigned i;
   unsigned char *buf = (unsigned char*) u->txbuf;  /* Указатель на буфер для передачи в ОЗУ */
   unsigned *src;
   
   memcpy(buf,  data, size); /* Скопировать данные с буфер */
   /* Если меньше 60 байт, дополнить нулями */
   if (size < 60) {
      memset(u->txbuf + size, 0, 60 - size);
      size = 60;
   }
   MDR_ETH_TX_FIFO = size;
   src = (unsigned*) u->txbuf_physaddr;  /* Физический адрес буфера для передачи в ОЗУ
   unsigned wordSize = (size + 3) / 4;
   for (i = 0; i < wordSize; i++)
      MDR_ETH_TX_FIFO = *src++;
   MDR_ETH_TX_FIFO = 0x0;
}

Заметил, когда установлен 7 бит в регистре статуса (принято, но не считано больше 7 пакетов), то приёмник перестаёт работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 12:58 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
Спасибо за код, очень познавательно.

Цитата:
Уже писали, что в регистре статуса нужно вручную декрементировать

Писать-то писали, однако:
1 Спецификация, русским по белому...
2 Код:
Код:
   do
      {
      ............................... // читаем буфер приёмника
      }
   while( MDR_ETHERNET1->ETH_STAT & ETH_STAT_R_COUNT_Msk );   // пока есть непрочитанные пакеты
}

должен "встать колом" при отсутствии декремента "по писанному", в реальности вполне себе работает "по спецификации".

Цитата:
Заметил, когда установлен 7 бит в регистре статуса (принято, но не считано больше 7 пакетов), то приёмник перестаёт работать.

Способов оживления приёмника не знаете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 14:39 
Не в сети

Зарегистрирован: 2015-фев-06 11:48
Сообщения: 53
Для оживления должно быть достаточно в регистре статуса очистить количество принятых пакетов. Так же заметил что приёмник и передатчик перестают работать когда значения регистров R_Head не равно R_Tail и X_Head не равно X_Tail. Это происходит когда вычитывается или записывается неверное количество слов.
А декремент в регистре статуса реально не происходит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 15:16 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
Кстати, какой версии у Вас МК, у меня 3-ей.
Написал письмо в техподдержку, если ответят, то продублирую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 15:33 
Не в сети

Зарегистрирован: 2015-фев-06 11:48
Сообщения: 53
Похоже 4-я ревизия, дата 1502.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 15:54 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
По errata на сайте "Миландра" крайняя аппаратная версия начиная с "1401", т.е. МК 2015 г.в. ей соответствуют.
Короче, похоже, что у Вас 3-я версия (ну или есть более свежая errata).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-13 16:01 
Не в сети

Зарегистрирован: 2015-фев-06 11:48
Сообщения: 53
Значит 3-я ревизия. Единственное я не проверяю на равенство R_Tail и R_Head, а только по прерыванию RF_OK, возможно по этому бывают потерянные пакеты, да и расточительно по ресурсам постоянно проверять, тем более для стека TCP ничего страшного. Да, кстати, ядро работает на 144 МГц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CMSIS Ethernet Driver (Keil 5)
СообщениеДобавлено: 2015-окт-14 17:43 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 479
:))) Посмотрел я на свой код чтения из ETH и нашёл там по завершении чтения:
Код:
MDR_ETHERNET1->ETH_STAT -= (1 << ETH_STAT_R_COUNT_Pos);   // STAT.R_COUNT -= 1


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 3


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

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