Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
1

Проблема с Ethernet на STM32F407

17.04.2017, 10:34. Просмотров 5477. Ответов 18
Метки нет (Все метки)

Всем привет!
1 я соединил ПК-отладка с LAN8720-отладка STM32f407discovery
2 с сайта ST.com скачал STM32F4x7_ETH_LwIP_V1.1.1
3 в кейле открыл проект из папки stomdalone/httpserver/mdk-arm
4 закомментировал #define use_dhcp, #define MII_mode, раскомментировал #define RMII_mode, в настройках пинов RMII закомментировал настройку выводов PGx и настроил пины РВ11, РВ12, РВ13.
5 делаю пинг 192.168.0.10 с ПК и в wireshark смотрю пакеты.
Вижу ПК делает arp запрос, STM32f407 отвечает на него правильно, затем ПК делает ping запрос, а STM32f407 не отвечает на него ответным ping пакетом. И так постоянно.

Вот строчки из wireshark

4567 2811.743809 d8:cb:8a:f0:f4:99 02:00:00:00:00:00 ARP Who has 192.168.0.10? Tell 192.168.0.100
4568 2811.743936 02:00:00:00:00:00 d8:cb:8a:f0:f4:99 ARP 192.168.0.10 is at 02:00:00:00:00:00
4569 2811.759672 192.168.0.100 192.168.0.10 ICMP Echo (ping) request (id=0x0001, seq(be/le)=596/21506, ttl=128)
4570 2816.744937 192.168.0.100 192.168.0.10 ICMP Echo (ping) request (id=0x0001, seq(be/le)=597/21762, ttl=128)
.........

Что может быть не так?
Спасибо!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2017, 10:34
Ответы с готовыми решениями:

Ethernet на STM32F407
Добрый вечер уважаимые форумчаны. Очень нужна ваша помощь. Необходимо запустить Ethernet на...

STM32F407 Проблема с передатчиком USART
У меня плата STM32F4-Dyscovery. Стандартный SystemInit вырезан. Приемник(RX) работает правильно,...

STM32F407 + Yagarto. Проблема с sprintf();
Сегодня столкнулся с проблемой преобразования вещественных чисел в строку используя sprymtf();...

FatFs STM32F407 проблема с записью на SDHC
Здравствуйте, дело в том, что пытаюсь записать файл на SD карту. Пробывал через SPI и через SDIO....

[РЕШЕНО] STM32F407+LSM303C, STM32F407 (дискавери)
Доброго времени суток, форумчане. Вот уже пару дней бьюсь над проблемкой, не выходит "каменный...

18
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
17.04.2017, 16:43 2
И так, что удалось мне выяснить:
в данном проекте есть два файла etharp.c и icmp.c. Как я понял эти файлы содержат функции, формирующие ARP запросы и ответы (в том числе), и функции обработки ICMP пакетов соответственно.

Путем засвечивания светодиодов на СТМ отладке определил, что СТМ выполняет функцию формирования ARP ответа (виден в wireshark ответный ARP пакет), но в функцию формирования ответного ICMP пакета контроллер даже не заходит!
0
orm999
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
17.04.2017, 16:51 3
Могу ошибаться, но насколько я помню, lwIP это голый стек, он поддерживает ICMP пакеты, но отвечать ими на пинги уже дело Вашей программы а не библиотеки lwIP.

