Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Замена dp83848 на ksz8051RNL в проекте от ST, stm32f407/417
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
vovanxp
Маленькая проблема переросла в большую.

За основу взял stm32f4 cubemx, сам проект \Projects\STM324xG_EVAL\Applications\LwIP\LwIP_HTTP_Server_Raw\MDK-ARM
С начало подключил dp83848, подключил таким образом как в этой статье http://blog.tkjelectronics.dk/2012/08/ethe...g-external-phy/
все заработало с первого раза. Этот рабочий проект взялся переделывать под физику ksz8051RNL. Интерфейс RMII, ksz8051RNL тактируется кварцом на 25 Мгц.

Подключил ksz8051RNL, перенастроил
1) Закоментировал #define USE_DHCP, прописал IP и маску, шлюз

2) Прописал интерфейс RMII
EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;

3) Поменял адрес физики и регистры
#define DP83848_PHY_ADDRESS 0x00

4)
#define PHY_SR ((uint16_t)0x00)
#define PHY_SPEED_STATUS ((uint16_t)0x2000) /*!< PHY Speed mask 13-й бит */
#define PHY_DUPLEX_STATUS ((uint16_t)0x1000) /*!< PHY Duplex mask 8-й бит */

PHY_BCR и PHY_SR это одно и тоже, просто чтоб код не переписывать, из PHY_SR нам нужно узнать только скорость и режим.

ksz8051RNL запускалась в HALFDUPLEX
После HAL_ETH_Start(&EthHandle); добавил переключение режима
HAL_ETH_WritePHYRegister(&EthHandle, PHY_SR, PHY_DUPLEX_STATUS);

Теперь с регистра что ksz8051RNL работает на FULLDUPLEX и SPEED_100M.

После запуска веб молчит, пинги тоже. Видимо еще что-то нужно поменять чтоб заработало на ksz8051RNL.
На J-45 зеленый светодиод светит постоянно, желтый мигает.
Помогите плз.
Integro
Первое, проверьте есть ли связь по MDIO, есть функции чтения и записи не знаю как cube их обозвал, найти их можно при конфигурировани Eth. там и увидите функции чтения и записи MDIO, попробуйте вычитать 0-0xf регистры, среди которых есть phy_idс его помощью можно установить валидность данных.
Если связь есть, посмотрите меняется ли статус линка. Линка нет, проблема в конфигурации PHY, проверьте пины CONFIGx, кварц, выходную частоту на проц.

Из поста не ясно что там у вас платой, если монтаж PHY на проводах, длина должна быть минимальна.
vovanxp
Цитата(Integro @ Oct 22 2014, 14:16) *
Первое, проверьте есть ли связь по MDIO, есть функции чтения и записи не знаю как cube их обозвал, найти их можно при конфигурировани Eth. там и увидите функции чтения и записи MDIO, попробуйте вычитать 0-0xf регистры, среди которых есть phy_idс его помощью можно установить валидность данных.
Если связь есть, посмотрите меняется ли статус линка. Линка нет, проблема в конфигурации PHY, проверьте пины CONFIGx, кварц, выходную частоту на проц.

Из поста не ясно что там у вас платой, если монтаж PHY на проводах, длина должна быть минимальна.


CONFIG0 и CONFIG1 висят в воздухе, CONFIG2/ETH_CRS, он заведен на МК.

Регистры считываю:
HAL_ETH_ReadPHYRegister(&EthHandle, 0x00, &regvalue);
regvalue = 0x00001000

HAL_ETH_ReadPHYRegister(&EthHandle, 0x02, &regvalue);
regvalue =0x00000022

HAL_ETH_ReadPHYRegister(&EthHandle, 0x03, &regvalue);
regvalue =0x00001556

Вот фото платы.

Цитата(Integro @ Oct 22 2014, 14:16) *
Если связь есть, посмотрите меняется ли статус линка. Линка нет, проблема в конфигурации PHY, проверьте пины CONFIGx, кварц, выходную частоту на проц.

Связь по MDIO есть.

Чтение из регистра Basic Status = 0x01, HAL_ETH_ReadPHYRegister(&EthHandle, 0x01, &regvalue);
regvalue = 0x0000786D

То есть второй бит Link Status = 1( Link is up)
четвертый бит Remote Fault = 0( No remote fault)



P.S.
Вот тут всегда не попадает в цикл
if(((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET))
{
.....

Этот цикл в процедуле
if (HAL_ETH_GetReceivedFrame(&EthHandle) != HAL_OK)
return NULL;

То есть ничего не приходит
den_po
вроде 8051 и 8031 довольно похожи?
на всякий случай то, как я прикрутил какой-то пример lwip к 8031
Код
#define RMII_MODE
#define PHY_ADDRESS 0 //3
#define PHY_MICR                  0x1B /* MII Interrupt Control Register */
#define PHY_MICR_INT_EN           ((uint16_t)(1<<13)) /* PHY Enable interrupts */
#define PHY_MICR_INT_OE           ((uint16_t)(0)) /* PHY Enable output interrupt events */
#define PHY_MISR                  0x1B /* MII Interrupt Status and Misc. Control Register */
#define PHY_MISR_LINK_INT_EN      ((uint16_t)((1<<8)|(1<<10))) /* Enable Interrupt on change of link status */
#define PHY_LINK_STATUS           ((uint16_t)(1<<0)) /* PHY link status interrupt mask */
#define PHY_SR    ((uint16_t)0x1e)
#define PHY_SPEED_STATUS            ((uint16_t)0x0001)
#define PHY_DUPLEX_STATUS           ((uint16_t)0x0004)
vovanxp
Цитата(den_po @ Oct 22 2014, 17:58) *
вроде 8051 и 8031 довольно похожи?
на всякий случай то, как я прикрутил какой-то пример lwip к 8031

Вы поменяли только дефайны и у вас запустилось?
На основе какого проекта вы меняли?



Не могу написать вам в личку, можета дать свою почту или аську/скайп.
Integro
Цитата(vovanxp @ Oct 22 2014, 17:50) *
CONFIG0 и CONFIG1 висят в воздухе, CONFIG2/ETH_CRS, он заведен на МК.

Вспомнил, там есть нюанс с ногами, по дефолту все pulldown, а надо:
Нажмите для просмотра прикрепленного файла
vovanxp
Цитата(Integro @ Oct 22 2014, 21:48) *
Вспомнил, там есть нюанс с ногами, по дефолту все pulldown, а надо:
Нажмите для просмотра прикрепленного файла

18 и 29 ногу через 1 КОм к земле, 28 я через 4,7 КОм к 3,3 правильно?
Integro
Цитата(vovanxp @ Oct 22 2014, 22:49) *
18 и 29 ногу через 1 КОм к земле, 28 я через 4,7 КОм к 3,3 правильно?

Да.
vovanxp
Запустилась, я ее одолел.
Выставил резисторами strapping pins, 18 и 29 ногу через 1 КОм к земле, 28 я через 4,7 КОм к 3,3 правильно и все запустилось

Из регистров нужны только эти
#define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */
#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */
#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */

#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */
#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */
#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */


#define DP83848_PHY_ADDRESS 0x00

#define PHY_SR ((uint16_t)0x1e)
#define PHY_SPEED_STATUS ((uint16_t)(1 << 0))
#define PHY_DUPLEX_STATUS ((uint16_t)(1 << 2))


Всем большое спасибо за помощь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.