Пример MySensors Ethernet шлюза на STM32 (Для поддержки STM32 в среде Arduino требуется установка фреймворка - https://github.com/rogerclarkmelbourne/Arduino_STM32).
Стандартно библиотека Ethernet_STM настроена на работу с портом SPI1. Cигнал SS(NSS) настроен на ногу PA4. Настройки жёстко зашиты в файле ..//Arduino_STM32/STM32F1/libraries/Ethernet_STM/src/utility/w5500.cpp. Речь разумеется идёт о сбоке скетча с использованием фреймворка Arduino_STM32. Если w5500 у нас висит один на шине SPI, то всё хорошо. А как быть если у нас несколько устройств или нога PA4 уже занята?! В этом случае нам необходимо внести некоторые исправления в библиотеку w5500, а именно в файл w5500.cpp. Для определения ноги SS служит дефайн - #define STM32_SPI_CS PA4. Записав его в виде #define STM32_SPI_CS PB12, мы назначим на ногу PB12 сигнал SS.
Если же мы хотим сменить порт например на SPI2, то нам надо внести следующие правки в файл w5500.cpp:
После строки W5500Class W5100; добавить следующие строки:
#define MYSPI 2 #ifdef MYSPI SPIClass MY_SPI(MYSPI); #else #define MY_SPI SPI #endif
И заменить 'SPI.' на 'MY_SPI.' во всех вхождениях.
И последнее. Если мы хотим раскачегарить камень на полную катушку и завести его на 128Мгц, то обязательно надо снизить частоту используемого порта SPI.
Применительно к нашему случаю, строку:
MY_SPI.setClockDivider(SPI_CLOCK_DIV4);
записать следующим образом:
MY_SPI.setClockDivider(SPI_CLOCK_DIV8);
Без этой замены мы можем наблюдать разнообразные неподдающиеся логике глюки и задумчиво чесать макушку. Файл w5500.cpp с внесёнными правками прикладываю.