Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SK-STM32F217 и LwIp стек
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Отладочные платы
Acvarif
Пытаюсь запустить на SK-STM32F217 (http://starterkit.ru/html/index.php?name=shop&op=view&id=62) демо приложение (udp_echo_server) для STM3220G-EVAL http://www.st.com/internet/evalboard/product/250374.jsp. Демка компилится в Keil без проблем и загружается в SK-STM32F217. Но совсем не работает.

Очевидно и не будет работать поскольку в платах стоят разные PHY (в SK-STM32F217 - ks8721bl) (в STM3220G-EVAL - DP83848C). Соединение по ногам идентичное. Регистры у них почти одинаковые. Очевидно все дело в том, что "почти".
Пробовал ли кто настроить демку (Ethernet) от STM3220G-EVAL под PHY типа ks8721bl?

Если у кого есть опыт в Ethernet stm32 подсобите пожалуйста примером UDP сервера (клиента) для stm32F2xx + PHY типа ks8721bl
В комплекте с SK-STM32F217 идет демка TCP/IP сервера на uIP стеке. Как заставить демку работать в режиме UDP сервера пока не допираю.
Rst7
Для начала посмотрите в драйвере PHY функцию поиска чипа и замените там ID c DP83848C на ks8721bl (нужные ID найдете в даташитах на PHY). И скорее всего все заработает.
Acvarif
Цитата(Rst7 @ Jan 5 2012, 02:15) *
Для начала посмотрите в драйвере PHY функцию поиска чипа и замените там ID c DP83848C на ks8721bl (нужные ID найдете в даташитах на PHY). И скорее всего все заработает.


Нашел в демке только установку адреса DP83848C
Код
/* Exported constants --------------------------------------------------------*/
#define DP83848_PHY_ADDRESS       0x01 /* Relative to STM322xG-EVAL Board */


Поиск чипа это наверное в линуксах имеется.
Rst7
Ищите дальше. Посмотрите, что он при инициализации читает из PHY.
Acvarif
Цитата(Rst7 @ Jan 5 2012, 14:06) *
Ищите дальше. Посмотрите, что он при инициализации читает из PHY.

В main есть

Код
/* configure ethernet */
  ETH_BSP_Config();


CODE
void ETH_BSP_Config(void)
{
RCC_ClocksTypeDef RCC_Clocks;

/* Configure the GPIO ports for ethernet pins */
ETH_GPIO_Config();

/* Configure the Ethernet MAC/DMA */
ETH_MACDMA_Config();

if (EthInitStatus == 0)
{
LCD_SetTextColor(Red);
LCD_DisplayStringLine(Line5, (uint8_t*)" Ethernet Init ");
LCD_DisplayStringLine(Line6, (uint8_t*)" failed ");
while(1);
}

/* Configure the PHY to generate an interrupt on change of link status */
Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS);

/* Configure the EXTI for Ethernet link status. */
Eth_Link_EXTIConfig();

/* Configure Systick clock source as HCLK */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

/* SystTick configuration: an interrupt every 10ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
}


Ну и сама инициализация GPIO для Ethernet
CODE
void ETH_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIOs clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOI |
RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH |
RCC_AHB1Periph_GPIOF, ENABLE);

/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Configure MCO (PA8) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM322xG-EVAL */
#ifdef PHY_CLOCK_MCO


/* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */
RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
#endif /* PHY_CLOCK_MCO */

SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE /* Mode RMII with STM322xG-EVAL */

SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif

/* Ethernet pins configuration ************************************************/
/*
ETH_MDIO -------------------------> PA2
ETH_MDC --------------------------> PC1
ETH_PPS_OUT ----------------------> PB5
ETH_MII_CRS ----------------------> PH2
ETH_MII_COL ----------------------> PH3
ETH_MII_RX_ER --------------------> PI10
ETH_MII_RXD2 ---------------------> PH6
ETH_MII_RXD3 ---------------------> PH7
ETH_MII_TX_CLK -------------------> PC3
ETH_MII_TXD2 ---------------------> PC2
ETH_MII_TXD3 ---------------------> PB8
ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1
ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7
ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4
ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5
ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11
ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13
ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14
*/

/* Configure PA1, PA2 and PA7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

/* Configure PB5 and PB8 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_ETH);

/* Configure PC1, PC2, PC3, PC4 and PC5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

/* Configure PG11, PG14 and PG13 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH);

/* Configure PH2, PH3, PH6, PH7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init(GPIOH, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource3, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource6, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource7, GPIO_AF_ETH);

/* Configure PI10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOI, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOI, GPIO_PinSource10, GPIO_AF_ETH);
}


Тут я немного недопонимаю в каком все же режиме он инициализируется MII или RMII
Платка SK-STM32F217 работает в RMII
Как все же исхитриться чтоб проверить правильно ли проинициализирована PHY ks8721bl ?
(Например Прочитать из нее что-то и потом передать по Com1)
Acvarif
Кое что раскопал. Вот правильная инициализация (надо еще перепроверить) GPIO для Ethernet SK-STM32F217 в режиме RMII
CODE
void ETH_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIOs clocks */
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
// RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOI |
// RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH |
// RCC_AHB1Periph_GPIOF, ENABLE);

/* Enable GPIOs clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG |
RCC_AHB1Periph_GPIOF, ENABLE);

/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Configure MCO (PA8) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM322xG-EVAL */
#ifdef PHY_CLOCK_MCO


/* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */
RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
#endif /* PHY_CLOCK_MCO */

SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE /* Mode RMII with STM322xG-EVAL */

SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif

/* Ethernet pins configuration ************************************************/
/*
ETH_MDIO -------------------------> PA2
ETH_MDC --------------------------> PC1
ETH_PPS_OUT ----------------------> PB5
ETH_MII_CRS ----------------------> PH2
ETH_MII_COL ----------------------> PH3
ETH_MII_RX_ER --------------------> PI10
ETH_MII_RXD2 ---------------------> PH6
ETH_MII_RXD3 ---------------------> PH7
ETH_MII_TX_CLK -------------------> PC3
ETH_MII_TXD2 ---------------------> PC2
ETH_MII_TXD3 ---------------------> PB8
ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1 --
ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7 --
ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4 --
ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5 --
ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11 нужно PB11
ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13 --
ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14 */

/* Configure PA1, PA2 and PA7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

/* Configure PB5 and PB8 */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_8;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_ETH);
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_ETH);

