Цитата:
Сходу я бы предположил, что при подключении микроконтроллера к сети достаточно быстро заполняется внутренний буфер приемника Ethernet. То есть принимается, скажем, 3 пакета, а считывается всего 1. Поэтому предложил бы использовать как условие для вычитывания данных из буфера приемника Ethernet разницу в указателях R_Head и R_Tail.
1 Ситуация с падением возникает не сразу по подключению, а минут через 10...30 после подключения к локалке и как-то (субъективно) коррелирует с интенсивностью обмена через хаб (т.е. с кол-вом входящих в МК). Т.е. если в сегменте хаба спровоцировать активность, то (субъективно) упадёт быстрее. При этом ping на контроллер работает постоянно. По светодиодам + осциллограф видно, что за одно прерывание от Ethernet поступает не более одного пакета.
2 Допустим, при любом (IMR = 0xFFFF) прерывании от Ethernet я проверяю R_Tail != R_Head. Все доступные на форуме практические (но не упомянутый ICMP пример) реализации делают это почему-то поллингом в main_loop, а в прерывании в лучшем случае сбрасывают IFR. В спецификации не объясняется является ли это неравенство условием приёма пакета целиком или частично, проясните, пожалуйста. Отлично, если целиком. Работать поллингом, без прерываний очень не хочется.
3 Я получил прерывание от Ethernet с IFR = MISSED_F или OVF. Как поступить правильно, считать R_BUF и переустановить R_Head, или установить R_Head = R_Tail без собственно чтения, или переинициализировать Ethernet контроллер, или что-то другое?
4 Я поставил проверку на соответствие считанной (в прерывании по успешному приёму) по R_Head[0] длине пакета максимально возможному в Ethernet-пакете значению 1518 байт. Минут через ...дцать отладчик встал по превышению...
Функция чтения полностью соответствует упомянуому ICMP примеру.
Цитата:
Насколько я помню необходимо самостоятельно декрементироавать поле RCOUNT в регистре STAT. Автоматически оно не уменьшается.
Спецификация версия 2.10.0 от 31.03.2015
Цитата:
Таблица 472 – Описание бит регистра STAT, стр.398:
"Инкрементируется автоматически при получении нового пакета. Декрементируется только при чтении поля R_COUNT регистра STAT".
стр 391:
Таблица 455 – Регистры контроллера интерфейса Ethernet, столбец 3:
R, 0x0303 (т.е. не RW !)
P.S. Упомянутый ICMP пример я переписал из заклинаний opora.h в заклинания MDR_xxx, при необходимости могу выложить. Увы, но он точно также падает в локалке через упомянутые 10...30 минут

.
P.P.S. Прошу прощения за сумбур в изложении.