OpenEdv-开源电子网

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

原为LAN8742,现修改为DP83848C的一点小总结

[复制链接]

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2020-12-3 15:45:08 | 显示全部楼层 |阅读模式
当前开发硬件软件为STM32H743ZIT6 + ucosii + LWIP协议栈 + (LAN8742 改 DP83848C)
原先的LAN8742条件下,项目程序是通常的,具体调试时在原子哥的客户端程序里边少许修改后根据自己项目需求增加东西后完成的;
由于工艺问题,后续选择修改为DP83848C,在修改期间,偶然发现应该把过程与大家分享下,因此后续回忆记录一下:
一.硬件方面对于
1.LAN8742本身有REFCLKO(也就是14脚),其接的是CPU的PA.1。对于DP83848C而言,本身没有没有对外的这个引脚,因此CPU此时的PA.1只能接外部有源晶振上。
也就是说,对于DP83848C外部时钟连接上,有源晶振输出端除了接DP83848C的X1外,还需要接到CPU的PA.1上。但是为了保护作用和后续调试方便,需要在去PA.1的线上串一个小电阻,22欧牧,10欧牧都可以。
2.MDIO切记上拉一个电阻,手册上推荐为1.5K;
3.其余硬件连接绝相似,无需特殊提明;
二.软件方面对于
1.对于我们常用到的基本控制寄存器和基本状态寄存器的每一位含义都是一样的;但是两种器件的扩展寄存器的含义是不一样的。
使用的时候,其实我们只暂时用到了基本寄存器,所以其余的扩展寄存器也暂时不看了,感兴趣自己详细查看每一个寄存器每一位的含义;
2.操作步骤按顺序进行:
首先在开机就将CPU接PHY的NRST引脚初始化,然后INIT PHY芯片的函数内容为:
1>先拉低复位脚,等待50-100ms再拉高;
2>配置MPU保护,这一步只有M7内核才有的,如果是其他的ST芯片,这一步可省略;
3>进行PHY句柄的初始化前定义参数,分别为
    PHY_ETHHandle.Instance=ETH;                                              //ETH
    PHY_ETHHandle.Init.MACAddr=macaddress;                            //mac地址
    PHY_ETHHandle.Init.MediaInterface=HAL_ETH_RMII_MODE;    //RMII接口
    PHY_ETHHandle.Init.RxDesc=DMARxDscrTab;                         //发送描述符
    PHY_ETHHandle.Init.TxDesc=DMATxDscrTab;                         //接收描述如
    PHY_ETHHandle.Init.RxBuffLen=ETH_MAX_PACKET_SIZE;       //接收长度 沈 最长暂推为1456字节
    HAL_ETH_Init(&PHY_ETHHandle);                                         //初始化ETH
    HAL_ETH_SetMDIOClockRange(&PHY_ETHHandle);
4>然后是通过操作寄存器的软复位位,使其进行复位操作,等待复位完成,
5>开启自动协商功能,这一步也是通过将寄存器的自动协商位置1即可;,
6>然后就是持续检测LINK_STATUS位,直到这一位为1,再基础往下走;
7>在XX_GetLinkState(void)函数中的使能自动协商部分处,根据读出的状态寄存器的网速位,按照该部分原有代码的套路,针对性地把当前网速编号return回去;
因为这个函数在ethernetif.c的ethernet_link_check_state(struct netif *netif)函数中和static void low_level_init(struct netif *netif)和void ethernet_link_check_state(struct netif *netif)中都用到
其作用就是检测网是不是好的.如果你的这个函数写不对,那么后续即使客户端创建起来,那么也是卡在客户端线程创建过程中的err = netconn_connect()这一步;
8>接下来,编译,烧录,完成;

海纳百川者,荣耀伴一生!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2019-1-18
在线时间
17 小时
发表于 2020-12-17 11:19:48 | 显示全部楼层
收藏一下,谢谢,帮顶
回复 支持 1 反对 0

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
 楼主| 发表于 2020-12-3 15:45:29 | 显示全部楼层
