我使用STM32CubeMX和Atollic TrueStudio,使用KSZ8851SNL以太网控制器创建了一个项目。
在STM32H742上,我有一个Micrel KSZ8851SNL的驱动程序,并创建了一个微型TCP / IP堆栈来测试该芯片。我的工作效果很好,但目前它仅支持ARP,UDP和ICMP。我可以在两个方向上ping通,在两个方向上处理ARP请求,并从Internet请求NTP时间。 现在,我想让它与LwIP一起使用。 我知道它需要在文件ethernetif.c中实现。 基本上,我使用这些功能来使微设置起作用:
// Initializes the KSZ8851SNL
uint8_t ksz8851_init(void)
// Send a packet, returns length of received package
// The received length can be checked if we received a packet
uint16_t ksz8851_Receive(uint8_t *pRXData, uint16_t pRXMaxLength)
// Receive a packet
void ksz8851_Send(uint8_t *pTXData, uint16_t pTXLength)
该项目是Atollic TrueStudio项目,我使用HAL。
以上功能对于LwIP是否足够? 如何在LwIP中实现此功能? 我读了很多文档,但是这部分似乎没有详述。
来源在hithub上: https://github.com/bkht/STM32H7_HAL_KSZ8851SNL
非常感谢您的帮助!
答案 0 :(得分:0)
除取消注释// MX_LWIP_Init();
之外的另一件事。
我也有一个STM32H743 Nucleo-144,并尝试运行它(提交号f8ff06c2c17f3d6dacbff8c2fd8eb95591a0c224
)。但是,由于无法读取ksz8851_reg_read()
的芯片ID,它陷入了以下循环:https://github.com/bkht/STM32H7_HAL_KSZ8851SNL/blob/master/Drivers/KSZ8851SNL/Src/KSZ8851SNL.c#L443-L506。然后,我深入研究源代码,这是一个可能的解决方案:
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// RESET_SPI_CS_PIN();
和// SET_SPI_CS_PIN();
)然后,将获取正确的芯片ID。
克莱门特