В этой статье я предоставляю 100% рабочие схему и исходные коды для STM32F4x7 для работы в связке STM32 + KSZ8863RLLI + HAL + LwIP.

Микросхема KSZ8863 от Microchip - двухпортовый PHY контроллер Ethernet'а. Умеет работать как standalone сетевой коммутатор 10/100 Мб. Современный, быстрый, надежный чип. Меня особенно привлекло то, что в нем есть функция MDI-X, это когда контроллер автоматически распознает, какой патч-корд к нему подключили, прямой или кроссовер. Он автоматически переворачивает пары TX/RX под любой кабель. Это особенно удобно, когда вы подключаете несколько устройств между собой обычными прямыми патч-кордами.

Скачать готовый код можно по ссылке https://cloud.as.life/s/mtCccJ5HXP4iLCL

Я к этому уроку написал простую библиотеку, которая позволит работать как с одним, так и с несколькими датчиками температуры на шине 1-Wire. И поскольку ссылку на код я привел выше, вы можете скачать, открыть, смотреть. А лучше всего подключите эту библиотеку к своему проекту, разведка боем будет. Я же детально опишу что там к чему.

Обмен данными ведется по интерфейсу 1-Wire, а это полностью синхронный интерфейс. Сейчас объясню, что это значит. Все датчики температуры DS18B20 – это ведомые устройства, а наш микроконтроллер — ведущее устройство. Чтобы записать или прочитать бит, ведущее устройство подает импульс каждый раз, на каждый бит. Допустим, например, читаем мы 8 бит из датчика, микроконтроллер даёт импульсы на чтение 4 битов, отвлекаемся на время, потом дочитываем оставшиеся 4 бита. Без внешнего тактирования не происходит ничего, датчики молчат до тех пор пока их никто не спросит. Таким образом, ведущее устройство — дирижер в этом оркестре. 
Далее я буду называть ведущее устройство (микроконтроллер) мастером, а ведомое устройство (датчик(-и)) слэйвом.

Датчики температуры DS18B20 снискали славу среди разработчиков электроники благодаря их точности (погрешность до полуградуса) и невысокой цене (0.2$ на алике). Кроме того, несколько датчиков можно запараллелить в одну шину и измерять последовательно разные температуры, используя только один порт 1-Wire, ведь у каждого датчика есть уникальный ID записанный изготовителем.

Данный алгоритм позволит вычислить день недели по дате, с учетом високосного года. Это может быть полезно для установки часов, чтобы пользователь явно не указывал день недели.

Алгоритм написан на языке программирования Си.