Стек для W5200 без циклов задержек + STM32F103

Чипы корейской фирмы WIZnet весьма широко известны и популярны. Так же полно где можно скачать драйверы для этих микросхем. Последняя реализация выполнена на W5500 здесь
Однако все драйверы построены по принципу вызова функций, которые весьма надолго стопорят основной цикл программы, мучительно и многократно ожидая события от внешней системы. Особенно «умиляет» ожидание в функции отправки по TCP и выход из нее по Timeout. А ведь это может растянуться не на одну секунду, и даже не 10! (При стандартных настройках — 28 сек). В некоторых случаях, если программа заточена полностью на Ethernet — это не критично, но не в моем случае. Да и вообще, инструкции вида while(!Внешнее событие); меня вымораживает напрочь, так как устройство полностью оказывается неработоспособным длительное время.
Мною были написаны несколько модулей, в которых я реализовал стек для W5200 без задержек.
Не спрашивайте, почему именно для W5200, и почему бы не использовать lwip + Stm32fxx7 и подобные. Ответ простой: Такова данность.

Итак, для работы стека нужно вызывать из основного цикла всего одну функциюW5200();
Со стороны железа имеются другие функции, которые требуется описать:void Init_W5200Driver(void);
Eth_Reset(uint8_t Level);
uint8_t Eth_GetInterrupt(void); //Ножка прерывания nINT
Eth_RW_SPI(uint8_t * Buffer, uint16_t Length);
WIZ_RW_Status_Typedef Eth_Busy(void);
где Eth_Init5200Driver — инициализация железа,
Eth_Reset — устанавливается уровень ножки nReset
Eth_GetInterrupt — читаем состояние ножки nINT
Eth_RW_SPI — это вызов функции передачи буфера данных
Eth_Busy — читаем состояние занятости SPI

Все эти функции у меня реализованы в модуле w5200driver.c

Чтобы начать работать, необходимо сделать следующее:
1. Инициализировать Системный таймер (Использовал вот этот)
2. Инициализировать стек вызовом функции:Init_W5200();
3. Инициализировать сокеты вызовом функции: uint8_t Socket_Init(SOCKET s, Socket_Callback_Typedef Callback);
где в качестве параметров указывается номер сокета, а так же функция, которая будет вызываться для обработки событий сокета.
4. В супер-цикле разместить функцию W5200();
После этих незамысловатых операций стек в порядке очереди начнет вызывать Callback функции инициализированных сокетов. Вызывает он их только тогда, когда:
1. В данный момент не выполняется никакого обмена по SPI
и
2. В данный момент произошло событие (прерывание) по сокету и требуется обработка.
Задача состоит лишь в том, чтобы написать конечный автомат для вызываемых функций. На примере такой автомат имеется для DHCP и HTTP

Важное замечание: Стек имеет одно ограничение: Все общение с W5200 нужно производить ТОЛЬКО из вызываемых функций Callback. Только так гарантируется, что в данный момент чип не занят.

И еще: Прежде чем запускать бездумно на своей железке — стоит убедиться в том, каким образом настроены ножки. Обратите внимание на файл periph.c. Думаю, его следует удалить и сделать инициализацию периферии заново «под себя»

Файл W5200driver.c имеет описание, каким образом софт контактирует с железкой. Его тоже скорее всего понадобится править.

Расписывать подробно работу всех функций — очень долго, думаю, народ здесь грамотный и быстро разберется что к чему.
Основной посыл — нет задержек.
Источник

Оставить комментарий

Вы можете использовать следующие теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>