/* Configure PB11 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);

/* Configure PC1, PC2, PC3, PC4 and PC5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

/* Configure PG11, PG14 and PG13 */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_Init(GPIOG, &GPIO_InitStructure);
// GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH);

/* Configure PH2, PH3, PH6, PH7 */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7;
// GPIO_Init(GPIOH, &GPIO_InitStructure);
// GPIO_PinAFConfig(GPIOH, GPIO_PinSource2, GPIO_AF_ETH);
// GPIO_PinAFConfig(GPIOH, GPIO_PinSource3, GPIO_AF_ETH);
// GPIO_PinAFConfig(GPIOH, GPIO_PinSource6, GPIO_AF_ETH);
// GPIO_PinAFConfig(GPIOH, GPIO_PinSource7, GPIO_AF_ETH);

/* Configure PI10 */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
// GPIO_Init(GPIOI, &GPIO_InitStructure);
// GPIO_PinAFConfig(GPIOI, GPIO_PinSource10, GPIO_AF_ETH);
}


Попробовал идти дальше.
Все застревает на функции

Код
  /* Configure the Ethernet MAC/DMA */
  ETH_MACDMA_Config();

Вот сама функция
CODE
static void ETH_MACDMA_Config(void)
{
ETH_InitTypeDef ETH_InitStructure;

/* Enable ETHERNET clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);

/* Reset ETHERNET on AHB Bus */
ETH_DeInit();

/* Software reset */
ETH_SoftwareReset();

/* Wait for software reset */
while (ETH_GetSoftwareResetStatus() == SET);

/* ETHERNET Configuration --------------------------------------------------*/
/* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
ETH_StructInit(&ETH_InitStructure);

/* Fill ETH_InitStructure parametrs */
/*------------------------ MAC -----------------------------------*/
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
//ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
// ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
// ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;

ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
#ifdef CHECKSUM_BY_HARDWARE
ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
#endif

/*------------------------ DMA -----------------------------------*/

/* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
the store and forward guarantee that a whole frame is stored in the FIFO,
so the MAC can insert/verify the checksum,
if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;

ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;

/* Configure Ethernet */
EthInitStatus = ETH_Init(&ETH_InitStructure, DP83848_PHY_ADDRESS);
}
Rst7
QUOTE
EthInitStatus = ETH_Init(&ETH_InitStructure, DP83848_PHY_ADDRESS);


Ну а дальше, что из себя ETH_Init представляет? Раз туда адрес PHY передается, наверное там и колдовство с ним.

