Примеры реализации WAKE для AVR (EWAVR) и PC (C++ Builder). Старая и новая версии.
В прежних реализациях Wake были две ошибки:
1. При передаче ответа микроконтроллером CRC вычислялась для адреса с установленным старшим битом, а не для истинного адреса, как требует спецификация. Ошибка не проявляется, если используется только нулевой адрес, который в пакете не передается.
2. При передаче ответа микроконтроллером всегда передавался установленный адрес устройства, даже если обратились по нулевому адресу (адрес коллективного вызова). А надо отвечать с тем же адресом, по которому обратились. Ошибка не проявляется, если используется только нулевой адрес.
3. Ну и при работе в сетях рапорт с ошибкой нужно передавать лишь тогда, когда подчиненным устройством распознан адрес. Или вообще не передавать.