天线|RF射频
直播中

臧超楠

7年用户 190经验值
私信 关注
[问答]

以太网串行管理接口GPIO模拟MDIO时序不回数据该怎么办?

下面是我的代码。delay和串口没有放上去。串口是可以正常通的
[C] 纯文本查看 复制代码
#include "me_dio.h"  #define MDIO_IN()  {GPIOA->CRH &= ~(15<<16);GPIOA->CRH |= 8<<16;GPIOA->ODR |= 1<<12;}#define MDIO_OUT() {GPIOA->CRH &= ~(15<<16);GPIOA->CRH |= 3<<16;}#define MDIO    PAout(12) //SCL#define MDC     PAout(11) //SDA   #define READ_MDIO  PAin(12) //SDA /******************************************************************************** Function Name  : Mdio_Init* Description    : 1ü½ÅÅäÖÃ* Param  : None* Attention : None*******************************************************************************/void Mdio_Init(void){GPIO_InitTypeDef GPIO_InitStructure;  /* Configure Mdio pins: PA11 -> MDC and PA12 -> MDIO */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //íÆíêêä3ö  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  GPIO_Init(GPIOA, &GPIO_InitStructure);MDIO = 1;MDC = 0;}/******************************************************************************** Function Name  : SMI_Read_One_Byte* Description    : ¶áè¡ò»¸ö×Ö½ú* param          : None* Return         : None* Attention   : None*******************************************************************************/u8 SMI_Read_One_Byte(void){    u8 i, receive=0;//    MDIO_IN();    for(i = 0; i < 8; i++)    {        receive<<=1;        MDC = 0;//à-μíê±Öó        delay_us(1);        MDC = 1;  //éÏéyÑØ′«êäêy¾Y        delay_us(1);        if(READ_MDIO) {receive |= 0x01;} //éÏéyÑظßμçƽÆú¼ä¶áè¡êy¾Y        //delay_us(1);MDC = 0;//    }    return receive;}/******************************************************************Function Name  : SMI_Read_2Bit* Description    : ¶áè¡á½¸öbit* param          : None* Return         : None* Attention : None******************************************************************/u8 SMI_Read_2Bit(void){    u8 i, receive=0;    for(i = 0; i < 2; i++)    {        receive<<=1;        MDC = 0;//à-μíê±Öó        delay_us(1);        MDC = 1;  //éÏéyÑØ′«êäêy¾Y        delay_us(1);        if(READ_MDIO) {receive |= 0x01;} //éÏéyÑظßμçƽÆú¼ä¶áêy¾YMDC = 0;//»Ö¸′μíμçƽ    }    return receive;}/******************************************************************Function Name  : SMI_Write_One_Byte* Description    : D′èëò»¸ö×Ö½ú* param          : òaD′èëμÄêy¾Y* Return         : None* Attention : None******************************************************************/void SMI_Write_One_Byte(u8 data){    u8 i;    for(i = 0; i < 8; i++)    {        MDC = 0;        MDIO = ((data&0x80)>>7);        delay_us(1);        MDC = 1;          delay_us(1);         MDC = 0;        data<<=1;    }} /******************************************************************Function Name  : SMI_Write_2Bit* Description    : D′èëὸöBit* param          : òaD′èëμÄêy¾Y* Return         : None* Attention : None******************************************************************/void SMI_Write_2Bit(u8 data){    u8 i;    MDIO_OUT();    for(i = 0; i < 2; i++)    {        MDC = 0;        MDIO = (data&0x2)>>1;        delay_us(1);        MDC = 1;              delay_us(1);         MDC = 0;        data<<=1;    }}#define START_OF_FRAME_2bit 0x01#define READ_OP_CODE_2bit 0x02#define WRITE_OP_CODE_2bit 0x01#define SMI_OP_CODE_2bit 0x00#define SMI_TA 0x02/******************************************************************Function Name  : SMI_Write_Frame* Description    : D′èëò»¸öêy¾YÖ¡* PHYAddress     : PHYμÄμØÖ· * RHYReg         : PHYμļÄ′æÆ÷μØÖ·* PHYValue : òaD′èë¼Ä′æÆ÷μÄêy¾Y* Attention  : None******************************************************************/void SMI_Write_Frame(u16 PHYAddress, u16 PHYReg, u16 PHYValue){    u8 addr;         addr = (PHYAddress & 0xFF) <<3 | (PHYReg & 0xFF)>>5;     MDIO_OUT();      ////32 bit Preamble    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);     SMI_Write_2Bit(START_OF_FRAME_2bit);    SMI_Write_2Bit(WRITE_OP_CODE_2bit);    SMI_Write_One_Byte(addr);SMI_Write_2Bit(PHYReg & 0x03);    SMI_Write_2Bit(SMI_TA);SMI_Write_One_Byte(0xFF);SMI_Write_One_Byte(PHYValue);    MDIO_IN();//»Ö¸′¸ß×è}/******************************************************************Function Name  : SMI_read_Reg* Description    : ¶áè¡êy¾YμÄò»¸ö¼Ä′æÆ÷* PHYAddress     : PHYD¾Æ¬μÄμØÖ· * RHYReg         : PHYμļÄ′æÆ÷μØÖ·* Attention  : None******************************************************************/u16 SMI_Read_Reg(u16 PHYAddress, u16 PHYReg){    u8 addr;    u16 data;         addr = ((PHYAddress & 0xFF)<<3) | ((PHYReg & 0xFF)>>5);        ////32 bit Preamble    MDIO_OUT();    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);    SMI_Write_One_Byte(0xFF);     SMI_Write_2Bit(START_OF_FRAME_2bit);    SMI_Write_2Bit(READ_OP_CODE_2bit);    SMI_Write_One_Byte(addr);SMI_Write_2Bit(PHYReg & 0x03);          MDIO_IN();    data = SMI_Read_2Bit();//SMI_TA should be Z0    data = SMI_Read_One_Byte();    data = data << 8;    data = data | SMI_Read_One_Byte();    return data;}/****************************************************************** Function Name  : Get_Reg_Value*Description    : »ñè¡ò»¸ö¼Ä′æÆ÷μÄÖμ* port     : Ö¸¶¨PHY¶Ë¿úoÅ* PHYAddress     : Ö¸¶¨¼Ä′æÆ÷μıêoÅ * Return         : ·μ»Ø»ñè¡μ½μÄêy¾Y16λ* Attention  : None******************************************************************/u16 Get_Reg_Value(u8 port, u8 reg_num){    u16 reg;    reg = SMI_Read_Reg(port, reg_num);     return reg;} /******************************************************************Function Name  : Print_Reg_Value* Description    : ½«»ñè¡μ½μļÄ′æÆ÷Öμ·¢Ëíμ½′®¿ú* Attention  : None******************************************************************/void Print_Reg_Value(void){u16 send_data;    u8 i,port;    for(port = 0; port < 31; port++){        for(i = 0; i < 31; i++){            send_data = Get_Reg_Value(port, 0);USART_SendData(USART2, send_data);delay_ms(10);USART_SendData(USART2, port);            delay_ms(10);USART_SendData(USART2, i);            delay_ms(10);        }    }}/******************************************************************Function Name  : main* Description    : Ö÷oˉêy* Attention  : 0******************************************************************/int main(void) {delay_init();     //Ñóê±oˉêy3õê¼»ˉ  uart_init(115200); //′®¿ú3õê¼»ˉÎa115200Mdio_Init(); while(1){Print_Reg_Value();}return 0; }

回帖(3)

全娟

2019-9-9 08:28:42
顶一下!账号就是QQ,可以私信
举报

李博

2019-9-9 08:34:45
用的芯片是F103C8T6,求大神帮忙啊。我只是个新手而已,已经纠结了两个星期了
举报

李裕伦

2019-9-9 08:47:43
帮顶
举报

更多回帖

发帖
×
20
完善资料,
赚取积分