STM32 Discovery SD+WEB+ENC28J60


Собственно порт TCP/IP стэка и примера от Lifelover на STM32 в CooCox 1.51.

Публикую т.к. сам имел определенные трудности при раскуривании подобного материала на STM32, специально поискал гуглом подобного не нашел.
Если не путаю то порт вот из этой статьи
Железо:
1. STM32 Discovery VL
2. Плата с ENC28J60
3. Плата с SD слотом

ENC28J60 на SPI1, SD карта на SPI2- все конфигурации прописаны в заголовочных файлах mmc.h и enc28j60.h.
Все в принципе работает, если на карту залит сайтик из вышеуказанной статьи то все будет хорошо- файл по умолчанию index.htm
В примененном SD слоте не идет наружу контакт наличия карты и он не задествован в программе- карта инициализируется при запуске.
Светодиоды на плате:
1.PC9- зеленый если карта проинициализировалась и готова к работе то загорается если нет то ищите другю карту
2.PC8 — синий общение с картой


Из имеющихся косяков
1. Не все SD/MMC карты работают — если кто в теме то велкам помогайте я долго бился кое что правил в коде от Lifelover и на другой отладочной плате с STM32F103VCT6 работало больше карт, здесь не знаю в чем косяк работают не все что раньше, но все современные карты >=8ГБ которые были найдены дома — штуки 3-4 заработали, все что меньше непредсказуемо.
2. В функции strlwr происходит висяк в чем дело не знаю- была закомментирована, так что пишите расширения файлов, как в проекте заведены.
3.Т.к. на дискавери сорость камня 24MHz то скорости SPI получаются половинные 24/2 и поэтому скорость обмена данными ~95КБ против 170КБ на Авр

Пожелания и улучшения принимаются особенно по SD!

  • +9
  • 02 мая 2013, 18:07
  • GYUR22
  • 1
Файлы в топике: web_sd_discovery.zip

Комментарии (39)

RSS свернуть / развернуть
почему не взять чип с соответсвующие задаче переферией?
например с интернеттом, и сд контроллером?
+1
А зачем?
PHY -стоит таких же денег, +MAC и SDIO- только на жирных чипах+надо их ждать или доставать, а дисковери есть в закромах у многих :) так что к embedded web server проще приобщиться.
А если кому над скорость и мощь то это да брать жирнее.
+2
А разве при наличии Ethernet на борту PHY микросхема не нужна? Сужу по олимексовской плате STM32-E407 (кстати плата-то OSHW, что не может не радовать), там STM32F407 и KS8721BL в качестве PHY. Или я неправильно понимаю? Дело в том, что я не ковырял Ethernet. Да и платки этой у меня ещё нет. :)
0
+1
Ай молодца — портировал на STM32 и поднял себя и Lifelover-а :)
Теперь и такой пикейный жилет, как я, это заюзает, да еще на CooCox — как специально «для дебилов».

P.S. А что насчет WIZNET W5100?
+2
Таки плюса от тя не увидел (или ошибаюсь?) т.е. это был сарказм? Но как в известной передаче нам как то по… ну вы поняли :)
W5100 особо пока не понял какой жирный плюс я с ним получу и пока не интересовался +оно дороже енцешки и его нет в закромах т.е. надо заказывать и ждать.
0
У меня нет силы плюсовать :)
+1
ну и ладна :) — не для плюсов же я писал?
0
За что это тебя так? :)
0
А у меня ее(силы) и не было никогда, сколько плюсов надо иметь чтобы голосовать? Я уже привык, а в личный блог я могу спокойно писать и с минусом. Возможно мир был спасен еще от одного злобно-тихушного минусователя :D
+2
Скорость у вас низкая скорее всего из-за побайтового чтения с помощью стандартной библиотеки. Соберите релиз версию, должна чуток побыстрее работать (за счет исключения проверок параметров). Не говоря о использовании буфера спи и дма при передаче больших посылок.
При переделке можно функции <имя> и <имя>_P снести на одну, с константным параметром. Этот аппендикс от авр в стм совершенно излишний.
Функции strlwr код бы глянуть.
0
У Кокоса вроде как нет опции релизной версии- там что то типа бин — релиз, hex — дебаг т.е. все сразу (поправьте если ошибаюсь). А дма и иже сними это хорошо, но пока с спи не работал — времени не было и я подозреваю, что это сильно изменит код — получиться, что-то типа асинхронного общения, короче говоря наверное в будущем. Остатки от авр это видимо случайно осталось, как нито уберу.
0
с SPI по DMA
0
Работать с SPI по DMA просто: прерывание на заполнение приемного буфера, записали пачку кода в передающий, сказали отослать и забыли об этом пока прерывание не сработало. Дальше разбираем то что в буфере и опять по новой.
0
да только это надо синхронизировать :)
Я думал над этим но видимо чуть позже
0
У Кокоса вроде как нет опции релизной версии- там что то типа бин — релиз, hex — дебаг т.е. все сразу (поправьте если ошибаюсь)

Скорее всего, Вы ошибаетесь. По крайней мере, в моей версии CooCox 1.4.0 бин и хекс – это одна и та-же прошивка в разных форматах.

