06.04.2017, 10:44
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ethernet в STM32F407
Всем привет! Хочу вот освоить Ethernet в STM32F407, используя CMSIS.
Сначала хочу убедиться в том, что фреймы от ПК записываются в RX FIFO STM32F407.
Собрал рабочее место:
ПК-езернет кабель-рабочая плата, на которой установлен трансформатор, LAN8720, STM32F407, светодиод
Написал следующую прогу:
Нажмите, чтобы открыть спойлер
/*******/
#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
/******/
uint8_t temp,temp1;
uint32_t i, j,temp2,temp3;
//main program
int main()
{
//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;
RCC-›CFGR|=RCC_CFGR_SW_PLL;//sys clock-pll
FLASH-›ACR|=FLASH_ACR_LATENCY_4WS;
for (i=0;i‹500;i++);
//set rcc
RCC-›AHB1ENR|=RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOBEN| R CC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN|RCC_AHB1ENR _GPIOEEN;
RCC-›AHB1ENR|=RCC_AHB1ENR_ETHMACRXEN|RCC_AHB1ENR_ETHMA C TXEN|RCC_AHB1ENR_ETHMACEN;
RCC-›APB2ENR|=RCC_APB2ENR_SYSCFGEN;
SYSCFG-›PMC=SYSCFG_PMC_MII_RMII_SEL;
//set gpio
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
//config LAN8720
GPIOE-›ODR=GPIO_ODR_ODR_12;//rst=1
while (ETH-›MACMIIAR&0x00000001);//busy=1
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
GPIOD-›ODR&=~GPIO_ODR_ODR_8;
ETH-›MACMIIAR=0x00000fc1;//adr=1, reg=31,read
while (ETH-›MACMIIAR&0x00000001);
}
GPIOD-›ODR|=GPIO_ODR_ODR_8;
}
for (i=0;i‹50000;i++);
GPIOD-›ODR&=~GPIO_ODR_ODR_8;
for (i=0;i‹5000000;i++);
//config MAC
ETH-›MACCR=0x00008000;//
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
GPIOD-›ODR|=GPIO_ODR_ODR_8;
for (i=0;i‹500000;i++);
GPIOD-›ODR&=~GPIO_ODR_ODR_8;
for (i=0;i‹5000000;i++);
break;
default: GPIOD-›ODR|=GPIO_ODR_ODR_8;
while (1);
break;
}
ETH-›MACCR|=ETH_MACCR_RE;//enable receive
ETH-›MACFFR=ETH_MACFFR_RA;//all frames receive
while (!(ETH-›MACDBGR&0x0000ffff))
{
GPIOD-›ODR|=GPIO_ODR_ODR_8;
}
while(1)
{
GPIOD-›ODR|=GPIO_ODR_ODR_8;
for (i=0;i‹500000;i++);
GPIOD-›ODR&=~GPIO_ODR_ODR_8;
for (i=0;i‹500000;i++);
}
}
Как я понял, если фреймы записываются в RX FIFO STM32f407, то в регистре MACDBGR хотя бы один бит в диапазоне номеров от 15 до 0 должен быть равен 1, тогда светодиод, подключенный к выводу PD8, должен мигать. А он светится постоянно, получается фреймы не записываются в RX FIFO STM32f407!
Подскажите, пожалуйста, что я делаю не так? Спасибо!
|
|
|
|
06.04.2017, 11:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Ethernet в STM32F407
А что за МАК адреса вы настроили ?? Пока у вас нет IP стека на контроллере, он сможет принимать только броадкастовые и малтикастовые езернет фреймы (точнее компьютер будет только такие на него отправлять)
|
|
|
|
06.04.2017, 11:34
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Я никакие МАС адреса на микроконтроллере не настраивал! Я хочу просто увидеть что какие-то фреймы записываются в приемный ФИФО. я в регистре MACFFR установил бит receive all (RA=1)
|
|
|
|
06.04.2017, 11:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Ethernet в STM32F407
Когда команда ping вам в помощь (комп. будет отправлять arp запрос). Или включите какой нить служебный протокол в настройка компьютера - они работают по L2.
|
|
|
|
06.04.2017, 11:53
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Хм! На самом деле в итоге я хочу сделать езернет удлинитель, то есть получить следующую конфигурацию:
ПК- езернет кабель-плата с трансформатором, LAN8720, STM32F407-кабель-плата с трансформатором, LAN8720, STM32F407-езернет кабель-ПК
Платы соединяются по SPI
|
|
|
|
06.04.2017, 11:56
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Я не могу понять, почему ни один бит с номерами от 15 до 0 в регистре MACDBGR не выставляется в 1!!!!
|
|
|
|
06.04.2017, 12:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Ethernet в STM32F407
ETH_MACDBGR
An all-zero status indicates that the MAC core is in Idle state (and
FIFOs are empty) and no activity is going on in the data paths.
Конечно если конфигурация правильная.
сделайте ping 1.1.1.1 с консоли и посмотрите что изменится
|
|
|
|
06.04.2017, 12:30
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Попробовал, без изменений
Может быть я не все регистры сконфигурировал?
Ни одного примера не нашел в интернете с применением CMSIS для написания проги с езернетом для микроконтроллеров STM32(((
|
|
|
|
06.04.2017, 12:39
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: Ethernet в STM32F407
Для начала (лучше до начала) стоит хорошо покурить документацию (RTFM!!!!) по нижним уровням - PHY/MAC/…, разобраться с работой Ethernet, разобраться с режимами и логикой работы используемого железа,…
На стороне ПК желательно поставить что-то для контроля обмена по сети (WareShark например) и научиться пользоваться. Желательно иметь генератор пакетов нужного формата и содержимого. Тут и поиск и написание своего на C/VB/python/… поможет, примеры и описания есть, остальное не сильно сложно.
И в догонку - чип простейшего hub с обвязкой для просто удлинителя, даже с питанием и транзитом питания по PoE не проще собрать или купить? И задачу решит и проблемой будет только изготовление платы по рекомендациям из DS?
PS после изучения основ и при наличии генератора нужных пакетов можно уже отлаживаться. Кстати ещё неплохо бы смотреть на сигналы на ногах отдельным инструментом осциллограф, ЛА,…
Сейчас пока будет очень много вопросов для телепатов - потребуется воспроизведение Вашей конфигурации и ее проверка.
PPS может стоит вообще искать примеры построения Ethernet стека?
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 06.04.2017 в 12:47.
|
|
|
|
06.04.2017, 12:58
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 65
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Ethernet в STM32F407
Осциллограф есть, сигналы на приемных выводах микроконтроллера (RXD0, RXD1) смотрел, сигналы нормальные. плата рабочая, другой человек для неё писал прогу с езернетом, прога работает!
Wireshark есть, работать с ним умею, пакеты с ПК выходят!
PLL в микроконтроллере настроена правильно на 64 МГц, смотрел по осциллографу.
LAN8720 настроен, показывает, что скорость езернета 100 Мбит/с, режим полнодуплексный
RM0090 в части езернета изучил главы 33.1-33.4 и в главе 33.5 изучил формат фрейма и описание приема. Думаю пока достаточно читать!
Если кто-то уже писал прогу с езернетом и разбирался с регистрами, я думаю не составит труда, просмотрев код, сказать что не так!
Спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:10.
|
|