LPC1768. HTTP&FTP с SD/MMC

Запустить WEB сервер с Flash диска у меня пока не получилось, сказывается отсутствие отладчика. Зато легко и просто можно запустить HTTP и FTP сервера и заставить их работать с SD/MMC карточкой. Библиотека KEIL-а Real-Time Library имеет в своем составе драйвера для подключения SD/MMC различными способами ко многим контроллерам. Карты поддерживаются вплоть до 32 гигов, файловые системы поддерживаются FAT12/16 и FAT32.

Берем пустую заготовку:

#include "LPC17xx.h"
#include "RTL.h"

int main (void)
{
   SystemInit ();
   return 0;
}

Добавляем в нее два файла:
C:\Keil\ARM\RL\FlashFS\Config\File_Config.c
C:\Keil\ARM\RL\FlashFS\Drivers\SPI_LPC17xx.c
C:\Keil\ARM\RV31\LIB\FS_CM3.lib
Второй файл определяет каким протоколом и к каким пинам будет подключена карта. Для каждого контроллера в папке C:\Keil\ARM\RL\FlashFS\Drivers\ можно найти свой файл и подключить его к проекту.
После добавления файлов к проекту, для начала работы с картой, нужно в код добавить всего одну строчку:

finit ();

Обычно ее добавляют после инициализации контроллера и перед инициализацией сетевого стека.
Если карта в первый раз используется с контроллером, она не всегда может заработать, даже если ее отформатировать предварительно под windows. Поэтому, инициализацию можно немного расширить функцией форматирования:

uint32_t retv;

while ((retv = finit ()) != 0) 
	{            
		if (retv == 1) 
		{
      		printf ("SD Memory Card Init Failed\n");
      		printf ("Insert SD Memory Card...\n");      
		}
    		else 
		{
      		printf ("SD Memory Card is Unformatted\n");
			if (fformat ("M:SD_CARD") != 0) 
			{
    				printf ("SD Memory Card format failed.\n");
  			}
  			else 
			{
    				printf ("SD Memory Card formatted.\n");
  			}
      
    		}
  	}


После инициализации и/или форматирования, можно прочитать конфиг карты:

MMCFG mmcfg;
char outBuf[26];

mmc_read_config (&mmcfg);

sprintf (outBuf, " BlockNr:0x%08X", mmcfg.sernum);
printf (outBuf);
sprintf (outBuf, " BlockNr:0x%08X", mmcfg.blocknr);
printf (outBuf);
sprintf (outBuf, " RdLen:  0x%04X", mmcfg.read_blen);
printf (outBuf);
sprintf(outBuf, " WrLen:  0x%04X", mmcfg.write_blen);
printf (outBuf);

Поля должны быть не нулевыми, а если помножить значения blocknr и read_blen, то должны получить объем карты.
Теперь сетевые сервисы.
Добавляем к проекту:
C:\Keil\ARM\RL\TCPnet\Drivers\EMAC_LPC17xx.c
C:\Keil\ARM\RL\TCPnet\Drivers\EMAC_LPC17xx.h
C:\Keil\ARM\RL\TCPnet\SRC\FTP_uif.c
C:\Keil\ARM\RL\TCPnet\SRC\HTTP_uif.c
C:\Keil\ARM\RL\TCPnet\SRC\Net_Config.h
C:\Keil\ARM\RL\TCPnet\SRC\Net_Config.c
C:\Keil\ARM\RV31\LIB\TCP_CM3.lib
В файле Net_Config.c, устанавливаем ip и маску, убираем DHCP, устанавливаем галки напротив HTTP server и FTP Server. Я еще по добавлял количество TCP и UDP сокетов. А в код добавляем инит. Если собрать все вместе, получается:

#include "RTL.h"
#include "LPC17xx.h"

BOOL tick;

void timer_poll (void) 
{
	if (SysTick->CTRL & 0x10000) 
	{
		timer_tick ();
    	tick  = __TRUE;
	}
}

int main (void) 
{	
	SystemInit();
	init_TcpNet ();
	finit ();
	while (1) 
	{
		timer_poll ();
		main_TcpNet (); 
	}
}


В результате чего, HTTP сервер загружает HTML странички с SD карты, а закинуть их туда можно по FTP. У меня это выглядит вот так:




Провел первые замеры пропускной способности. Заливал и скачивал FAR-ом файл AVI размером 697 мегабайт. Комп — ASUS EEEPC с SSD. Способ подключения карты к контроллеру — сопли/скрутка, подтяжка — 20 кОм.
Первая карточка:



Загрузка — 530 Кбайт/сек, скачка — 430 Кбайт/сек.

Вторая карточка:



Загрузка — 600 Кбайт/сек, скачка — 430 Кбайт/сек.

Третья карточка:



Загрузка — 370 Кбайт/сек, скачка — не замерял.
  • +3
  • 06 мая 2011, 13:57
  • lexanet
  • 1
Файлы в топике: SK-LPC1768_EMAC.zip

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

