реклама на сайте
подробности

 
 
> stm32F4Discovery ethernet нет прерываний, Ай нид хэлп :(
Fobes
сообщение Jan 31 2016, 12:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Всем доброго времени суток.
Отладочная: stm32F4Discovery ; физика: dp83848; Интерфейс: RMII;
Открыл SMT32Cube, настроил тактирование, Ethernet на RMII(включил глобальные прерывания), подключил LwIp, сгенерировал проект для keil v5.
Написал код для отправки самодельных пакетов, все отлично работает. Но теперь нужно принимать пакеты. Решил это сделать через прерывание, но туда никогда не попадаю, хотя вроде как должен(Enable Interrupt on change of link status) и при отправке пакета и при приеме...
Помогите начинающему sad.gif куда смотреть, что искать ? уже совсем запутался...

Прошелся отладчиком, нашел такой кусок:
CODE
/**** Configure PHY to generate an interrupt when Eth Link state changes ****/
/* Read Register Configuration */
HAL_ETH_ReadPHYRegister(&heth, PHY_MICR, &regvalue);

regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE);

/* Enable Interrupts */
HAL_ETH_WritePHYRegister(&heth, PHY_MICR, regvalue );

/* Read Register Configuration */
HAL_ETH_ReadPHYRegister(&heth, PHY_MISR, &regvalue);

regvalue |= PHY_MISR_LINK_INT_EN;

/* Enable Interrupt on change of link status */
HAL_ETH_WritePHYRegister(&heth, PHY_MISR, regvalue);

Вроде должны быть прерывания, но их нет sad.gif ай нид хэлп.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
misyachniy
сообщение Jan 31 2016, 13:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Судя по текусту, настраивается сам модуль на генерацию прерывания.
Нужно найти еще функцию, которая вызывается при прерывании.

Дожна быть описана в файле что-то типа "stm32F4xx_it.c"

Там должны быть функции такого типа.

Код
void MemManage_Handler(void)
    {
      /* Go to infinite loop when Memory Manage exception occurs */
      while (1)
      {
      }
    }


Я не работал с SMT32Cube, LwIp, keil.
На сколько я помю, IAR+LwIp есть функция обработчика пакетов.
Нужно ее вызывать из прерывания.
Go to the top of the page
 
+Quote Post
Fobes
сообщение Jan 31 2016, 14:22
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



В "stm32F4xx_it.c" есть только глобальное прерывание, которое и смотрю отладчиком...
void ETH_IRQHandler(void)

Причем если на долго оставить, то какие-то пакеты он всеже принимает, но как-то странно... Как-будто фильтры какие-то работают... Мне нужно чтобы он чисто ethernet с vlan tag'ом принимал, но их он почему-то не видит... что еще проверить можно ?
Может с регистрами наврал ?
CODE
/* DP83848 PHY Address*/
#define DP83848_PHY_ADDRESS 0x01
/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
#define PHY_RESET_DELAY ((uint32_t)0x000000FF)
/* PHY Configuration delay */
#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF)

#define PHY_READ_TO ((uint32_t)0x0000FFFF)
#define PHY_WRITE_TO ((uint32_t)0x0000FFFF)

/* Section 3: Common PHY Registers */

#define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */
#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */

#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */
#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */
#define PHY_FULLDUPLEX_100M ((uint16_t)0x4000) /*!< Set the full-duplex mode at 100 Mb/s */
#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */
#define PHY_FULLDUPLEX_10M ((uint16_t)0x1000) /*!< Set the full-duplex mode at 10 Mb/s */
#define PHY_HALFDUPLEX_10M ((uint16_t)0x0800) /*!< Set the half-duplex mode at 10 Mb/s */
#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */
#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */
#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */
#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */

#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */
#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */
#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */

/* Section 4: Extended PHY Registers */

#define PHY_SR ((uint16_t)0x10) /*!< PHY status register Offset */
#define PHY_MICR ((uint16_t)0x11) /*!< MII Interrupt Control Register */
#define PHY_MISR ((uint16_t)0x12) /*!< MII Interrupt Status and Misc. Control Register */

#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */
#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */
#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */

#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */
#define PHY_MICR_INT_OE ((uint16_t)0x0002) /*!< PHY Enable output interrupt events */

#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */
#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */


Сообщение отредактировал IgorKossak - Jan 31 2016, 18:09
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016