希望对需要的人一点帮助
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2020-12-14
在线时间
9 小时
发表于 2021-1-20 19:17:43 | 显示全部楼层
您好,有关于H743+LAN8742的驱动程序吗
回复 支持 反对

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
 楼主| 发表于 2021-1-21 08:46:49 | 显示全部楼层
hibaby 发表于 2021-1-20 19:17
您好,有关于H743+LAN8742的驱动程序吗

有。正点原子的H743网络例程就是你想要的。
海纳百川者,荣耀伴一生!
回复 支持 反对

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
 楼主| 发表于 2021-1-21 08:48:12 | 显示全部楼层
hibaby 发表于 2021-1-20 19:17
您好,有关于H743+LAN8742的驱动程序吗

http://www.openedv.com/forum.php?mod=viewthread&tid=308956
这是资料链接,下载即可。
海纳百川者,荣耀伴一生!
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2019-9-4
在线时间
105 小时
发表于 2021-1-22 08:57:25 | 显示全部楼层
您好 能分享下 具体的配置代码么
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2019-2-24
在线时间
50 小时
发表于 2021-1-22 20:51:48 | 显示全部楼层
收藏一下,谢谢,帮顶
回复 支持 反对

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
 楼主| 发表于 2021-1-25 09:56:29 | 显示全部楼层
ydx442745964 发表于 2021-1-22 08:57
您好 能分享下 具体的配置代码么

加我Q,1113037613,可以提供建议,但是源码确实不方便上传.
海纳百川者,荣耀伴一生!
回复 支持 反对

使用道具 举报

2

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2019-9-4
在线时间
105 小时
发表于 2021-1-25 10:53:20 | 显示全部楼层
void init_ethernet(void)
{
                /* Initialize the ETH ethernet controller. */
          u8 macaddress[6]={'0'};       
                uint32_t idx = 0;
                u32 sn0;
                ETH_MACConfigTypeDef MACConf;
        sn0=*(vu32*)(0x1FF0F420);//»ñè¡STM32μÄΨò»IDμÄǰ24λ×÷ÎaMACμØÖ·oóèy×Ö½ú

        MPU_Set_Protection(0x30040000,32,1,0x03,0,0,1);//±£»¤SRAM3,1232K×Ö½ú,½ûÖ112óÃ,½ûÖ1cache,ÔêDí»o3å
  
        macaddress[0]=0x02;
        macaddress[1]=0x00;
        macaddress[2]=0x00;
        macaddress[3]=(sn0>>16)&0XFF;;   
        macaddress[4]=(sn0>>8)&0XFFF;
        macaddress[5]=sn0&0XFF;               
                PHY_ETHHandle.Instance=ETH;                             //ETH
                PHY_ETHHandle.Init.MACAddr = macaddress;                     //mac??
                PHY_ETHHandle.Init.MediaInterface=HAL_ETH_RMII_MODE;    //RMII??
                PHY_ETHHandle.Init.RxDesc=DMARxDscrTab;                 //?????
                PHY_ETHHandle.Init.TxDesc=DMATxDscrTab;                 //?????
                PHY_ETHHandle.Init.RxBuffLen=ETH_MAX_PACKET_SIZE;        //????
       

                /* Enable System configuration controller clock */
                RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN;
       
                /* Reset Ethernet MAC */
                RCC->AHB1RSTR |=  RCC_AHB1ENR_ETH1MACEN;
       
#ifdef _MII_
                SYSCFG->PMCR &= ~(4 << 21);
#else   /* RMII */
                SYSCFG->PMCR |=  (4 << 21);
#endif
                RCC->AHB1RSTR &= ~RCC_AHB1ENR_ETH1MACEN;
               
                RCC->AHB1ENR |= RCC_AHB1ENR_ETH1MACEN | RCC_AHB1ENR_ETH1TXEN | RCC_AHB1ENR_ETH1RXEN;
          
                HAL_ETH_Init(&PHY_ETHHandle);                           //???ETH
    HAL_ETH_SetMDIOClockRange(&PHY_ETHHandle);
for( idx = 0;idx<ETH_RX_DESC_CNT;idx++)
        {
                HAL_ETH_DescAssignMemory(&PHY_ETHHandle,idx,ETH_Rx_Buff[idx],NULL);
        }               
          /* Set Tx packet config common parameters */
                memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));
                //TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
                //TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
                //TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;       

        MAC_RESET();
  macDelay(10000);
  MAC_SET();
  macDelay(10000);
                /* Read PHY ID */
                id1 = read_PHY (PHY_REG_IDR1);
                id2 = read_PHY (PHY_REG_IDR2);
               
                regv = read_PHY(PHY_REG_RBR);
               
                /* Check if this is a DP83848C PHY. */
                if (((id1 << 16) | (id2 & 0xFFF0)) == PHY_ID_DP83848C) {
                                /* Put the DP83848C in reset mode */
                                write_PHY (PHY_REG_BMCR, 0x8000);

                                /* Wait for hardware reset to end. */
                                regv = 0;
                                for (tout = 0; tout < 0x10000; tout++) {
                                                regv = read_PHY (PHY_REG_BMCR);
                                                if (!(regv & 0x8800)) {
                                                                /* Reset complete, device not Power Down. */
                                                                break;
                                                }
                                }
                                /* Configure the PHY device */
#if defined (_10MBIT_)
                                /* Connect at 10MBit */
                                write_PHY (PHY_REG_BMCR, PHY_FULLD_10M);
#elif defined (_100MBIT_)
                                /* Connect at 100MBit */
                                write_PHY (PHY_REG_BMCR, PHY_FULLD_100M);
#else
                                /* Use autonegotiation about the link speed. */
                                write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
                                /* Wait to complete Auto_Negotiation. */
                                regv = 0;
                                for (tout = 0; tout < 0x10000; tout++) {
                                                regv = read_PHY (PHY_REG_BMSR);
                                                if (regv & 0x0020) {
                                                                /* Autonegotiation Complete. */
                                                                break;
                                                }
                                }       
           regv = read_PHY (PHY_REG_BMCR);                               
#endif
                                /* Check the link status. */
                        //        regv = 0;
                                for (tout = 0; tout < 0x10000; tout++) {
                                                regv = read_PHY (PHY_REG_STS);
                                                if (regv & 0x0001) {
                                                                /* Link is on, get connection info */
                                                                regv = read_PHY (PHY_REG_STS);
                                                                if (regv & (1 << 2)) {
                                                                                /* Full-duplex connection */
                                                                                conn |= PHY_CON_SET_FULLD;
                                                                                write_PHY (PHY_REG_BMCR, PHY_FULLD_10M);
                                                                }
                                                                if ((regv & (1 << 1)) == 0) {
                                                                                /* 100Mb/s mode */
                                                                                conn |= PHY_CON_SET_100M;
                                                                                write_PHY (PHY_REG_BMCR, PHY_FULLD_100M);
                                                                }
                                                                break;
                                                }
                                }
                                if(tout >= 0x10000) {
                                        conn = PHY_CON_SET_FULLD | PHY_CON_SET_100M;
                                }
                }
                               
                /* Configure Full/Half Duplex mode. */
                if (conn & PHY_CON_SET_FULLD) {
                        /* Full duplex is enabled. */
                        ETH->MACCR |= ETH_MACCR_DM;
                }

                /* Configure 100MBit/10MBit mode. */
                if (conn & PHY_CON_SET_100M) {
                        /* 100MBit mode. */
                        ETH->MACCR |= ETH_MACCR_FES;
                }       
    HAL_ETH_GetMACConfig(&PHY_ETHHandle,&MACConf);
  //  MACConf.DuplexMode=duplex;
  //  MACConf.Speed=speed;
    HAL_ETH_SetMACConfig(&PHY_ETHHandle,&MACConf);  //éè&#214;&#195;MAC

  HAL_ETH_Start_IT(&PHY_ETHHandle);
}
本人已开发完成,有兴趣的可以看下,目前完美移植到UIP 协议栈
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2019-2-24
在线时间
50 小时
发表于 2021-1-30 21:16:54 | 显示全部楼层
收藏一下,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 03:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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