RSS свернуть / развернуть
Супер. А скорость как? Возможно построить низкобюджетный NAS?
0
Скорость не замерял, счас прикручу это к RTOS и замерю. Но у меня карта 1 гиг древняя и все это по SPI работает (400kBit), так что… Вот если использовать камень с MCI, да карточку посвежей.
0
Как NAS точно не попрет, силенок у этого арма не хватит. Для нас берити специализированные решения, а не бюджетки-универсалы.
0
Может перебросить в блог по Армам?
0
0
А как это сделать?
0
Зайди в блог, подключись к нему (символ штепселя). После чего в редактирвоании своего поста можно будет выбирать куда сохранить.
0
Готово.
0
Смотрю, часть постов уже туда переехала.
0
Ага я перебросил
0
Спасибо.
0
А не хотел бы ты — добрый человек, замутить урок освоения LPC1768 в среде IAR?
0
  • avatar
  • DVF
  • 06 мая 2011, 18:44
Нет. Я с самого начала, когда взял в руки первый свой АРМ сразу решил выбрать себе одну IDE для всех камней и не метаться. Ставил себе кроме кейла и еклипс и иар, но, понравился кейл, остальное снес и счас даже пустой проект сделать в иаре для меня задача :)
0
Замерил и выложил замеры скоростей закачки/скачки.
0
А как железно подрубается к сети?
0
Чип KS8721L.
0
Уважаемый, а не могли б кинуть готовый проект на pavelboshko@gmail.com,
а то че то не выходит у меня каменный цветок (((((
0
Давно это было, не найду в залежах черновиков. Могу только подсказать что нить или Ваш код посмотреть. На каком именно этапе не выходит?
0
Да в коде все норм, компилируеться, но такое ощущение что не запускается модуль ethernet, в SystemInit вроде галочку поставил на подачу питание и тактовых импульсов, вот и хотел на рабочий проект глянуть, может кинеш другой проект рабочий где используется RTL + ethernet
0
А, пустышку, RTOS+Ping?

#include "RTL.h"
#include "LPC17xx.h"

BOOL tick;

void timer_poll (void) 
{
        if (SysTick->CTRL & 0x10000) 
        {
                timer_tick ();
        tick  = __TRUE;
        }
}

int main (void) 
{       
        SystemInit();
        init_TcpNet ();
        while (1) 
        {
                timer_poll ();
                main_TcpNet (); 
        }
}



Начните с этого. RTOS-a нет, просто для проверки сети. Должен идти пинг.
Сетевые настройки в контроллере и компе совпадают? DHCP на компе и контроллере отключены? Какой чип обеспечивает сетевую физику контроллера?
0
Такой проект я делал но на ping не отвечает, сетевые настройки проверял, все вродеб в порядке, dhcp отключил, смотрел снифером со стороны контроллера ни каких движений, плата у меня точно такая же как в этой статье.
0
А кейловские EMAC_LPC17xx.c и EMAC_LPC17xx.h правили? В кейле они под другой чип. Я счас поищу и попробую приатачить архив с ними к блогу.
0
Нет не правил, наверно тут ошибка у меня (( буду очень признателен
0
Приатачил.
0
Огромное спасибо!
Заработало, еще маленький вопрос а файлик SPI_LPC17xx.c тоже у вас модифицированный?
0
Конечно, в нем же самое важное, функция инициализации чипа.
0
Невнимательный я, SPI не увидел. Я правил чуток SPI_LPC17xx.c, скоростью играл, поменьше делал. В то время резисторов на 47 кОм под рукой не было, ставил какие попало.
0
Еще такой вопрос, при добавление в проект файла http_uif.c при компиляции проекта вылезает
tcp-ip.axf: Error: L6218E: Undefined symbol ffind (referred from http_uif.o)
может сталкивались? а то не нагуглил я такой проблемы
0
Нет, такой проблемы не помню.
0
День добрый. А какая версия кейла здесь? Или точнее — какая версия RL?
0
RL версии 4.12, скорей всего.
0
lexanet, я письмецо отправил, несколько дней назад, не получил еще?
0
Ответьте, плиз…
0
Пробую сделать тоже самое на китайском FireBull проц STM32F103VET6, вымучал драйвер для enc28j60, заработал RL-TCPnet, пингуется работает HTTP сервер со встроенной памяти, затем запустил RL-FlashFS с SD картой, карточка инициализируется форматируется… Короче работают стек и файловая система по отдельности. Попробовал запустить http сервер с SD карты, как только добавляю файл HTTP_uif.c перестает проц запускаться, вернее начинает выполнятся код startup
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit ; прыгает на инит и возвращается тут все нормально
                BLX     R0               
                LDR     R0, =__main     ; а вот тут непонятно куда прыгает, но до мейна никогда не доходит.                BX      R0
                ENDP

как только выключаю в конфиге http сервер и удаляю HTTP_uif.c стек и файловая нормально уживаются на одном проце
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.