И пожалуйста, отредактируйте свои посты, заменив тег CODE на CODEBOX.
Acvarif
Цитата(Rst7 @ Jan 5 2012, 17:24) *
Ну а дальше, что из себя ETH_Init представляет? Раз туда адрес PHY передается, наверное там и колдовство с ним.

И пожалуйста, отредактируйте свои посты, заменив тег CODE на CODEBOX.

Отредактировал

До этого пока не доходит.
Пока заметил, что застревает здесь

Код
  /* Wait for software reset */
  while (ETH_GetSoftwareResetStatus() == SET);


Код
void ETH_SoftwareReset(void)
{
  /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
  /* After reset all the registers holds their respective reset values */
  ETH->DMABMR |= ETH_DMABMR_SR;
}


Хотя просто вызов ETH_GetSoftwareResetStatus() зависания не дает.
Rst7
QUOTE
Хотя просто вызов ETH_GetSoftwareResetStatus() зависания не дает.


Не ту функцию запостили. ETH_SoftwareReset вместо ETH_GetSoftwareResetStatus
Acvarif
Цитата(Rst7 @ Jan 5 2012, 17:50) *
Не ту функцию запостили. ETH_SoftwareReset вместо ETH_GetSoftwareResetStatus

Да, виноват.

Здесь виснет
CODE
FlagStatus ETH_GetSoftwareResetStatus(void)
{
FlagStatus bitstatus = RESET;
if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}


И что тут происходит. Нет нормального сброса?
А если пропустить этот ход? Я так понимаю это все пока касается только stm32f217?
Rst7
QUOTE
И что тут происходит. Нет нормального сброса?


Похоже, что нет. Проверяйте, правильно ли сконфигурированы порты - скорее всего, сброс не происходит из-за неприхода тактов 50МГц на RMII.

Проверьте, действительно ли у Вас определен RMII_MODE, а не MII_MODE, и определен ли он вообще.
Acvarif
Цитата(Rst7 @ Jan 5 2012, 18:46) *
Похоже, что нет. Проверяйте, правильно ли сконфигурированы порты - скорее всего, сброс не происходит из-за неприхода тактов 50МГц на RMII.

Проверьте, действительно ли у Вас определен RMII_MODE, а не MII_MODE, и определен ли он вообще.


Понял. Спасибо. Очень похоже, что так.
Я так понимаю из -за этого PHY работать не будет?
Rst7
QUOTE
Я так понимаю из -за этого PHY работать не будет?


Ну пока что у Вас даже MAC-уровень не запустился. Берите интеграл по частям (ЦЭ).
Acvarif
Цитата(Rst7 @ Jan 5 2012, 19:16) *
Ну пока что у Вас даже MAC-уровень не запустился. Берите интеграл по частям (ЦЭ).

Начал все сначала. От обратного. Использую пример web сервера (uIP) от starterkit (жаль, пример запутанный сделан половина на непонятной библиотеке, половина влоб). Как с ним работать, как модифицировать под нужные задачи ни слова ни полслова. На st уже давно новая библиотека. Можно было и демки скорректировать соответствующим образом...Ну да ладно.
Пример работает. MAC DMA инициализируется нормально.
Пытаюсь оттолкнуться от него. Вот инициализация GPIO для Ethernet SK-STM32F217
CODE
RCC->AHB1ENR |= (1<<0) + (1<<1) + (1<<2) + (1<<6); /* Enable GPIOA, GPIOB, GPIOC, GPIOG clock */

/* ETHERNET pins configuration */
/*
| | TYPE | num | GPIO port |
1. TD0 | out | 128 | PG13 |
2. TD1 | out | 129 | PG14 |
3. TEN | out | 70 | PB11 |
4. MC_REFC | out | 100 | PA8 |
5. CRS | in | 43 | PA7 |
6. RD0 | in | 44 | PC4 |
7. RD1 | in | 45 | PC5 |
8. MDC | out | 27 | PC1 |
9. MDIO |in/out| 36 | PA2 |
10.REFC | in | 35 | PA1 |
*/