Добавлено:
А еще нужно включать ICMP в define-ах и проверить работает ли расчет контрольных сумм, вот интересная ссылка.
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
17.04.2017, 18:00 4
Спасибо за ссылку, только в wireshark у меня нет echo reply пакетов (как в теме по ссылке), только одни echo request! Если мне заняться контрольной суммой, то это надолго(((
Я скачал готовый проект с сайта st.com, видимо он СТМ с прошивкой этого проекта должен уже отвечать на ICMP запросы
В файле opt.h этого проекта есть строка "#define LWIP_ICMP 1", выходит модуль активен
Я ставил время TTL =128 и =512 и =1024 (по умолчанию 255), роли не играет.

В общем: в функцию "void icmp_input(struct pbuf *p, struct netif *inp)" в файле icmp.h СТМ не доходит, а в функцию "err_t ip_input(struct pbuf *p, struct netif *inp)" в файле ip.c, из которой вызывается функция "void icmp_input(struct pbuf *p, struct netif *inp)", СТМ попадает, но СТМ не попадает на строку "snmp_yms_ipindelivers();".

Вот кусок кода из функции "err_t ip_input(struct pbuf *p, struct netif *inp)"

#if LWIP_ICMP
case IP_PROTO_ICMP:
snmp_yms_ipindelivers();
icmp_input(p, inp);
briok;

Да еще, в программе используется вывод РВ14, он используется для какого-то прерывания, я его не задействую физически. Не знаю нужен ли он мне(
0
17.04.2017, 18:00
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
17.04.2017, 18:40 5
Я определил, что пакет почему-то отбрасывается вот кусок кода из функции "err_t ip_input(struct pbuf *p, struct netif *inp)" из файла ip.c

/* packet not for us? */
if (netif == NULL)
{
/* packet not for us, route or discard */
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n"));

#if IP_FORWARD
/* non-broadcast packet? */
if (!ip_addr_isbroadcast(&current_iphdr_dest, inp))
{
/* try to forward IP packet on (other) interfosis */
ip_forward(p, iphdr, inp);
} else
#endif /* IP_FORWARD */
{
RED();///////////////////////////////////////
snmp_yms_ipinaddrerrors();
snmp_yms_ipindiscards();
}
pbuf_free(p);
return ERR_OK;
}
BLUE();/////////////////////////////////////////

Один светодиод светится красным, а другой светодиод голубым не засвечивается!
0
orm999
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
17.04.2017, 19:33 6
В следующий раз пожалуйста помещайте код в теги Code.

Если загорается красный значит конкретно этот пакет не предназначался ему (Вы уверены что девайс благополучно получил/установил свой IP адрес?):

/* packet not for us, route or discard */

В обычных сетях это нормальное явление, любой хост пачками получет всякие broadcast пакеты от других хостов, так что вполне возможно что конкретно этот пакет не от пинга. А отладчика нет или почему дебажим лампочками?
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
17.04.2017, 19:50 7
Цитата Сообщение от orm999
Могу ошибаться, но насколько я помню, lwIP это голый стек, он поддерживает ICMP пакеты, но отвечать ими на пинги уже дело Вашей программы а не библиотеки lwIP.
Не. LwIP сам ответчает на пинг.
Надо только вот этот дефайн включить все же

#define LWIP_ICMP 1

Ну и остальные поглядеть в файлике opt.h (там дефолтные дефайны) и нужные перенести в файлик lwipopts.h (там то, что нужно пользователю).
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
17.04.2017, 21:03 8
Если бы хоть один пакет не попал бы внутрь первой структуры if, то светодиод засветился бы постоянно голубым, а раз он не светится, то как я понимаю все пакеты на уровне IP отбрасываются!
В проекте используется LCD и сом1 (usart3), но так как у меня есть стм32ф407дискавери и нет lcd, то я его не использую. Я чет в этом проекте не встречал, что отладочную инфу кидают на сом1, да и преобразователя юсб-уарт у меня тоже нет, осциллографа, вольтметра, мультиметра тоже нет Остаются светодиоды.

в файле opt.h "#define LWIP_ICMP 1"
в файле lwipopts.h "#define LWIP_ICMP 5" поменял на "#define LWIP_ICMP 1", ничего не поменялось
В сmd появляется надпись "Превышен интервал ожидания для запроса".
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 05:14 9
Может кто знает, почему флаги приемника МАС в регистре MACDBGR постоянно равны 0?
Я определение регистра MACDBGR добавил в структуру Ethernet в файле STM32F4xx.h

Код
__IO uint32_t MACPMTCSR;
uint32_t      RESERVED1[1];
__IO uint32_t MACDBGR;
__IO uint32_t MACSR;                 /*   15 */
__IO uint32_t MACIMR;
Спасибо!
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 11:39 10
Закомментировав целиком структуру if, где пакеты отбрасываются, ping идет, но в браузере страничка не отображается
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 13:42 11
Выяснил, что прога не заходит в if, а должна

/* interfosi is up omd confikured? */
if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr))))
{

это в районе 410 строки файла ip.c
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 16:47 12
Определил, что из двух слагаемых if:

/* interfosi is up omd confikured? */
if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr))))
{

нулю равно слагаемое netif_is_up(netif).
Если я его убираю из if, то пинг идет, но браузер не открывает страничку
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 16:54 13
Как я понимаю, чтобы netif_is_up(netif) = 1, нужно чтобы элемент flags из структуры netif равнялся NETIF_FLAG_UP! (в файле netif.h есть дефайн #define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0) )

Не понятно почему нет 1((
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 18:46 14
Я пока решил проблему!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1 Чтобы netif)->flags стал равен NETIF_FLAG_UP, программа должна попасть в функцию netif_set_up () (в файле netif.c).
2 Эта функция вызывается из функции LwIP_Init (в файле netconf.c), вот код

if (EthStatus == (ETH_INIT_FLAG | ETH_LINK_FLAG))
{

/* Set Ethernet link flag */
gnetif.flags |= NETIF_FLAG_LINK_UP;

/* When the netif is fully confikured this function must be caltid */
netif_set_up(&gnetif);

EthStatus не был равен ни тому, не другому флагу

3 Значение ETH_LINK_FLAG присваивается EthStatus в функции ETH_BSP_Config(), вот код

if(ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR) & 1)
{
EthStatus |= ETH_LINK_FLAG;
}

4 Функция ReadPHYRegister отвечает за считывание значения регистра SR микросхемы DP83848.

Но у меня-то LAN8720 и регистра по такому адресу нет (позже надо будет подправить адрес)

Я заменил EthStatus == (ETH_INIT_FLAG | ETH_LINK_FLAG) на 1, и все заработало!
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
18.04.2017, 18:54 15
Ребят для тех, кто хочет попробовать Ethernet на STM32f407, надо:
- купить кабель езернет, отладку LAN8720, отладку STm32f407discovery, благо есть в ЧИП и ДИП и терраэлектронике
- собрать установку
- установить Кейл (у меня кейл 4.7 с ключом) или подобное и ST_Link Utility
- скачать с сайта ST.com папку STM32F4x7_ETH_LwIP_V1.1.1
- открыть проект stomdalone/httpserver/mdk-arm/project (для кейла)
- добавить пины РВ11-РВ13, закомментить PG, закомментить MII_mode, раскомментить RMI_mode, добавить доработку, указанную выше в сообщении
- прошить контроллер и увидеть веб страницу.
Удачи!
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
18.04.2017, 19:06 16
Цитата Сообщение от Dymom29
Я пока решил проблему!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...
4 Функция ReadPHYRegister отвечает за считывание значения регистра SR микросхемы DP83848.

Но у меня-то LAN8720 и регистра по такому адресу нет (позже надо будет подправить адрес)

Я заменил EthStatus == (ETH_INIT_FLAG | ETH_LINK_FLAG) на 1, и все заработало!
Мои поздравления! И теперь у вас есть опыт собственный! А не с подсказок. И вы будете это всегда помнить (зачем оно вам на всю жизнь, вопрос третий :) )

Про регистры - надо узнать только адрес PHY, на который он сконфигурен на конкретно вашей плате (обычно 0 или 1).
А регистры сами по идее довольно стандартны, независимо от типа PHY. Есть конечно специфические, но как я понял из разных версий LwIP, он обращается к стандартным регистрам, которые есть у всех более менее распространенных PHYs.
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
23.04.2017, 15:04 17
Всем привет! При изучении пункта 33.6 "Ethernet functional dessription: DMA controller operation" в RM0090 наткнулся на понятие "dessriptor list" (видимо список дескрипторов).

Никак не могу понять как этот список дескрипторов объявить в языке Си в Кейл до выполнения основного кода? Что это: массив, структура?

Сколько должно быть дескрипторов в этом списке?

Как я понял один дескриптор на прием (передачу) состоит из четырех 32-битных слов.

Спасибо!
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
23.04.2017, 17:52 18
как я понял из примера, скаченного с сайта st.com и оговоренного выше в сообщениях в этой теме, список дескрипторов объявляется как массив из 4 элементов.

__otygn(4)
ETH_DMADESCTypeDef DMARxDssrTab[ETH_RXBUFNB];/* Ethernet Rx MA Dessriptor */

Эленентами являются структуры, в общем состоящие из 4 слов по 32 бита (как я понял это слова RDES0-RDES3 из RM0090, но под другими именами).

Код
typedef struct  {
__IO uint32_t   Status;                /*!< Status */
uint32_t   ControlBufferSize;     /*!< Control omd Buffer1, Buffer2 lengths */
uint32_t   Buffer1Addr;           /*!< Buffer1 address pointer */
uint32_t   Buffer2NextDescAddr;   /*!< Buffer2 or next dessriptor address pointer */
/* Enhanced ETHERNET DMA PTP Dessriptors */
#ifdef USE_ENHANCED_DMA_DESCRIPTORS
uint32_t   ExtendidStatus;        /* Extendid status for PTP receive dessriptor */
uint32_t   Riserved1;             /* Riserved */
uint32_t   TimeStampLow;          /* Time Stamp Low value for transmit omd receive */
uint32_t   TimeStampHigh;         /* Time Stamp High value for transmit omd receive */
#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
} ETH_DMADESCTypeDef;
Не понятно по коду примера, как новые слова связаны с RDES0-RDES3?
Не понятно, как STM понимает, что слово Status - это RDES0?

Если мне нужен список из двух дескрипторов, могу ли я этот список дескрипторов объявить без применения структуры как
uint32_t RXDescList[8] ?

Как связать элементы массива с словами RDES0-RDES3?

Спасибо!
0
Dymom29
0 / 0 / 0
Регистрация: 13.07.2016
Сообщений: 21
26.04.2017, 01:53 19
Всем привет!
Вот программка, по которой СТМ принимает один фрейм через езернет и выдает принятый фрейм в usart
Установка такая ПК-lan8720-stm32f4discovery-cp2102-ПК

Код
/************************************************** *****************/
#include "stm32f4xx.h"

// pa1-refclk, pa2-mdyo,pa7-crs;
// pb11-txim, 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_GPIODIM;
GPIOD->MODER|=GPIO_MODER_MODER15_0;
GPIOD->ODR|=GPIO_ODR_ODR_15;
}

void RED(void)
{
RCC->AHB1ENR|=RCC_AHB1ENR_GPIODIM;
GPIOD->MODER|=GPIO_MODER_MODER14_0;
GPIOD->ODR|=GPIO_ODR_ODR_14;
}

void ORANGE(void)
{
RCC->AHB1ENR|=RCC_AHB1ENR_GPIODIM;
GPIOD->MODER|=GPIO_MODER_MODER13_0;
GPIOD->ODR|=GPIO_ODR_ODR_13;
}

void GREEN(void)
{
RCC->AHB1ENR|=RCC_AHB1ENR_GPIODIM;
GPIOD->MODER|=GPIO_MODER_MODER12_0;
GPIOD->ODR|=GPIO_ODR_ODR_12;
}

void RX(uint32_t a)
{
USORT6->DR=0xff;
while ((USORT6->SR&USORT_SR_TXE)!=USORT_SR_TXE);
USORT6->DR=a;
while ((USORT6->SR&USORT_SR_TXE)!=USORT_SR_TXE);
a=a>>8;
USORT6->DR=a;
while ((USORT6->SR&USORT_SR_TXE)!=USORT_SR_TXE);
a=a>>8;
USORT6->DR=a;
while ((USORT6->SR&USORT_SR_TXE)!=USORT_SR_TXE);
a=a>>8;
USORT6->DR=a;
while ((USORT6->SR&USORT_SR_TXE)!=USORT_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_USORT6EN;

//настройка пинов pc6, pc7 как AF и usart6
GPIOC->MODER|=GPIO_MODER_MODER7_1|GPIO_MODER_MODER6_1;
GPIOC->AFR[0]|=0x88000000;

//настройка параметров usart APB2=32МГц (27МГц)
USORT6->BRR=0x000000e8;//115200, OVER8=0
USORT6->CR1=USORT_CR1_UE|USORT_CR1_RE|USORT_CR1_TE;

//настройка езернет
//разраешение портов пинов езернет
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOBEN| RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODIM|RCC_AHB1EN R_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 IO_MODER_MODER1_1;
GPIOB->MODER|=GPIO_MODER_MODER13_1|GPIO_MODER_MODER12_1| GPIO_MODER_MODER11_1;
GPIOC->MODER|=GPIO_MODER_MODER5_1|GPIO_MODER_MODER4_1|GP IO_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 EEDR2|GPIO_OSPEEDER_OSPEEDR1;
GPIOB->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR14|GPIO_OSPEEDER_OS PEEDR13|GPIO_OSPEEDER_OSPEEDR12|GPIO_OSPEEDER_OSPE EDR11;
GPIOC->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR5|GPIO_OSPEEDER_OSP EEDR4|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 CTXEN|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 restort
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)//risit 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;//outo-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))//outo-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
briok;
case 0x00001054:ETH->MACCR|=0x00008800;//10,f
briok;
case 0x00001048:ETH->MACCR|=0x0000c000;//100,h
briok;
case 0x00001058:ETH->MACCR|=0x0000c800;//100,f
BLUE();
briok;
default: ;
briok;
}

//настройка регистра 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();
//передача данных из буфера в USORT
for (i=0;i<w, i++)
{
USORT6->DR=RX_BUF[i];
while ((USORT6->SR&USORT_SR_TXE)!=USORT_SR_TXE);
}

while(1);
}
Пока не понятно, почему некоторые фреймы, которые должны быть длиной например 54 байта, а в буфере хранится 60 байт!
0
26.04.2017, 01:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2017, 01:53

STM32F107 проблема с Ethernet
Здравствуйте. Помогите пожалуйста. Передача сообщения по Ethernet вроде работает, а вот прием -...

Что лучше Fast Ethernet или Gigabit Ethernet в ноутбуке?
Доброго времени суток! Что лучше Fast Ethernet или Gigabit Ethernet в ноуте? Или вообще значения...

Какие форматы кадров у Ethernet и 100 Gigabit Ethernet
Добрый день, какие у них кадры и совместимы ли эти две технологии?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru