新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2017-1-5
- 在线时间
- 7 小时
|
本帖最后由 tzzzzi 于 2022-1-12 13:51 编辑
前提:使用阿波罗底板初始化LAN8720A没问题;自己按照正点原子原理图做了一块系统板(带网口,带内存);LAN8720A使用的是IO引脚复位(使用PB10)。
1)使用正点原子的程序调试网口程序时调不通;
int32_t LAN8720_Init(void)
{
......
INTX_DISABLE(); //关闭所有中断,复位过程不能被打断!
//PCF8574_WriteBit(ETH_RESET_IO,1); //硬件复位
//改成自定义IO口复位
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
delay_ms(100);
//PCF8574_WriteBit(ETH_RESET_IO,0); //复位结束
//改成自定义IO口复位
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
delay_ms(100);
INTX_ENABLE(); //开启所有中断
......
HAL_ETH_Init(&LAN8720_ETHHandle); //初始化ETH
......
}
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_ETH1MAC_CLK_ENABLE(); //使能ETH1 MAC时钟
__HAL_RCC_ETH1TX_CLK_ENABLE(); //使能ETH1发送时钟
__HAL_RCC_ETH1RX_CLK_ENABLE(); //使能ETH1接收时钟
//在网口IO中初始化复位脚
GPIO_Initure.Pin=GPIO_PIN_10;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
......
}
这样的思路看起来没毛病;但程序就是调不通。其实这是因为PB10还未初始化就被使用的原因;
正确的做法是:
int32_t LAN8720_Init(void)
{
GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_10;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
......
INTX_DISABLE(); //关闭所有中断,复位过程不能被打断!
//PCF8574_WriteBit(ETH_RESET_IO,1); //硬件复位
//改成自定义IO口复位
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
delay_ms(100);
//PCF8574_WriteBit(ETH_RESET_IO,0); //复位结束
//改成自定义IO口复位
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
delay_ms(100);
INTX_ENABLE(); //开启所有中断
......
HAL_ETH_Init(&LAN8720_ETHHandle); //初始化ETH
......
}
|
|