GPIO_Init(GPIOG,GPIO_Pin_13 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11); /*1. PG13 -> TD0 */
GPIO_Init(GPIOG,GPIO_Pin_14 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11); /*2. PG14 -> TD1 */
GPIO_Init(GPIOB,GPIO_Pin_11 + GPIO_AF + GPIO_Speed_50MHz + GPIO_PP + GPIO_AF11); /*3. PB11 -> TEN */
GPIO_Init(GPIOA,GPIO_Pin_8 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF0 + GPIO_PP); /*4. PA8 -> MCO1 50MHz output */
GPIO_Init(GPIOA,GPIO_Pin_7 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*5. PA7 -> CRS */
GPIO_Init(GPIOC,GPIO_Pin_4 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*6. PC4 -> RD0 */
GPIO_Init(GPIOC,GPIO_Pin_5 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*7. PC5 -> RD1 */
GPIO_Init(GPIOC,GPIO_Pin_1 + GPIO_AF + GPIO_Speed_50MHz + GPIO_PP + GPIO_AF11); /*8. PC1 -> MDC */
GPIO_Init(GPIOA,GPIO_Pin_2 + GPIO_AF + GPIO_Speed_50MHz + GPIO_OD + GPIO_AF11); /*9. PA2 -> MDIO*/
GPIO_Init(GPIOA,GPIO_Pin_1 + GPIO_AF + GPIO_Speed_50MHz + GPIO_AF11); /*10.PA1 -> REFC */


Пытаюсь записать все это в том виде который будет работать в демке STM32F2x7_ETH_LwIP_V1.1.0 где стоит новая библиотека и конечно все к ней привязано
Например как правильно записать
Код
    GPIO_Init(GPIOG,GPIO_Pin_13 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11);    /*1. PG13 -> TD0       */
    GPIO_Init(GPIOG,GPIO_Pin_14 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11);    /*2. PG14 -> TD1     */
для новой библиотеки?

Код
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
Так будет правильно?
Непонятно что такое GPIO_AF11
IgorKossak
Acvarif, научитесь, наконец, оформлять код.
Игнорирование моих комментариев Вам не поможет. Ещё одна моя правка Вашего сообщения и Вам обеспечена неделя read-only.
Acvarif
Цитата(IgorKossak @ Jan 6 2012, 21:30) *
Acvarif, научитесь, наконец, оформлять код.
Игнорирование моих комментариев Вам не поможет. Ещё одна моя правка Вашего сообщения и Вам обеспечена неделя read-only.


Да, помню. Читать мануалы?
Не то, чтобы сильно лень, всегда на это не хватает времени. Да и не всегда там есть, что нужно.
По поводу кода все понял.
Ниже инициализация GPIO для Ethernet sk-stm32f217 под новую библиотеку.
CODE
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE);

/* ETHERNET pins configuration */
/*
| | TYPE | num | GPIO port |
1. TD0 | out | 128 | PG13 |
2. TD1 | out | 129 | PG14 |
3. TEN | out | 70 | PB11 |
4. MC_REFC | out | 100 | PA8 |
5. CRS | in | 43 | PA7 |
6. RD0 | in | 44 | PC4 |
7. RD1 | in | 45 | PC5 |
8. MDC | out | 27 | PC1 |
9. MDIO |in/out| 36 | PA2 |
10.REFC | in | 35 | PA1 |
*/


// GPIO_Init(GPIOG,GPIO_Pin_13 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11); /*1. PG13 -> TD0 */
// GPIO_Init(GPIOG,GPIO_Pin_14 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11); /*2. PG14 -> TD1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH);

// GPIO_Init(GPIOB,GPIO_Pin_11 + GPIO_AF + GPIO_Speed_50MHz + GPIO_PP + GPIO_AF11); /*3. PB11 -> TEN */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);

// GPIO_Init(GPIOA,GPIO_Pin_8 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF0 + GPIO_PP); /*4. PA8 -> MCO1 50MHz output */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);

// GPIO_Init(GPIOA,GPIO_Pin_7 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*5. PA7 -> CRS */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

// GPIO_Init(GPIOC,GPIO_Pin_4 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*6. PC4 -> RD0 */
// GPIO_Init(GPIOC,GPIO_Pin_5 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*7. PC5 -> RD1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_ETH);

// GPIO_Init(GPIOC,GPIO_Pin_1 + GPIO_AF + GPIO_Speed_50MHz + GPIO_PP + GPIO_AF11); /*8. PC1 -> MDC */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_ETH);

// GPIO_Init(GPIOA,GPIO_Pin_2 + GPIO_AF + GPIO_Speed_50MHz + GPIO_OD + GPIO_AF11); /*9. PA2 -> MDIO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_ETH);

// GPIO_Init(GPIOA,GPIO_Pin_1 + GPIO_AF + GPIO_Speed_50MHz + GPIO_AF11); /*10.PA1 -> REFC */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_ETH);

А здесь конфигурация RCC и SYSCFG для Ethernet stm32 платки Startekit
CODE
// Enable SYSCFG clock

// RCC->APB2ENR |= (1 << 14);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

#ifdef RMII_MODE
// SYSCFG->PMC |= (1<<23);
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#else
// SYSCFG->PMC &= (~(1 << 23));
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#endif

// SYSCFG->CMPCR |= (1 << 0);
SYSCFG_CompensationCellCmd(ENABLE);
/*
RCC AHB1 peripheral clock register (RCC_AHB1ENR)
Bit 25 ETHMACEN: Ethernet MAC clock enable
Bit 26 ETHMACTXEN: Ethernet Transmission clock enable
Bit 27 ETHMACRXEN: Ethernet Reception clock enable
*/
// RCC->AHB2ENR |= (1 << 5);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_HASH, ENABLE);
// RCC->AHB1ENR |= (1 << 25) + (1 << 26) + (1 << 27) + (1 << 12);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_CRC, ENABLE);

Надеюсь теперь MAC запустится
Acvarif
Цитата(Acvarif @ Jan 7 2012, 00:30) *
Надеюсь теперь MAC запустится


Дрова. MAC не запускается.
Застревает на
Код
  /* Wait for software reset */
  while (ETH_GetSoftwareResetStatus() == SET);

Не пойму, что с ним не так.
Инициализацию RCC GPIO повторил один к одному от рабочей демки. В ней все впорядке.

Хотя нет. Ошибка в инициализации GPIO.
CODE
/* GPIOB Periph clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Configure PB8 PB9 output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// RCC->AHB1ENR |= (1<<0) + (1<<1) + (1<<2) + (1<<6); /* Enable GPIOA, GPIOB, GPIOC, GPIOG clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE);

/* ETHERNET pins configuration */
/*
| | TYPE | num | GPIO port |
1. TD0 | out | 128 | PG13 |
2. TD1 | out | 129 | PG14 |
3. TEN | out | 70 | PB11 |
4. MC_REFC | out | 100 | PA8 |
5. CRS | in | 43 | PA7 |
6. RD0 | in | 44 | PC4 |
7. RD1 | in | 45 | PC5 |
8. MDC | out | 27 | PC1 |
9. MDIO |in/out| 36 | PA2 |
10.REFC | in | 35 | PA1 |
*/


// GPIO_Init(GPIOG,GPIO_Pin_13 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11); /*1. PG13 -> TD0 */
// GPIO_Init(GPIOG,GPIO_Pin_14 + GPIO_AF + GPIO_Speed_100MHz + GPIO_PP + GPIO_AF11); /*2. PG14 -> TD1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH);

// GPIO_Init(GPIOB,GPIO_Pin_11 + GPIO_AF + GPIO_Speed_50MHz + GPIO_PP + GPIO_AF11); /*3. PB11 -> TEN */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);

// GPIO_Init(GPIOA,GPIO_Pin_8 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF0 + GPIO_PP); /*4. PA8 -> MCO1 50MHz output */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);

// GPIO_Init(GPIOA,GPIO_Pin_7 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*5. PA7 -> CRS */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

// GPIO_Init(GPIOC,GPIO_Pin_4 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*6. PC4 -> RD0 */
// GPIO_Init(GPIOC,GPIO_Pin_5 + GPIO_AF + GPIO_Speed_100MHz + GPIO_AF11); /*7. PC5 -> RD1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

// GPIO_Init(GPIOC,GPIO_Pin_1 + GPIO_AF + GPIO_Speed_50MHz + GPIO_PP + GPIO_AF11); /*8. PC1 -> MDC */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);

// GPIO_Init(GPIOA,GPIO_Pin_2 + GPIO_AF + GPIO_Speed_50MHz + GPIO_OD + GPIO_AF11); /*9. PA2 -> MDIO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);

// GPIO_Init(GPIOA,GPIO_Pin_1 + GPIO_AF + GPIO_Speed_50MHz + GPIO_AF11); /*10.PA1 -> REFC */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);

MAC запустился.
Чего теперь дальше делать?
Попробую заполнить нужные регистры MAC DMA тем, что предлагает демка от st - STM32F2x7_ETH_LwIP_V1.1.0
Заполнил, все запустилось. UDP эхо сервер заработал. Проверить можно этим http://www.hw-group.com/products/hercules/index_en.html указав порты 7 и 7
Кому интересно, вот архив http://depositfiles.com/files/n8um50ax4 (большой ~ 10 метров)
Теперь появилось несколько вопросов.
1. Как назнячить явный IP этому серверу? (он похоже по DHCP сам себе хозяин)
2. Как сделать так, чтобы он откликался при любом локальном порте?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.