OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7262|回复: 7

以太网串行管理接口GPIO模拟MDIO时序,不回数据

[复制链接]

2

主题

32

帖子

0

精华

高级会员

Rank: 4

积分
873
金钱
873
注册时间
2018-2-9
在线时间
76 小时
发表于 2018-3-8 18:33:44 | 显示全部楼层 |阅读模式
1金钱
下面是我的代码。delay和串口没有放上去。串口是可以正常通的
[mw_shl_code=c,true]#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ü&#189;&#197;&#197;&#228;&#214;&#195;
* 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;   //í&#198;íêê&#228;3&#246;
  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    : &#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
* 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;//à-μíê±&#214;ó
        delay_us(1);
        MDC = 1;  //é&#207;éy&#209;&#216;′&#171;ê&#228;êy&#190;Y
        delay_us(1);
        if(READ_MDIO)
                                        {receive |= 0x01;} //é&#207;éy&#209;&#216;&#184;&#223;μ&#231;&#198;&#189;&#198;ú&#188;&#228;&#182;áè&#161;êy&#190;Y
        //delay_us(1);
                                MDC = 0;//
    }
    return receive;
}


/*****************************************************************
*        Function Name  : SMI_Read_2Bit
* Description    : &#182;áè&#161;á&#189;&#184;&#246;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;//à-μíê±&#214;ó
        delay_us(1);
        MDC = 1;  //é&#207;éy&#209;&#216;′&#171;ê&#228;êy&#190;Y
        delay_us(1);
        if(READ_MDIO)
                                        {receive |= 0x01;} //é&#207;éy&#209;&#216;&#184;&#223;μ&#231;&#198;&#189;&#198;ú&#188;&#228;&#182;áêy&#190;Y
                                MDC = 0;//&#187;&#214;&#184;′μíμ&#231;&#198;&#189;
    }
    return receive;
}


/*****************************************************************
*        Function Name  : SMI_Write_One_Byte
* Description    : D′è&#235;ò&#187;&#184;&#246;×&#214;&#189;ú
* param          : òaD′è&#235;μ&#196;êy&#190;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′è&#235;á&#189;&#184;&#246;Bit
* param          : òaD′è&#235;μ&#196;êy&#190;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′è&#235;ò&#187;&#184;&#246;êy&#190;Y&#214;&#161;
* PHYAddress     : PHYμ&#196;μ&#216;&#214;·
* RHYReg         : PHYμ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
* PHYValue                         : òaD′è&#235;&#188;&#196;′&#230;&#198;÷μ&#196;êy&#190;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();//&#187;&#214;&#184;′&#184;&#223;×è
}


/*****************************************************************
*        Function Name  : SMI_read_Reg
* Description    : &#182;áè&#161;êy&#190;Yμ&#196;ò&#187;&#184;&#246;&#188;&#196;′&#230;&#198;÷
* PHYAddress     : PHYD&#190;&#198;&#172;μ&#196;μ&#216;&#214;·
* RHYReg         : PHYμ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
* 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    : &#187;&#241;è&#161;ò&#187;&#184;&#246;&#188;&#196;′&#230;&#198;÷μ&#196;&#214;μ
* port                             : &#214;&#184;&#182;¨PHY&#182;&#203;&#191;úo&#197;
* PHYAddress     : &#214;&#184;&#182;¨&#188;&#196;′&#230;&#198;÷μ&#196;±êo&#197;
* Return         : ·μ&#187;&#216;&#187;&#241;è&#161;μ&#189;μ&#196;êy&#190;Y16&#206;&#187;
* 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    : &#189;&#171;&#187;&#241;è&#161;μ&#189;μ&#196;&#188;&#196;′&#230;&#198;÷&#214;μ·¢&#203;íμ&#189;′&#174;&#191;ú
* 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    : &#214;÷oˉêy
* Attention                          : 0
******************************************************************/
int main(void)
{               
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        uart_init(115200);         //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
        Mdio_Init();
        while(1)
        {
                        Print_Reg_Value();
                }
        return 0;
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

顶一下!账号就是QQ,可以私信
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

32

帖子

0

精华

高级会员

Rank: 4

积分
873
金钱
873
注册时间
2018-2-9
在线时间
76 小时
 楼主| 发表于 2018-3-8 18:33:45 | 显示全部楼层
顶一下!账号就是QQ,可以私信
回复

使用道具 举报

2

主题

32

帖子

0

精华

高级会员

Rank: 4

积分
873
金钱
873
注册时间
2018-2-9
在线时间
76 小时
 楼主| 发表于 2018-3-9 10:18:48 | 显示全部楼层
用的芯片是F103C8T6,求大神帮忙啊。我只是个新手而已,已经纠结了两个星期了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-3-10 01:06:29 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-8-28
在线时间
76 小时
发表于 2020-5-19 10:52:32 | 显示全部楼层
你好,请问你问题解决了没?
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-5-13
在线时间
5 小时
发表于 2020-6-8 18:21:25 | 显示全部楼层

RE: FPGA开拓者以太网串行管理接口GPIO模拟MDIO时序,不回数据

Brian0502 发表于 2020-5-19 10:52
你好,请问你问题解决了没?

还没解决,晚上再试试
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-5-13
在线时间
5 小时
发表于 2020-6-8 18:22:30 | 显示全部楼层
谢谢,但我用的是FPGA开拓者,需要Verilog调试代码
回复

使用道具 举报

3

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-8-28
在线时间
76 小时
发表于 2020-7-21 11:00:16 | 显示全部楼层
风起时,想你 发表于 2020-6-8 18:21
还没解决,晚上再试试

我的解决了。移植的GD32的mdio程序。对应的PHY芯片需要先读取一下,否则通信异常。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 14:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表