常用的以太网控制器有:
RTL8019
接线方面,需要CPU一个中断引脚,一个静态存储块地址片选CS,还有长度为32Bytes的地址映射空间(CPU的5根地址线,A0~A4)
RTL8019的所有操作都可以通过映射到CPU寻址空间的BANK_BASE+(0x00~0x1F)这段地址空间完成
以太网控制器的寄存器被分成4页 ,共享0x00~0x10这16个地址,通过0x00地址上的控制寄存器CR进行page0~3之间的切换
0x10~0x17这段地址叫做DMA端口寄存器,往其中任意一个地址操作效果都一样,可以向DMA端口传送16bit数据
0x18~0x1f这段地址叫做软件复位寄存器,往其中任何一个地址操作效果都一样,可以使控制器软件复位
CS8900
支持存储器模式跟I/O模式
存储器模式就是直接将4KB的PacketPage(CS8900内部的寄存器与帧存储空间)映射到CPU可以寻址的内存空间中,CPU可以直接对PacketPage进行操作
I/O模式是比较常用的模式,PacketPage中内容的修改都通过一个PacketPage Pointer的指针,对CS8900内部任一个寄存器操作都需要先将该寄存器的地址写入到PacketPage Pointer,从而通过数据端口读写寄存器。I/O操作地址空间为 I/O基址(0x300)+Pointer地址/数据端口地址
//PacketPagePointer的定义
#define CS8900_PPTR *(volatileCS8900_REG*)(CS8900_BASE+0x0A+0x300)
//PacketPageData Port
#define CS8900_PDATA *(volatile CS8900_REG *)(CS8900_BASE+0x0C+0x300)
static unsigned short get_reg(int regno){ //32位模式,读寄存器的数据
CS8900_PPTR = regno;// regno为要读的寄存器偏移地址
return (unsigned short) CS8900_PDATA; //返回要读寄存器的数据
}
static void put_reg(int regno, unsigned short val){ //写寄存器
CS8900_PPTR = regno;
CS8900_PDATA = val;
}//写寄存器
DM9000
DM9000的操作方式与CS8900极为相似:
片上有一根CMD线,当CMD为Low的时候,D0~D15输出的数据将被写入到索引寄存器中
将寄存器地址写入到索引寄存器之后,发出CMD为High,D0~D15数据将反映对应寄存器的状态
一般将CMD与MCU的一根地址线相连
常用的以太网收发器有:
KSZ8041
DP83848
LAN8720
MAC与片外PHY的接口
MIIM
MDIO、MDIC:实现与PHY内部控制、状态寄存器间数据交互
MII
ENET_TXD[0:1] 发送数据线
ENET_RXD[0:1] 接收数据线
ENET_RX_DV 接收到有效数据
ENET_TX_EN 发送使能
ENET_REF_CLK 参考时钟,PHY与MAC应该使用同一参考时钟
RMII
ENET_RXD[3:0] 接收数据线
ENET_TXD[3:0] 发送数据线
ENET_COL 冲突监听
ENET_CRS 接收数据有效
ENET_TX_ER 发送错误
ENET_TX_CLK 发送参考时钟
ENET_RX_CLK 接收参考时钟
ENET_RX_ER 接收错误
ENET_TX_EN 发送使能