硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3127|回复: 8
收起左侧

[RL-TCPnet] RL_TCPnet初学三点疑问

[复制链接]

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-8-2 21:59:12 | 显示全部楼层 |阅读模式
疑问1:看了两个RL_TCPnet的移植例程,咋愣是没找到函数init_ethernet()在哪儿调用了呢?
全局搜索如下图,确定没看走眼。
QQ截图20180802215229.png

疑问2:我用的MDK5.18,安装目录下满没找到教程里面所说的关于以太网的驱动,直接把例程里面的驱动拷贝到5.18创建的工程里面没问题吧?

疑问3:函数init_ethernet()咋不用库函数写呢?我记得官网针对407出过一个以太网驱动库吧。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107488
QQ
发表于 2018-8-3 01:05:55 | 显示全部楼层
1、这个函数是被库调用了,没有源码,所以检索不到调用此函数的原始API
2、可以的。
3、这个比ST的那个用的爽,后面你移植新的PHY芯片就体会到了,各种PHY支持非常方便。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-3 15:20:57 | 显示全部楼层
eric2013 发表于 2018-8-3 01:05
1、这个函数是被库调用了,没有源码,所以检索不到调用此函数的原始API
2、可以的。
3、这个比ST的那个用 ...

基本上没仔细看过STM32底层的寄存器,当借这个机会好好熟悉一下了
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-5 16:48:23 | 显示全部楼层
eric2013 发表于 2018-8-3 01:05
1、这个函数是被库调用了,没有源码,所以检索不到调用此函数的原始API
2、可以的。
3、这个比ST的那个用 ...

试着将RL-tcpnet移植到设备上,设备用的是LAN8720,之间跑的是LWIP,硬件没问题。
主要修改的函数init_ethernet,源码如下。
TCPnetTest()函数也直接COPY了过来,但是无法PING通(正常只要函数init_ethernet初始化成功了是不是应该就能PING通了?)
串口打印出来的调试信息如下,仿真了一下,上电后一直在进入以太网中断。

附件 init_ethernet源码
/*
*********************************************************************************************************
*        函 数 名: init_ethernet
*        功能说明: 初始化以太网RMII方式引脚,驱动PHY,配置MAC及其DMA方式。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void init_ethernet (void)
{
        U32 regv,tout,conn;

        /* 使能系统配置控制器时钟 */
        RCC->APB2ENR |= (1 << 14);

        /* 复位以太网MAC */
        RCC->AHB1RSTR |=  0x02000000;

        /* 选择RMII接口,必须在 MAC 处于复位状态且在使能 MAC 时钟之前完成此配置 */
        SYSCFG->MC |=  (1 << 23);

        /* 停止复位以太网MAC */
        RCC->AHB1RSTR &= ~0x02000000;

        /* 使能以太网时钟(PTP时钟,接收时钟,发送时钟,MAC 时钟),GPIOA,GPIOB,GPIOC时钟 */
        RCC->AHB1ENR |= 0x1E000007;

        /* 配置PA0,输出模式,推挽模式,2MHz,上拉,*/
        /* 配置PA1,PA2和PA7,复用功能,推挽模式,100MHz,无上拉下拉,复用到AF11 (Ethernet) */
        GPIOA->MODER   &= ~0x0000C03F;
        GPIOA->MODER   |=  0x00008029;              
        GPIOA->OTYPER  &= ~0x00000087;              
        GPIOA->OSPEEDR |=  0x0003C03C;              
        GPIOA->UPDR   &= ~0x0003C03F;            
        GPIOA->AFR[0]  &= ~0xF0000FF0;
        GPIOA->AFR[0]  |=  0xB0000BB0;              

        /* 配置PC1,PC4和PC5,复用功能,推挽模式,100MHz,无上拉下拉,复用到AF11 (Ethernet) */
        GPIOC->MODER   &= ~0x00000F0C;
        GPIOC->MODER   |=  0x00000A08;            
        GPIOC->OTYPER  &= ~0x00000032;              
        GPIOC->OSPEEDR |=  0x00000F0C;              
        GPIOC->UPDR   &= ~0x00000F0C;            
        GPIOC->AFR[0]  &= ~0x00FF00F0;
        GPIOC->AFR[0]  |=  0x00BB00B0;                        

        /* 配置PB11,PB12,PB13,复用功能,推挽模式,100MHz,无上拉下拉,复用到AF11 (Ethernet) */
        GPIOB->MODER   &= ~0x0FC00000;
        GPIOB->MODER   |=  0x0A800000;            
        GPIOB->OTYPER  &= ~0x00003800;              
        GPIOB->OSPEEDR |=  0x0FC00000;              
        GPIOB->UPDR   &= ~0x0FC00000;              
        GPIOB->AFR[1]  &= ~0x00FFF000;
        GPIOB->AFR[1]  |=  0x00BBB000;            

        /*
          寄存器ETH->DMABMR的SR位置1后,MAC DMA控制器会复位所有MAC子系统的内部寄存器和逻辑。在所有内
          核时钟域完成复位操作后,该位自动清零。重新编程任何内核寄存器之前,在该位中读取0 值。
        */
        ETH->DMABMR  |= DBMR_SR;
        while (ETH->DMABMR & DBMR_SR);
        conn = 0;

        /*
           HCLK的时钟是168MHz,这里选项CR位为100,CR占用寄存器ETH->MACMIIAR的bit4,bit3和bit2。
           CR 时钟范围选项可确定 HCLK 频率并用于决定 MDC 时钟频率:
            选项     HCLK        MDC 时钟
            000    60-100MHz     HCLK/42
                        001    100-150MHz    HCLK/62
                        010    20-35MHz      HCLK/16
                        011    35-60MHz      HCLK/26
                        100    150-168MHz    HCLK/102
                        101、110、111 保留
    */
        ETH->MACMIIAR = 0x00000010;

        /* 第1步:复位LAN8720 ***********************************************************/
        printf_eth("===============================================================\r\n");
        printf_eth("下面是LAN8720的硬件初始化:\r\n");
        printf_eth("1. Start PHY Init\r\n");
       
        /* 硬件复位LAN8720 */
        GPIO_ResetBits(PHY_NRST_PORT,PHY_NRST_PIN);
        bsp_DelayUS(120);        /*        保持低电平至少100us        */
        GPIO_SetBits(PHY_NRST_PORT,PHY_NRST_PIN);
        bsp_DelayUS(10);       
        /* 发送软件复位命令 */
        write_PHY (PHY_REG_BMCR, 0x8000);
        /* 等待复位完成 */
        for (tout = 0; tout < 0x10000; tout++)
        {
                regv = read_PHY (PHY_REG_BMCR);
                if (!(regv & 0x8800))
                {
                        /* 复位完成 */
                        printf_eth("2. Reset Complete\r\n");
                        break;
                }
        }

        /* 第2步:配置LAN8720 ***********************************************************/
        /* 通过Auto-Negotiation实现自适应10Mbps网络或者100Mbps网络 */
        write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
       
        /* 等待完成Auto-Negotiation */
        for (tout = 0; tout < 0x100000; tout++)
        {
                regv = read_PHY (PHY_REG_BMSR);
                if (regv & 0x0020)
                {
                        /* 完成Auto-Negotiation */
                        printf_eth("3. Auto-Negotiation Complete\r\n");
                        break;
                }
        }
       
        /* 第3步:检测连接状态 ***********************************************************/
        for (tout = 0; tout < 0x10000; tout++)
        {
                regv = read_PHY (PHY_REG_BMSR);
                if (regv & (1 << 2))
                {
                        printf_eth("4. Connection Succeeded\r\n");
                       
                        /* PHY已经连接上网络 */
                        g_ucEthLinkStatus = 1;
                       
//                        /* 获取连接信息 */
//                        regv = read_PHY (PHY_REG_DSCSR);
//                       
//                        if ((regv & (1 << 15))|(regv & (1 << 13)))
//                        {
//                                /* 全双工 */
//                                printf_eth("5. Full-duplex connection\r\n");
//                                conn |= PHY_CON_SET_FULLD;
//                        }
//                       
//                        if ((regv & (1 << 15))|(regv & (1 << 14)))
//                        {
//                                /* 速度100Mbps的网络 */
//                                printf_eth("6. 100Mbps Mode\r\n");
//                                conn |= PHY_CON_SET_100M;
//                        }
                        conn |= PHY_CON_SET_FULLD;
                        conn |= PHY_CON_SET_100M;
                        break;
                }
                else
                {
                        printf_eth("4. Connection failed\r\n");
                       
                        /* 未连接上 */
                        g_ucEthLinkStatus = 0;
                }
        }
        /*
           初始化MAC配置寄存器
           (1)当该位MCR_ROD置1时,MAC禁止在半双工模式下接收帧。
           (2)当该位MCR_ROD清0时,MAC接收PHY发送的所有数据包。
           (3)如果MAC在全双工模式下工作,该位不适用。
        */
        ETH->MACCR  = MCR_ROD;

        /* 设置MAC工作在全双工模式 */
        if (conn & PHY_CON_SET_FULLD)
        {
                /* 使能全双工 */
                ETH->MACCR |= MCR_DM;
        }
        /*
                通过位MCR_FES配置MAC通信速度
                (1)0表示10Mbps
                (2)1表示100Mbps
        */
        if (conn & PHY_CON_SET_100M)
        {
                /* 配置为100Mbps */
                ETH->MACCR |= MCR_FES;
        }
        /* MACFFR 以太网帧过滤寄存器,配置可接收所有MAC组播包,即MAC地址第一个字节的bit0 = 1 */
        ETH->MACFFR = MFFR_HPF | MFFR_PAM;
       
        /* MACFCR 以太网流控制寄存器,ZQPD零时间片暂停禁止 */
        ETH->MACFCR = MFCR_ZQPD;

        /* 设置以太网MAC地址寄存器 */
        ETH->MACA0HR = ((U32)own_hw_adr[5] <<  8) | (U32)own_hw_adr[4];
        ETH->MACA0LR = ((U32)own_hw_adr[3] << 24) | (U32)own_hw_adr[2] << 16 |
                                   ((U32)own_hw_adr[1] <<  8) | (U32)own_hw_adr[0];

        /* 初始化DMA发送和接收描述符 */
        rx_descr_init ();
        tx_descr_init ();

        /*
            刷新FIFO,启动DMA发送和接收功能
                DMAOMR 工作模式寄存器
                位20 DOMR_FTF:刷新发送 FIFO (Flush transmit FIFO):
                               该位置1时,发送FIFO控制器逻辑会复位为默认值,因此,TX FIFO中的所有数据均会
                                   丢失/刷新。刷新操作结束时该位在内部清零。此位清零之前不得对工作模式寄存器执
                                   行写操作。
                位13 DOMR_ST:启动/停止发送 (Start/stop transmission)
                              该位置1时,启动发送,DMA会检查当前位置的发送列表来查找待发送的帧。
                位1  DOMR_SR:启动/停止接收 (Start/stop receive)
                              该位置1时,启动接收,DMA尝试从接收列表中获取描述符并处理传入帧。
        */
        ETH->DMAOMR = DOMR_FTF | DOMR_ST | DOMR_SR;

        /* 使能发送和接收 */
        ETH->MACCR |= MCR_TE | MCR_RE;

        /* 复位所有MAC中断 */
        ETH->DMASR  = 0xFFFFFFFF;

        /*  
            使能发送和接收中断
                DMAIER 中断使能寄存器
                位16 NISE:使能所有正常中断(Normal interrupt summary enable)
                位15 AISE:使能所有异常中断(Abnormal interrupt summary enable)
                位7 RBUIE:接收缓冲区不可用中断使能(Receive buffer unavailable interrupt enable)
                           当该位和AISE位都置1后,可使能接收缓冲区不可用中断。该位清零时,会禁止接
                                   收缓冲区不可用中断。
                位6   RIE:接收中断使能 (Receive interrupt enable)
                           当该位和AISE都置1后,可使能接收中断。该位清零时,会禁止接收中断。
        */
        ETH->DMAIER = ETH_DMAIER_NISE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE | ETH_DMAIER_RIE;

        /* 设置为最高优先级,仅调用NVIC->ISER设置的默认优先级也是最高优先级0 */
        NVIC_SetPriority(ETH_IRQn, 0);
       
        printf_eth("===============================================================\r\n");
}


附件2 串口调试打印信息

00
0.0 MEM:Init MemPool 8192 bytes
000.0 MEM: Limit0= 61
44, Limit1= 4096 bytes
000.0 ETH:Init interface
======
=======================================================
==
下面是LAN8720的硬件初始化:
1. Start PHY Init
2.
Reset Complete

3. Auto-Negotiation Complete
4. Con
nection Succeeded
==================================
=============================
000.0 ARP:Init Cache, 1
0 entries
000.0 IP :Init localhost
000.0 ICMP:Init Engin
e
000.0 TCP:Init 2 Sockets
000.0 TCP: Local MSS: 1460

000.0 TCP:Socket 1 allocated
000.0 TCPisten Socket 1,
Port 1001
tcp listen res = 1
000.0 ETH:*** Processi
ng frame ***
000.0 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF
00
0.0 ETH: Src. MAC: B8:70:F4:2F:E4:10
000.0 ETH: Protoco
l: ARP
000.0 ETH: Length  : 60 bytes
000.0 ARP:*** Processing frame ***
000.0 ARP: Op_Code: Arp_
Rq
000.0 ARP:
Src. IP: 0.0.0.0
000.0 ARP: Dest.IP: 192.168.1.20
000
.0 ARP: Src.MAC: B8:70:F4:2F:E4:10
000.0 ARP: Dst.MAC:
00:00:00:00:00:00
000.0 ARP: Ignored, Wrong IP
000.0 MEM
:Free 72 bytes
000.0 MEM: IRQ_Alloc 6 blocks
000.0 M
EM: Used 456 bytes (5 blocks)
000.0 ETH:*** Processing f
rame ***
000.0 ETH: Dest.MAC: 33:33:FF:43:8C:9E
000.0
ETH: Src. MAC: B8:70:F4:2F:E4:10
000.0 ETH: Protocol:
0x86DD
000.0 ETH: Length  : 78 bytes
000.0 ETH: Unknow
n Protocol, dumping frame
000.0 MEM:Free 92 bytes
000.0
MEM: IRQ_Alloc 12 blocks
000.0 MEM: Used 4388 bytes (16
blocks)
000.0 ETH:*** Processing frame ***
000.0 ET
H: Dest.MAC: 33:33:00:00:00:02
000.0 ETH: Src. MAC: B8
:70:F4:2F:E4:10
000.0 ETH: Protocol: 0x86DD
000.0 ETH: Le
ngth  : 70 bytes
000.0 ETH: Unknown Protocol, dumpin
g frame
000.0 MEM:Free 84 bytes
000.0 MEM: IRQ_Alloc 3 bl
ocks
000.0 MEM: Used 5552 bytes (18 blocks)
000.0 ET
H:*** Processing frame ***
000.0 ETH: Dest.MAC: 33:33:
00:00:00:16
000.0 ETH: Src. MAC: B8:70:F4:2F:E4:10
000.
0 ETH: Protocol: 0x86DD
000.0 ETH: Length  : 90 bytes

