26.04.2017, 17:34
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Всем привет!
Вот программка, по которой СТМ принимает один фрейм через езернет и выдает принятый фрейм в usart
Установка такая ПК-lan8720-stm32f4discovery-cp2102-ПК
Нажмите, чтобы открыть спойлер
/************************************************** *****************/
#include "stm32f4xx.h"
// pa1-refclk, pa2-mdio,pa7-crs;
// pb11-txen, pb12-tx0, pb13-tx1,pb14-rxer;
// pc1-mdc,pc4-rx0, pc5-rx1,
// pe12-rst
// pd8-hl3_r
//pc6-US6_TX, pc7-US6_RX
/************************************************** *****************/
void BLUE(void)
{
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIODEN;
GPIOD-›MODER|=GPIO_MODER_MODER15_0;
GPIOD-›ODR|=GPIO_ODR_ODR_15;
}
void RED(void)
{
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIODEN;
GPIOD-›MODER|=GPIO_MODER_MODER14_0;
GPIOD-›ODR|=GPIO_ODR_ODR_14;
}
void ORANGE(void)
{
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIODEN;
GPIOD-›MODER|=GPIO_MODER_MODER13_0;
GPIOD-›ODR|=GPIO_ODR_ODR_13;
}
void GREEN(void)
{
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIODEN;
GPIOD-›MODER|=GPIO_MODER_MODER12_0;
GPIOD-›ODR|=GPIO_ODR_ODR_12;
}
void RX(uint32_t a)
{
USART6-›DR=0xff;
while ((USART6-›SR&USART_SR_TXE)!=USART_SR_TXE);
USART6-›DR=a;
while ((USART6-›SR&USART_SR_TXE)!=USART_SR_TXE);
a=a››8;
USART6-›DR=a;
while ((USART6-›SR&USART_SR_TXE)!=USART_SR_TXE);
a=a››8;
USART6-›DR=a;
while ((USART6-›SR&USART_SR_TXE)!=USART_SR_TXE);
a=a››8;
USART6-›DR=a;
while ((USART6-›SR&USART_SR_TXE)!=USART_SR_TXE);
}
uint8_t temp,temp1;
uint32_t i, j,temp2,temp3,w;
//объявление списка дескрипторов прм
uint32_t RXDL[4];
//объявление буфера прм
uint8_t RX_BUF[1532];
//main program
int main()
{
//настройка pll и системного тактового сигнала sysclk=pll
//set PLL 64MHz
RCC-›PLLCFGR=0x24000000;
RCC-›PLLCFGR|= RCC_PLLCFGR_PLLSRC_HSI;//hsi-pll sourc
RCC-›PLLCFGR|=RCC_PLLCFGR_PLLM_4;//M=16
RCC-›PLLCFGR|=RCC_PLLCFGR_PLLN_7;//N=128
RCC-›PLLCFGR&=~RCC_PLLCFGR_PLLP;//P=2
RCC-›CR|=RCC_CR_PLLON;//enab pll
while (!(RCC-›CR&RCC_CR_PLLRDY));
RCC-›CFGR=RCC_CFGR_PPRE2_2|RCC_CFGR_PPRE1_2;//АРВ1, АРВ2=АНВ/2
RCC-›CFGR|=RCC_CFGR_SW_PLL;//sys clock-pll
FLASH-›ACR=FLASH_ACR_PRFTEN|FLASH_ACR_ICEN|FLASH_ACR_DCE N |FLASH_ACR_LATENCY_4WS;
for (i=0;i‹500;i++);
//настройка usart
//разрешение порта С и usart6
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIOCEN;
RCC-›APB2ENR|=RCC_APB2ENR_USART6EN;
//настройка пинов pc6, pc7 как AF и usart6
GPIOC-›MODER|=GPIO_MODER_MODER7_1|GPIO_MODER_MODER6_1;
GPIOC-›AFR[0]|=0x88000000;
//настройка параметров usart APB2=32МГц (27МГц)
USART6-›BRR=0x000000e8;//115200, OVER8=0
USART6-›CR1=USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
//настройка езернет
//разраешение портов пинов езернет
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOBEN| R CC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN|RCC_AHB1ENR _GPIOEEN;
//разрешение sescfg
RCC-›APB2ENR|=RCC_APB2ENR_SYSCFGEN;
//установка режима RMII
SYSCFG-›PMC=SYSCFG_PMC_MII_RMII_SEL;
//настройка пинов как AF и езернет
GPIOA-›MODER|=GPIO_MODER_MODER7_1|GPIO_MODER_MODER2_1|GP I O_MODER_MODER1_1;
GPIOB-›MODER|=GPIO_MODER_MODER13_1|GPIO_MODER_MODER12_1| G PIO_MODER_MODER11_1;
GPIOC-›MODER|=GPIO_MODER_MODER5_1|GPIO_MODER_MODER4_1|GP I O_MODER_MODER1_1;
GPIOD-›MODER|=GPIO_MODER_MODER8_0;//pin 8-0utput
GPIOE-›MODER|=GPIO_MODER_MODER12_0;//pin 12-0utput
GPIOA-›OSPEEDR|=GPIO_OSPEEDER_OSPEEDR7|GPIO_OSPEEDER_OSP E EDR2|GPIO_OSPEEDER_OSPEEDR1;
GPIOB-›OSPEEDR|=GPIO_OSPEEDER_OSPEEDR14|GPIO_OSPEEDER_OS P EEDR13|GPIO_OSPEEDER_OSPEEDR12|GPIO_OSPEEDER_OSPEE DR11;
GPIOC-›OSPEEDR|=GPIO_OSPEEDER_OSPEEDR5|GPIO_OSPEEDER_OSP E EDR4|GPIO_OSPEEDER_OSPEEDR1;
GPIOA-›AFR[0]|=0xB0000BB0;//mac
GPIOB-›AFR[1]|=0x00BBB000;//mac
GPIOC-›AFR[0]|=0x00BB00B0;//mac
//разраешение тактирования МАС, МАС прд, МАС прм
RCC-›AHB1ENR|=RCC_AHB1ENR_ETHMACRXEN|RCC_AHB1ENR_ETHMA C TXEN|RCC_AHB1ENR_ETHMACEN;
//сброс езернет
RCC-›AHB1RSTR|=RCC_AHB1RSTR_ETHMACRST;
RCC-›AHB1RSTR&=~RCC_AHB1RSTR_ETHMACRST;
//программный сброс
ETH-›DMABMR |= ETH_DMABMR_SR;
while (ETH-›DMABMRÐ_DMABMR_SR);
//сброс phy
GPIOE-›ODR=GPIO_ODR_ODR_12;//rst=1
ETH-›MACMIIDR=0x00008000;//soft restart
ETH-›MACMIIAR=0x00000803;//adr=1, reg=0,write
while (ETH-›MACMIIAR&0x00000001);
ETH-›MACMIIAR=0x00000801;//adr=1, reg=0,read
while (ETH-›MACMIIAR&0x00000001);
while ((ETH-›MACMIIDR&0x00008000)==0x00008000)//reset is done?
{//no
ETH-›MACMIIAR=0x00000801;//adr=1, reg=0,read
while (ETH-›MACMIIAR&0x00000001);
}
//проверка link статуса phy
ETH-›MACMIIAR=0x00000841;//adr=1, reg=1,read
while (ETH-›MACMIIAR&0x00000001);
while ((ETH-›MACMIIDR&0x00000004)!=0x00000004)//link is up?
{//no
ETH-›MACMIIAR=0x00000841;//adr=1, reg=1,read
while (ETH-›MACMIIAR&0x00000001);
}
//установка автосогласования в phy
ETH-›MACMIIDR=0x00001000;//auto-negotiation
ETH-›MACMIIAR=0x00000803;//adr=1, reg=0,write
while (ETH-›MACMIIAR&0x00000001);
//чтение результата автосогласования
for (i=0;i‹50000;i++)
{
ETH-›MACMIIAR=0x00000fc1;//adr=1, reg=31,read
while (ETH-›MACMIIAR&0x00000001);
while (!(ETH-›MACMIIDR&0x00001000))//auto-neg done?
{//no
ETH-›MACMIIAR=0x00000fc1;//adr=1, reg=31,read
while (ETH-›MACMIIAR&0x00000001);
}
}
//настройка регистра MACCR
ETH-›MACCR=0x02008000|ETH_MACCR_APCS;//
switch(ETH-›MACMIIDR)
{
case 0x00001044:ETH-›MACCR|=0x00008000;//10,h
break;
case 0x00001054:ETH-›MACCR|=0x00008800;//10,f
break;
case 0x00001048:ETH-›MACCR|=0x0000c000;//100,h
break;
case 0x00001058:ETH-›MACCR|=0x0000c800;//100,f
BLUE();
break;
default: ;
break;
}
//настройка регистра MACFFR
ETH-›MACFFR=ETH_MACFFR_RA|ETH_MACFFR_PAM|ETH_MACFFR_PM ;//all frames receive
//настройка регистра DMAOMR
ETH-›DMAOMR=ETH_DMAOMR_RSF|ETH_DMAOMR_TSF;
//настройка регистра DMABMR
ETH-›DMABMR=ETH_DMABMR_FB|ETH_DMABMR_AAB;
//инициализация списка дескрипторов прм и регистра DMARDLAR
ETH-›DMARDLAR=(uint32_t)(&RXDL[0]);
RXDL[0]=0x80000000;//own=1
RXDL[1]=0x000045fc;//rch=1, размер RX_BUF=1532
RXDL[2]=(uint32_t)(&RX_BUF[0]);
RXDL[3]=(uint32_t)(&RXDL[0]);
//разрешение МАС приема и ДМА приема
ETH-›MACCR|=ETH_MACCR_RE;
ETH-›DMAOMR|=ETH_DMAOMR_SR;
//проверка приема фрейма в буфер (дескриптор слово 0, own и ls биты)
while((RXDL[0]&0x80000100)!=0x00000100);
w=RXDL[0];
RX(w);
w=(w››16)&0x3fff;
GREEN();
//передача данных из буфера в USART
for (i=0;i‹w;i++)
{
USART6-›DR=RX_BUF[i];
while ((USART6-›SR&USART_SR_TXE)!=USART_SR_TXE);
}
while(1);
}
Пока не понятно, почему некоторые фреймы, которые должны быть длиной например 54 байта, а в буфере хранится 60 байт!
Последний раз редактировалось Дмитрий1987; 26.04.2017 в 17:38.
|
|
|
|
27.04.2017, 19:32
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Ethernet в STM32F407
Вообще-то, следует полностью прочитать раздел по езернету в мануале, там как бы все и описано. Дескриптор - это указатель на начало буфера, на его физический адрес. Размер одного буфера указывается в дескрипторе. Дескрипторы хранятся в массиве переменных, и объявляются как обычные массивы переменных. Адрес начала массива дескрипторов передается в регистр модуля езернет.
Регистры дескрипторов описаны довольно хорошо в мануале. Надо понимать, что дескрипторы - это не физические регистры модуля, а просто выделенный массив переменных в ОЗУ.
...
Вот например что можно прочесть в буфере приема:
Сообщение от Дмитрий1987
|
Ребят для тех, кто хочет попробовать Ethernet на STM32f407, надо:
|
-- вначале прочесть все, что написано в референс-мануале в разделе езернета. Прочесть фсё от и до. Информации много, модуль сам по себе обширный, и чтобы не спрашивать, как объявить массив дескрипторов и что это такое. Так же, следует прочесть даташит на микросхему физического интерфейса и понять, как она работает. А она начинает работать обычно даже без участия МК, и обычно сразу устанавливает связь и настраивает скорость и режим работы сети, определяет пары TX/RX. Далее, следует понять, как именно происходит коммуникация между МК и phy. MII - четырехбитная линия (как у дисплея-двухстрочника), RMII - однобитная линия. После этого разбираемся, что находится и как прочитать/записать регистры phy-микросхемы. После - ээээ.... читать, читать, читать, потому что реально дохрена читать, прежде чем самостоятельно сможете
Сообщение от Дмитрий1987
|
прошить контроллер и увидеть веб страницу.
|
Последний раз редактировалось NewWriter; 27.04.2017 в 20:44.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
|
|
|
29.04.2017, 07:53
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
как я понял, RMII-двухбитная линия!!!
На передачу: ТXD0, TXD1, на прием: RXD0, RXD1!
Чтобы получить для меня первые практические результаты в езернете:
- запустить проект, скаченный с сайта st.com;
- передать фреймы с одного ПК на другой по следующей линии:
ПК-LAN8720-STM32F4disc-(usart)-STM32F4disc-LAN8720-ПК (2 проги выложу во вторник)
мне хватило прочитать:
- в RM0090 порядка 40 страниц в разделе Езернет (я не читал главы про фильтрацию, time stamp, MMC, прерывания, PMT), разделы про RCC, flash, SYScfg (порядка 10 сираниц);
- даташит на LAN8720 порядка 40 страниц общей инфы+20 страниц регистров (по регистру на страницу)
Я думал, как же много читать, но потом решил заняться практикой и постепенно читать по мере необходимости.
Купил отладки LAN8720, STM32f4disc, соединил их, соединил с ПК, прочитал бегло даташит на lan8720, в RM0090 в разделе езернет прочитал с начала раздела и вплоть до SMI (страниц 10) и пробовал записать и считать данные с LAN8720.
запустил проект, скаченный с сайта ST.com. БЕЗ НЕГО БЫЛО БЫ ОЧЕНЬ ТРУДНО!!!!!!
Потом уже читал в разделе езернет главы про прием (страниц 15), в разделе RCC про PLL, раздел про FLASH, раздел про SYSCFG (порядка 10 страниц) , пробовал принять фреймы с ПК
Потом уже читал в разделе езернет главы про передачу (страниц 15) и пробовал передать фреймы с одного ПК на другой.
Я не задавался целью сразу все читать и понять, а делать это постепенно, и оказалось ничего такого сверхтрудного нет, конечно при наличии работающего проекта, где можно подсмотреть непонятные моменты!
|
|
|
|
29.04.2017, 09:33
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Ethernet в STM32F407
Фигасе порядок изучения! С ног на голову перевернутый - сначала читаем про езернет, а лишь когда что-то не получилось, идем читать про RCC - основу основ, без которой будет полный глушняк.
Езернет - настолько обширный модуль, что требует предварительных знаний по многим узлам МК. Это не таймер TIM1, запустить который можно, лишь прочитав про регистры CR, ARR, PSC.
Можно конечно тупо скопировать пример с сайта, но... понимания так и не будет.
Да, правильно, RMII - двухбитная, а вот SMI - однобитная линия доступа к регистрам phy-интерфейса.
Передать фреймы с одного на другой комп - эт так себе, ничего полезного не несет, как бы... Готовый 5-портовый маршрутизатор будет стоить дешевле. А вот если рассматривать езернет как способ обмена инфой с компом вместо УАРТ.
Кстати,
Сообщение от Дмитрий1987
|
Установка такая ПК-lan8720-stm32f4discovery-cp2102-ПК
|
вот эта cp2102 в цепочке лишняя - в дискаверине есть виртуальный ком-порт, включенный в ST-Link и принимающий от USART1 МК.
Сообщение от Дмитрий1987
|
и оказалось ничего такого сверхтрудного нет,
|
ну-ну, ну да... Уже почти месяц прошел от начала темы, а все на одном месте. Да и остальные форумчане, скажем прямо, нефкурсах по этому вопросу...
|
|
|
|
29.04.2017, 11:37
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Если смотреть, что месяц назад я не знал как запустить прием данных по езернет, а сейчас данные могу передать от одного ПК к другому ПК, то для меня скачок в развитии сделан колоссальный!
я научился готовые проекты подстраивать под другое железо, немного освоил функции SPL, указатели, дескрипторы! работы мною проведено не мало и главное есть результат! Один ПК принимает данные от другого ПК! Месяц назад я об этом даже не мог и думать!
Я думаю, для тех кто не имеет под рукой нужного железа и желания освоить езернет, то эта тема вообще БЕСПОЛЕЗНА!
я считаю, что наука должна быть ради практической пользы, и что-то осваивать просто так, лишь бы почитать, то это пустая трата времени!
Если посмотреть на прогу, которую я выложил последней, то она никак не похожа на те, что на сайте производителя. Может только алгоритмом.
Последний раз редактировалось Дмитрий1987; 29.04.2017 в 11:43.
|
|
|
|
29.04.2017, 21:55
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Ethernet в STM32F407
Дмитрий1987, это конечно радует, и даже есть повод гордиться. Только за то же примерно время можно было освоить основы и двигаться вперёд. Обучение на примерах конечно тоже возможно, но тут очень хорошо подходит из Козьмы Пруткова: "Узкий специалист подобен флюсу: полнота его односторонняя". Лучше догнать до нормального уровня базу, а потом уже и остальное подтянется. Но это возможно уже из области спора о вкусах.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
30.04.2017, 19:55
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Ethernet в STM32F407
Сообщение от Дмитрий1987
|
Один ПК принимает данные от другого ПК!
|
Самое смешное, что для этого микроконтроллер вообще не нужен достаточно запустить интерфейсы в режиме репитера (повторителя), используя конфигурационные входы. А если через МК пропускать поток, то получим, во-первых, задержку распространения, а во-вторых, можем терять пакеты из-за неправильных настроек или иных ограничений.
Сообщение от Дмитрий1987
|
я научился готовые проекты подстраивать под другое железо,
|
Гораздо интереснее научиться писать свои проекты с нуля.
|
|
|
|
01.05.2017, 03:46
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
На самом деле есть печатная плата, для которой в альтиуме я делал схему и которую трассировал, ПО для неё писал другой человек.
На плате стоят: разъемы, езернет трансформатор, lan8720, stm32f407, СС3100, RFFC5071, MGA43040, МШУ, ПАФ фильтры, ВЧ ключи, DC/DC, LDO.
Боевое применение платы: ip-камера-езернет кабель-эта печатная плата-внтенна-воздушное пространство-антенна-эта печатная плата-езернет кабель-ПК.
Вот хочу самостоятельно написать ПО по приему данных с ip-камеры.
Конфигурировать RFFC5071 через STM научился.
Теперь хочу получить обмен данными между ПК по такой схеме: ПК-езернет кабель-эта печатная плата- spi-эта печатная плата-езернет кабель-ПК.
Потом хочу освоить СС3100, затем написать итоговое ПО.
Безусловно писать свои проекты с нуля интереснее, а крайний вариант моего ПО и есть проект с нуля, просто готовый проект выступает как рабочий алгоритм.
|
|
|
|
01.05.2017, 12:03
|
|
Частый гость
Регистрация: 10.09.2010
Адрес: Резиновая
Сообщений: 45
Сказал спасибо: 3
Сказали Спасибо 14 раз(а) в 12 сообщении(ях)
|
Re: Ethernet в STM32F407
Сообщение от Дмитрий1987
|
...хочу самостоятельно написать ПО по приему данных с ip-камеры....хочу получить обмен данными между ПК...писать свои проекты с нуля интереснее, а крайний вариант моего ПО и есть проект с нуля, просто готовый проект выступает как рабочий алгоритм.
|
Самое главное - это движение. Как = много зависит от целей, способов реализации, способов воспринимать что то новое. Кому то RFC как манна небесна, кому готовый проект. По разному.
Чисто по мне (объём знаний, оптимальность восприятия и багаж - оставим в покое) быстрее всего войти в тему: взять пример железо+софт как готовую плату на ебэе, тупо откомпилировать-запустить-увидеть результат, разобрать по винтикам и состоявляющим, найти ошибки, переработать опираясь на либы-доки, получить задуманную конфетку.
ну и чисто по Вашей теме-очередным шагам восприятия:
обратите внимание на существующие либы типа lwip и иже, и обратите внимание на а) обслуживание железа (имхо тут надо только своё. упирается в менэджеры блоков памяти, работа с конкретным камнем, огрехами или скажем нюансами работы этого камня - как пример под ваш камень: указатель на дескриптор загружаемый на приём не поменяешь на лету. а вот блок памяти в дескрипторе - легко. соответственно обходимся без копирования - что повышает скорость... и т.д..) и менеджэра памяти(его переписывать имхо, под работу со своими блоками памяти. б) сборка пакетов на IP уровне. этим как правило многие самопальные примеры в инете 99,9% пренебрегают. Старайтесь не использовать решений на коленке. Для устойчивости придётся в полный рост реализовывать всё согласно RFC на тот или иной протокол (для IP = сборка дефрагментированных пакетов). в) в примерах разводки железа частенько встречаются ляпы, которые вылезают не сразу на свет божий. Например во многих разводках камень+внешняя физика нет соединения линии прерывания. Соответственно прерывания от втыкания-вытаскивания кабеля в разъём нельзя заставить дышать(только через поллинг)...
с уважением
(круглый)
Последний раз редактировалось kolobok0; 01.05.2017 в 12:06.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:17.
|
|