Всем доброго времени суток. Уже несколько дней старательно долблюсь лбом в одну и ту же точку мануала - в часть, посвящённую работе с Ethernet. Есть кристалл STM32F107VCT6, код ревизии - Z, если кому интересно. К кристаллу подключен внешним PHY контроллер TLK105R (особой сути не имеет). Приём/Передача фреймов со случайными данными (не IP, а именно "шума") проходит отлично, они видятся в Wireshark'е. Приём данных от ПК так же работает. В качестве драйвера используется STM32 HAL. Точнее, его участки, отвечающие за инициализацию переферии (да и то далеко не все). Суть в чём. ICMP проходит, ARP носится в обе стороны при необходимости, НО: при попытке отправить UDP пакет со стороны контроллера, в сеть он не вылетает. При этом, контроллер вежливо интересуется, есть ли в сети машина с IP адресом ПК, получает обратно ARP ответ, обрабатывает его, собирает UDP пакет до конца и... НИЧЕГО. Пакет не уходит. Повторная отправка и десяток отправок ничего не меняют. Но теперь если изменить хоть один бит в ARP таблице, либо в буфере отправки непосредственно перед командой начала передачи - пакет чудесным образом вылетит в сеть. Пробовал отключать/включать автодобавление CRC в пакет - не помогает. Отключал вообще работу с CRC заголовками на уровне MAC контроллера - так же безрезультатно. Зато, если изменить данные в таблице ARP и отправить пакет обычным образом (пусть даже на соседний мак-адрес), пакет полетит. После можно вернуть бит обратно (в ARP) и пакеты начнут ходить как положено.
Кто-нибудь сталкивался с подобными замашками? И, да, если сменить тип пакета с IP на нули - пакет уходит. Сменить IP назначения в пакете - уходит (по маку). Сменить мак (любой) - уходит. А правильно собраный пакет требует эдакого шаманства.
Опять же, описание состояния контроллера: Кварц 8МГц. Системная частота 50МГц. Тактирование PHY - через MCO пин 25МГц. Питание в пределах допуска - 3.0V. Ёмкости в обвязке в порядке.
Сообщение отредактировал AlanDrakes - Jan 5 2016, 08:27
|