|

楼主 |
发表于 2018-8-5 16:48:23
|
显示全部楼层
试着将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 TCP isten 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 |
|