Захотілось мені якось, подружити плату STM32F4_Discovery із модулем ENC28J60.Сама F4 Discovery була використана здебільше для того,що до неї є тисячу і один приклад.
Насправді моя задача була в тому ,що потрібно було "поюзати" SPI в STM32, та заодне згадати, що до чого (оскільки останній час "висів" на AVR-ах,a тут намітився проектик на STM).
Хоча в мережі і багато прикладів для F4 Discovery + ENC28j60,та мені прийшлось збирати проект самому. В якості компілятора я використовував Keil 5 .За основу взятий цикл статей Lifelover'a ,та ось цей матеріал - http://we.easyelectronics.ru/electro-and-pc/stm32-uip-enc28j60.html.
Взагалі наведені тут приклади,взяті із сторінки розробника uIP Adama Dunkelsa на github.com .
Частина 1.Пінгуємо.В проекті використовується FreeRTOS - операційна система реального часу. Я взяв готову заготовку проекта FreeRTOS із сайта https://github.com/. Далі "прикрутив" до проекта uIP.
Примінюємо SPI2. З нього і розпочнем.
// Ініціалізація :
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
// включение SPI-тактирования
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
/* configure pins used by SPI1
* PB13 = SCK
* PB14 = MISO
* PB15 = MOSI
*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// connect SPI1 pins to SPI alternate function
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13 , GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15 , GPIO_AF_SPI2);
// SS
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStruct);
SPI_Cmd(SPI2, ENABLE);
Пін RESET на Discovery не використовується, хоча в матеріалі з we.easyelectronics.ru. використовується. Із модуля ENC28J60 цей пін підключений через резистор 2,4 кОм на плюс живлення (+3,3 В) самого модуля.Справа в тому ,що я мав нагоду "юзати" модуль enc28j60 із Atmega32 ( kibermaster.net),і підключав саме так.
Доречі сам модуль в мене заживлений від свого блока живлення,оскільки enc28j60 доволі багато споживає(~250 mA). До того ж люди в мережі рекомендують робити саме так,а не заживлювати модуль від Discovery,на якому встановлений заслабкий стабілізатор.
IP- адреса модуля ENC28J69 в мене - 192.168.1.170.
Cам проект "Hello World" для Keil 5 - http://radiomanoff.at.ua/load/f4_enc28j60/1-1-0-30
Програмуємо плату та запускаєм.Вводимо команду ping 192.168.1.170 і в результаті отримуємо:
Далі вводимо команду telnet 192.168.1.170 1000
Тиснемо ENTER, та вводимо своє ім'я (наприклад user).Ну і отримуємо - Hello user.
// **********************************************************************************************************************************************
Частина 2.Webserver.
Використовуемо папку webserver ( https://github.com/adamdunkels/uip/tree/master/apps ).В файлі uip-conf.h розкоментуємо #include "webserver.h".Збираємо проект , прошиваєм Discovery.
В браузері набираємо наш IP ,і ось спостерігаємо, таку картину :
Нажимаємо на File statistics:
і т.д...
Адреса компютера, через команду arp -a :