LPC1768. HTTP&FTP с SD/MMC


Берем пустую заготовку:
#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
Уважаемый, а не могли б кинуть готовый проект на pavelboshko@gmail.com,
а то че то не выходит у меня каменный цветок (((((
а то че то не выходит у меня каменный цветок (((((
- pavelboshko
- 21 сентября 2011, 13:14
- ↑
- ↓
Давно это было, не найду в залежах черновиков. Могу только подсказать что нить или Ваш код посмотреть. На каком именно этапе не выходит?
Да в коде все норм, компилируеться, но такое ощущение что не запускается модуль ethernet, в SystemInit вроде галочку поставил на подачу питание и тактовых импульсов, вот и хотел на рабочий проект глянуть, может кинеш другой проект рабочий где используется RTL + ethernet
- pavelboshko
- 21 сентября 2011, 13:48
- ↑
- ↓
А, пустышку, RTOS+Ping?
Начните с этого. RTOS-a нет, просто для проверки сети. Должен идти пинг.
Сетевые настройки в контроллере и компе совпадают? DHCP на компе и контроллере отключены? Какой чип обеспечивает сетевую физику контроллера?
#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 на компе и контроллере отключены? Какой чип обеспечивает сетевую физику контроллера?
Такой проект я делал но на ping не отвечает, сетевые настройки проверял, все вродеб в порядке, dhcp отключил, смотрел снифером со стороны контроллера ни каких движений, плата у меня точно такая же как в этой статье.
- pavelboshko
- 21 сентября 2011, 14:08
- ↑
- ↓
Нет не правил, наверно тут ошибка у меня (( буду очень признателен
- pavelboshko
- 21 сентября 2011, 14:28
- ↑
- ↓
Огромное спасибо!
Заработало, еще маленький вопрос а файлик SPI_LPC17xx.c тоже у вас модифицированный?
Заработало, еще маленький вопрос а файлик SPI_LPC17xx.c тоже у вас модифицированный?
- pavelboshko
- 23 сентября 2011, 02:00
- ↑
- ↓
Еще такой вопрос, при добавление в проект файла http_uif.c при компиляции проекта вылезает
tcp-ip.axf: Error: L6218E: Undefined symbol ffind (referred from http_uif.o)
может сталкивались? а то не нагуглил я такой проблемы
tcp-ip.axf: Error: L6218E: Undefined symbol ffind (referred from http_uif.o)
может сталкивались? а то не нагуглил я такой проблемы
- pavelboshko
- 23 сентября 2011, 09:13
- ↑
- ↓
День добрый. А какая версия кейла здесь? Или точнее — какая версия RL?
- zaregistrirowannyj_polzowatel
- 11 сентября 2012, 18:54
- ↓
lexanet, я письмецо отправил, несколько дней назад, не получил еще?
- zaregistrirowannyj_polzowatel
- 14 сентября 2012, 23:56
- ↑
- ↓
Пробую сделать тоже самое на китайском FireBull проц STM32F103VET6, вымучал драйвер для enc28j60, заработал RL-TCPnet, пингуется работает HTTP сервер со встроенной памяти, затем запустил RL-FlashFS с SD картой, карточка инициализируется форматируется… Короче работают стек и файловая система по отдельности. Попробовал запустить http сервер с SD карты, как только добавляю файл HTTP_uif.c перестает проц запускаться, вернее начинает выполнятся код startup
как только выключаю в конфиге http сервер и удаляю HTTP_uif.c стек и файловая нормально уживаются на одном проце
; 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 стек и файловая нормально уживаются на одном проце
Комментарии (34)
RSS свернуть / развернуть