金牌会员
 
- 积分
- 1322
- 金钱
- 1322
- 注册时间
- 2015-3-3
- 在线时间
- 127 小时
|
当前开发硬件软件为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>接下来,编译,烧录,完成;
|
|