#include "stm32f4xx.h"\n\n#define MDC_PIN GPIO_Pin_2\n#define MDIO_PIN GPIO_Pin_3\n\n#define MDC_PORT GPIOB\n#define MDIO_PORT GPIOB\n\nvoid SMI_Init(void)\n{\n GPIO_InitTypeDef GPIO_InitStructure;\n\n // Enable GPIO clock\n RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);\n\n // Configure MDC pin as output\n GPIO_InitStructure.GPIO_Pin = MDC_PIN;\n GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\n GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\n GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\n GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\n GPIO_Init(MDC_PORT, &GPIO_InitStructure);\n\n // Configure MDIO pin as input\n GPIO_InitStructure.GPIO_Pin = MDIO_PIN;\n GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\n GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\n GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\n GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;\n GPIO_Init(MDIO_PORT, &GPIO_InitStructure);\n}\n\nvoid SMI_Delay(uint32_t delay)\n{\n while (delay--)\n ;\n}\n\nvoid SMI_Start(void)\n{\n GPIO_SetBits(MDC_PORT, MDC_PIN);\n SMI_Delay(10);\n GPIO_ResetBits(MDC_PORT, MDC_PIN);\n SMI_Delay(10);\n}\n\nvoid SMI_WriteBit(uint8_t bit)\n{\n if (bit)\n {\n GPIO_SetBits(MDIO_PORT, MDIO_PIN);\n }\n else\n {\n GPIO_ResetBits(MDIO_PORT, MDIO_PIN);\n }\n\n GPIO_SetBits(MDC_PORT, MDC_PIN);\n SMI_Delay(10);\n GPIO_ResetBits(MDC_PORT, MDC_PIN);\n SMI_Delay(10);\n}\n\nuint8_t SMI_ReadBit(void)\n{\n GPIO_SetBits(MDC_PORT, MDC_PIN);\n SMI_Delay(10);\n uint8_t bit = GPIO_ReadInputDataBit(MDIO_PORT, MDIO_PIN);\n GPIO_ResetBits(MDC_PORT, MDC_PIN);\n SMI_Delay(10);\n return bit;\n}\n\nvoid SMI_Write(uint8_t data, uint8_t len)\n{\n for (int i = len - 1; i >= 0; i--)\n {\n uint8_t bit = (data >> i) & 0x01;\n SMI_WriteBit(bit);\n }\n}\n\nuint8_t SMI_Read(void)\n{\n uint8_t data = 0;\n for (int i = 7; i >= 0; i--)\n {\n data |= (SMI_ReadBit() << i);\n }\n return data;\n}\n\nint main(void)\n{\n SMI_Init();\n\n // Example: Read PHY ID\n SMI_Start();\n SMI_Write(0x01, 5); // PHY Address\n SMI_Write(0x02, 5); // Register Address\n uint16_t phyId = (SMI_Read() << 10) | (SMI_Read() << 4) | (SMI_Read() >> 2);\n SMI_Delay(100);\n SMI_Start();\n SMI_Write(0x00, 5); // PHY Address\n SMI_Write(0x00, 5); // Register Address\n uint16_t phyStatus = (SMI_Read() << 8) | SMI_Read();\n SMI_Delay(100);\n return 0;\n}\n

STM32 GPIO 模拟 SMI (MDC/MDIO) 协议代码实现 - 详细教程和示例

原文地址: https://www.cveoy.top/t/topic/qeOS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录