000.0 ETH: Unknown Protocol, dumping frame
000.0 MEM:Free
104 bytes
000.0 MEM: IRQ_Alloc 3 blocks
000.0 MEM:
Used 5928 bytes (20 blocks)
000.0 ETH:*** Processing fr
ame ***
000.0 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF
000.0 ETH
: Src. MAC: B8:70:F4:2F:E4:10
000.0 ETH: Protocol: AR
P
000.0 ETH: Length  : 60 bytes
000.0 ARP:*** Processing
frame ***
000.0 ARP: Op_Code: Arp_Rq
000.0 ARP: Src.
IP: 192.168.1.20
000.0 ARP: Dest.IP: 192.168.1.1
000.
0 ARP: Src.MAC: B8:70:F4:2F:E4:10
000.0 ARP: Dst.MAC: 0
0:00:00:00:00:00
000.0 ARP: Ignored, Wrong IP
000.0 MEM
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-5 16:50:49 | 显示全部楼层
发送引脚跟例程不同,定义如下,修改的代码中已经做出调整       
        PA1/ETH_RMII_RX_CLK
        PA2/ETH_MDIO
        PA7/RMII_CRS_DV
        PC1/ETH_MDC
        PC4/ETH_RMII_RX_D0
        PC5/ETH_RMII_RX_D1
       
        PB11/ETH_RMII_TX_EN
        PB12/FSMC_A24/ETH_RMII_TXD0
        PB13/ETH_RMII_TXD1
        PA0/PHY_RST
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-5 16:54:00 | 显示全部楼层
软件用的是固定IP的方式,硬件和电脑直连
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-5 17:09:22 | 显示全部楼层
LAN8720 绿灯常亮,黄灯快闪
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-5 17:19:52 | 显示全部楼层
上电后串口一直打印调试信息,约一分钟后,再次PING设备,ping通了,但是时间显示时间太长了吧 PING通.png
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-5 17:26:18 | 显示全部楼层
额.....刚才冲动了,忽略以上帖子吧,把调试改成只打印错误一切就都正常了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-4 08:47 , Processed in 0.250143 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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