Обратите внимание с какими опциями оптимизации вызывается компилятор (в данном случае, нас интересует опция -О). В моей версии CooCox оптимизация отключена по умолчанию (-О0).
0
Да в новом проекте оптимизация -O0 на этом работает раза в два медленнее чем на -O2
0
Еще бы провода к карте памяти по-короче сделать бы, глядишь и карты бы некоторые заработали=)
+1
все могет быть, но не факт -проверю
0
Если SD & ETH на одном SPI — не планируется примеров ?
Не очень понял о чем этот пост — чужой труд под своим блогом?
0
Э мил человек я написал, что это порт и я на авторство изначально не претендую, но моего труда тут есть некоторое количество, а время тоже ресурс и похоже не один я так думаю, нравится бери не нравится проходи мимо.
На одном SPI пока не пробовал, но мысли были тока не SD, а флеш память какую нито.
0
время тоже ресурс и похоже не один я так думаю, нравится бери не нравится проходи мимо.
Разрешите стырить вашу цицату?
0
тока с указанием авторских прав ;)
0
а в чем проблема с одной шиной SPI? Линии CS разные, а дальше делай что хочешь, только во временные рамки укладывайся если есть завязка на тайминги…
0
помнится бывают косяки с z- состоянием у вас как раз было с wiznet
0
Бывают, но это уже визнетовские косяки. ENC'а ими не страдает (впрочем, у нее своих косяков выше крыши).
0
Думаю, что автора вопроса волновала не «железная» сторона вопроса…
0

uint8_t tcp_listen(uint8_t id, eth_frame_t *frame);
void tcp_read(uint8_t id, eth_frame_t *frame, uint8_t re);
void tcp_write(uint8_t id, eth_frame_t *frame, uint16_t len);
void tcp_closed(uint8_t id, uint8_t hard);


А сами функции самому писать?
0
У меня глюк (stm32f4discovery).
Страничка почему то не отдавалась нормально, в процессе удалось узнать, что по какой то причине с файла в функции f_read не читаются первые 3 байта, при этом в переменную, переданную в f_read (последний параметр br) записывается верное значение, тоесть, если размер файла 133 байта, то в нее будет записано именно 133. Если в исходнике странички в начало добавить три пробела, то страница отображается нормально.
Попробовал считать файл при инициализации — читается нормально. Далее попробовал его считать прямо в функции httpd_request сразу после открытия:
if(!f_open(&(st->fs), url, FA_READ))
	{

	printf("\r\r------- read    ");
	UINT	ttt;
	char	bbb[1000];
	f_read(&(st->fs), bbb, st->fs.fsize, &ttt);printf("%d	\r\r", ttt); puts(bbb);
	f_lseek(&(st->fs), 0);
	puts("------- read---  ");



		//f_lseek(&(st->fs), 0);
		st->statuscode = 2;
		st->data = 0;
		st->numbytes = st->fs.fsize;
		st->type = httpd_get_mime_type(url);
		st->file_opened = 1;
	}

Здесь читается и выводится на uart, проблемы те же. Но проблема отпадает, если в этом же куске кода вместо (st->fs) использовать отдельную переменную FIL, тогда читается нормально.
В чем может быть проблема? Я целую ночь убил и решения не нашел.
0
PS: Если эту новую переменную добавить в структуру httpd_state_t, то файл опять толком не читается.
0
Интересно, как раз планировал поиграться с stm32f303 если чего нарою отпишу.
зы а spi у вас на какой частоте? -у карточек есть ограничения
0
У меня карта на SDIO
0
ну тогда вопрос немного не в тему — судя по всему у вас проблемы со sdio все остальное не причем
0
Врядли при причине в SDIO оно бы работало при
Но проблема отпадает, если в этом же куске кода вместо (st->fs) использовать отдельную переменную FIL
Надо все же ковырять код на предмет ошибок.
0
  • avatar
  • Vga
  • 14 сентября 2014, 16:20
FIL это тип указателя на файл, так что там особо нечего ковырять
0
Вот, обсуждаем на форуме forum.easyelectronics.ru/viewtopic.php?f=35&t=19882
0
Как оказалось, в lan.h не все структуры были запакованы, когда запаковал, файлы стали читаться нормально, но большие передаются не полностью. При запросе web странички размером 871 (это без заголовка) байт пришло только 433 байта. Что интересно, было пропущено начало, а не конец.
0
Большое спасибо за выложенный пример. Допиливаю для своих нужд-) Небольшой вопрос — хотел освободить штырьки SPI1 под каналы АЦП — передачу-прием соответственно с SPI2, но тупое копирование из хедера mmc.h конфигурации SPI2 в enc28j60.h и замена в enc28j60.с SPI1 на SPI2 ничего не дало. Вторая почему-то не хочет работать, хотя с картой памяти все было нормально. Не могли ли бы Вы предположить в чем тут дело.
0
могу подозревать много чего — проверяйте все по очереди, сначала запустите карту, потом enc, потом все вместе.
единственное что из области улучшений — если используете 103 камни то spi1 в них быстрее тк сидит на быстрой шине.
0
Вопрос решился парадоксально -) — прямой инициализацией порта В прямо в начале мэйна. Все время у меня создавалось ощущение, что SPI2 просто не работает, потому что неправильно там сделать было просто нечего. То есть при выбрасывании карты ММС и при перетаскивании сетевого обмена на второй SPI (и при соответствующих заменах в enc28J60.h и enc28j60.c) порт чего-то не работал, хотя в конфигах все вроде было-(( короче надо будет еще смотреть отчего так. Но пойти все-таки пошло-)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.