打印
[其他ST产品]

以太网初始化代码

[复制链接]
447|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t60yz|  楼主 | 2024-6-29 00:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32h7xx_hal.h"
#include "lwip.h"

ETH_HandleTypeDef heth;
ETH_TxPacketConfig TxConfig;

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ETH_Init(void);
void Error_Handler(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ETH_Init();

    while (1)
    {
        // 用户代码
    }
}

void MX_ETH_Init(void)
{
    heth.Instance = ETH;
    heth.Init.MACAddr = macaddress;
    heth.Init.MediaInterface = HAL_ETH_RMII_MODE;
    heth.Init.RxMode = ETH_RXPOLLING_MODE;
    heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
    heth.Init.PhyAddress = DP83848_PHY_ADDRESS;

    if (HAL_ETH_Init(&heth) != HAL_OK)
    {
        Error_Handler();
    }

    memset(&TxConfig, 0, sizeof(ETH_TxPacketConfig));
    TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
    TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
    TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
}


使用特权

评论回复
沙发
t60yz|  楼主 | 2024-6-29 00:51 | 只看该作者
调试和常见问题排查
PHY通信:确保STM32能够通过MDIO和MDC与PHY进行通信。使用HAL_ETH_ReadPHYRegister和HAL_ETH_WritePHYRegister函数检查PHY寄存器。
PHY地址:确保在初始化中使用正确的PHY地址。
链路状态:检查PHY的链路状态寄存器,确保物理连接正常。
中断和事件处理:确保正确处理以太网中断和事件。

使用特权

评论回复
板凳
4y1b3| | 2024-6-30 19:45 | 只看该作者
使用MDIO和MDC与PHY进行通信,读取和写入PHY寄存器,确保通信正常。可以使用以下函数:

c

uint32_t phy_reg;

if (HAL_ETH_ReadPHYRegister(&heth, PHY_REG, &phy_reg) != HAL_OK) {
    // 读取PHY寄存器失败
    Error_Handler();
}

if (HAL_ETH_WritePHYRegister(&heth, PHY_REG, phy_reg) != HAL_OK) {
    // 写入PHY寄存器失败
    Error_Handler();
}


使用特权

评论回复
地板
4y1b3| | 2024-6-30 19:45 | 只看该作者
检查PHY地址
确保在初始化中使用了正确的PHY地址。可以通过测试读取特定的PHY寄存器来确认:
#define DP83848_PHY_ADDRESS 0x01  // 替换为实际的PHY地址

heth.Init.PhyAddress = DP83848_PHY_ADDRESS;


使用特权

评论回复
5
4y1b3| | 2024-6-30 19:45 | 只看该作者
检查链路状态
读取PHY的链路状态寄存器,确保物理连接正常:

c
#define PHY_BSR 0x01  // 基本状态寄存器

uint32_t phy_status;
if (HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &phy_status) == HAL_OK) {
    if (phy_status & (1 << 2)) {
        // 链路正常
    } else {
        // 链路断开
    }
}


使用特权

评论回复
6
4y1b3| | 2024-6-30 19:45 | 只看该作者
处理以太网中断和事件
确保正确处理以太网中断和事件,可以在中断处理程序中调用HAL库函数:

c
void ETH_IRQHandler(void)
{
    HAL_ETH_IRQHandler(&heth);
}

void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
{
    // 处理接收完成的帧
}

void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
{
    // 处理发送完成的帧
}


使用特权

评论回复
7
4y1b3| | 2024-6-30 19:46 | 只看该作者
检查引脚配置
确保与以太网相关的引脚(如MDIO、MDC、RX、TX等)配置正确:

c
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // Enable GPIO clocks
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();

    // Configure Ethernet pins
    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;  // 替换为实际引脚
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 其他引脚的配置...
}


使用特权

评论回复
8
suncat0504| | 2024-6-30 22:26 | 只看该作者
高端!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

954

帖子

0

粉丝