Какое условие должно быть выполнено, чтобы буфер TX освободился?
Это кольцевой буфер... он никогда не освободится))
https://ru.wikipedia.org/wiki/Кольцевой_буферЕсли значение приращения счётчика буфера превышает максимальное значение 0xFFFF, то есть больше 0x10000, счётчик буфера обнуляется... И так по кругу))
Просто надо отправить W5500 команду передачи пакета (SEND) и немного подождать...)) пока закончится передача пакета...
После передачи пакета установится соответствующий флаг (см. регистр флагов) и статус команды (SEND) Sn_CR = 0x20 меняется на (SEND) Sn_CR = 0x00. (команда выполнена).
Вообще режим TX в W5500 такой:
1-Прочитайте начальный адрес буфера TX (регистр указателя Sn_TX_WR ) для записи передаваемых данных.
2-Сохраните передаваемые данные с начального адреса буфера TX (регистр указателя Sn_TX_WR).
3-После сохранения передаваемых данных обновите адрес буфера TX (регистр указателя Sn_TX_WR ) до увеличенного значения.
4-Запись команды передачи SEND.
5-Дождитесь окончания передачи (по окончанию передачи статус Sn_CR = 0x20 меняется на Sn_CR = 0x00). (команда выполнена).
(из даташита): Если записать новые данные в буфер TX раньше, чем закончится текущая передача, то это может привести к ошибке передачи.
Очищение всего буфера происходит через определенное время, видимо, по какому-то внутреннему таймеру чипа (~200 мс).
это RTR (Retry Time-value Register) - период повторной передачи W5500.
W5500 ожидает подтверждение (ACK) на отправленный пакет.
Если запрашиваемый узел не отвечает в течении RTR (200 мс), то W5500 ретранслирует пакет повторно.
ещё есть RCR - количество повторных ретрансляций.
если нет подтверждения (ACK) в течении RTR (200 мс) х (RCR + 1), то происходит таймаут.
таймаут для
ARP = 2000 X 0.1ms X 9 = 1800ms =
1.8s (по умолчанию)
таймаут для
TCP = (0x07D0+0x0FA0+0x1F40+0x3E80+0x7D00+0xFA00+0xFA00+0xFA00+0xFA00) X 0.1ms
= (2000 + 4000 + 8000 + 16000 + 32000 + ((8 - 4) X 64000)) X 0.1ms
= 318000 X 0.1ms =
31.8s (по умолчанию)
и т.д. ))