if (__HAL_ETH_DMA_GET_FLAG(&heth, ETH_DMA_FLAG_R) != RESET) { __HAL_ETH_DMA_CLEAR_FLAG(&heth, ETH_DMA_FLAG_R); while (HAL_ETH_GetReceivedFrame(&heth) == HAL_OK) ethernetif_input(&netif_dp83848); }
时间: 2023-12-06 08:03:14 浏览: 44
这段代码是一个用于处理DP83848网口芯片接收数据的中断处理函数。具体的处理逻辑如下:
首先通过__HAL_ETH_DMA_GET_FLAG()函数判断是否接收到了数据,如果没有接收到数据则直接退出函数。如果接收到了数据,则通过__HAL_ETH_DMA_CLEAR_FLAG()函数清除接收数据标志位,并通过HAL_ETH_GetReceivedFrame()函数获取接收到的数据包。接着通过ethernetif_input()函数对接收到的数据包进行处理,将数据包传递给网络协议栈进行进一步的处理。
总的来说,这段代码的作用是检测DP83848网口芯片的接收数据中断状态,接收到数据后将数据包传递给网络协议栈进行处理,保证网络连接的正常工作。
相关问题
if (DP83848_GetITStatus()) { HAL_ETH_ReadPHYRegister(&heth, PHY_MISR, &status); printf("DP83848 interrupt occurred! status=%#x\n", status); if (status & PHY_LINK_INTERRUPT) { // 这里必须要多读几次 HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &value); HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &value); if (value & PHY_LINKED_STATUS) { if (!netif_is_link_up(&netif_dp83848)) { printf("Link is up!\n"); DP83848_Restart(); netif_set_link_up(&netif_dp83848); } } else { printf("Link is down!\n"); DP83848_Stop(); netif_set_link_down(&netif_dp83848); } } }
这段代码是一个DP83848网口芯片的中断处理函数,具体的处理逻辑如下:
首先通过DP83848_GetITStatus()函数判断是否发生了中断,如果没有中断则直接退出函数。如果发生了中断,则通过HAL_ETH_ReadPHYRegister()函数读取PHY_MISR寄存器中的中断状态,并将状态信息打印出来。然后判断是否是PHY_LINK_INTERRUPT中断,如果是则通过HAL_ETH_ReadPHYRegister()函数读取PHY_BSR寄存器中的状态信息,并进行多次读取以确保读取到正确的值。接着判断PHY_LINKED_STATUS位是否为1,如果是则说明网络连接已经建立,此时需要将网络接口状态设置为链接状态,并通过DP83848_Restart()函数重新启动网口芯片。如果PHY_LINKED_STATUS位为0,则说明网络连接已经断开,此时需要将网络接口状态设置为断开状态,并通过DP83848_Stop()函数停止网口芯片的工作。
总的来说,这段代码的作用是检测DP83848网口芯片的中断状态,根据不同的中断类型进行相应的处理操作,保证网络连接的正常工作。
STM32初始化配置LAN8710
要初始化配置LAN8710,需要按照以下步骤进行:
1. 配置GPIO引脚:将LAN8710的MDIO和MDC引脚连接到STM32的GPIO引脚上,并将引脚设置为复用模式。
2. 配置时钟:配置STM32的时钟以确保其与LAN8710通信的时钟频率正确。
3. 配置ETH MAC:使用STM32的ETH MAC驱动程序将其配置为LAN8710的MAC地址。
4. 配置PHY:使用STM32的ETH PHY驱动程序将其配置为正确的PHY类型和速率。
5. 初始化ETH:使用STM32的ETH驱动程序初始化ETH控制器。
6. 启动ETH:启动ETH控制器以开始与LAN8710进行通信。
以下是一个示例代码片段,可以帮助你更好地理解如何初始化配置LAN8710:
```
/* Configure GPIO pins */
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure clock */
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ETH;
PeriphClkInitStruct.EthClockSelection = RCC_ETHCLKSOURCE_PLLSAI1;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
/* Configure ETH MAC */
ETH_MACAddressConfigTypeDef MAC_InitStruct;
MAC_InitStruct.PhyAddress = 0;
MAC_InitStruct.MACAddr = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
MAC_InitStruct.AddressFilter = ETH_ADDRESS_FILTER_NORMAL;
MAC_InitStruct.WakeUpFilter = ETH_WAKEUP_FILTER_DISABLE;
MAC_InitStruct.PassControlFrames = ETH_PASSCONTROLFRAMES_BLOCKALL;
HAL_ETH_ConfigMAC(&heth, &MAC_InitStruct);
/* Configure PHY */
ETH_MACConfigTypeDef MACConf;
MACConf.AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE;
MACConf.BackOffLimit = ETH_BACKOFFLIMIT_10;
MACConf.CRCCheckingRxPacket = ETH_CHECKSUM_RX_ALL;
MACConf.CRCPadChecking = ETH_CRCPAD_CHECKSUM_DISABLE;
MACConf.CollisionWindow = ETH_COLLISION_WINDOW_28;
MACConf.DuplexMode = ETH_MODE_FULLDUPLEX;
MACConf.InterFrameGap = ETH_INTERFRAME_GAP_96BIT;
MACConf.JumboFrame = ETH_JUMBOFRAME_DISABLE;
MACConf.LoopbackMode = ETH_LOOPBACKMODE_DISABLE;
MACConf.ReceiveAll = ETH_RECEIVE_ALL;
MACConf.ReceiveBroadcast = ETH_RECEIVE_BROADCAST;
MACConf.ReceiveOwn = ETH_RECEIVE_OWN;
MACConf.ReceiveThresholdControl = ETH_RTHRESH_64BYTES;
MACConf.RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE;
MACConf.Speed = ETH_SPEED_100M;
MACConf.Watchdog = ETH_WATCHDOG_DISABLE;
HAL_ETH_ConfigMACDMA(&heth, &MACConf);
/* Initialize ETH */
HAL_ETH_Init(&heth);
/* Start ETH */
HAL_ETH_Start(&heth);
```
请注意,上述代码片段是基于STM32 Cube HAL库的,因此你需要将其适当修改以匹配你的开发板和库版本。