【原创】飞思卡尔MC9S12NE64 EMAC 模块简介
0赞MC9S12NE64的EMAC实现了数据链路层的功能,提供将一台设备的网络层数据传输至另一台设备的机制。EMAC主要负责数据的传输,具有10Mbps/100Mbps的传输能力。在数据传输之前,EMAC自动对以太帧进行封装:添加帧的前导位、帧起始位以及CRC校验码。此外,EMAC具有MAC地址识别和滤波功能,并能进行错误检测。在半双工模式下,EMAC采用载波多路访问和冲突检测(CSMA/CD)机制;在全双工模式下,可采用流量控制机制。因此,EMAC模块的初始化应该是包括这些功能在内的初始化,它可以通过读写EMAC模块提供的21个寄存器来实现。
1.EMAC模块的编程寄存器
MC9S12NE64的EMAC模块一共包括21个寄存器,占用48个字节。寄存器地址由基址和偏移量构成,基址由MCU决定NE64芯片中此基地址为$0140,偏移量在$00~$2F之间,地址=基地址+偏移量。EMAC模块存储器映射如表所示。
(1) 网络控制寄存器(Network Control,NETCTL)
该寄存器的地址为:$0140。通过该寄存器可以使能EMAC、外部PHY以及双工模式等。需要注意的是:必须在设置EMACE之前设置MLB或EXPHY,即至少分两次写该寄存器才能完成。当设置MLB或EXPHY时,必须断开内部或外部PHY连接,避免在端口配置逻辑时MII上产生干扰。
D7—EMAC使能位,可读/写。当数据正在传输时(TXACT=1),不能修改该位。 =1,允许接收和发送数据;一旦置该位=0,则EMAC接收器和发送器立即停止。任何在处理过程中的接收操作均被丢弃,任何PAUSE定时器均被清空。EMACE与MII管理功能无关。
D4—WAIT模式下EMAC使能位,可读/写。当数据正在传输时(TXACT=1)或MII忙(BUSY=1)时,不能通过置该位进入WAIT模式。ESWA=1,在WAIT模式下禁止EMAC;ESWA=0,在WAIT模式下EMAC正常工作。
D3—外部PHY设置位,该位在硬件或软件复位之后,只能写一次,但是用户不能当EMACE=1或BUSY=1时修改该位。EXTPHY=1,使用外部PHY,此时所有外部的EMAC MII I/O可使用;EXTPHY=0,使用内部PHY,此时所有内部的MII接口可使用。
D2—MAC循环位,该位在硬件或软件复位之后,只能写一次,但是用户不能当EMACE=1或BUSY=1时修改该位。当处于循环模式时,接收器的帧识别算法仍然有效,那些不满足算法的发送帧会被接收器丢弃。MLB=1,EMAC进入循环模式,发送数据直接进入内部接收器,禁止MII;MLB=0,正常操作。
D1—双工设置位,可读/写。当数据正在传输时(TXACT=1),不能修改该位。FXD=1,EMAC为全双工模式,帧的传送和接收是相互独立的,该模式下可以启用流量控制;FXD=0,EMAC为半双工模式,帧的发送和接收不能同时进行,该模式下可以使用CSMA/CD协议进行冲突和网络访问的管理。
(2) 接收控制和状态寄存器(Receive Control and Status,RXCTS)
该寄存器的地址为:$0143。通过该寄存器可以判断接收器的状态,设置是否进行流量控制以及设置EMAC可以接收何种地址的帧。
D7—接收器状态位,只读。RXACT=1,接收器正忙,当MII_RXDV有效时,该位置1;RXACT=0,接收器空闲,当MII_RXDV无效后且EMAC已经处理完接收帧,该位置0。
D4—流量控制使能位,可读/写。当EMAC=1时,不能修改该位。RFCE=1,接收器检测到了PAUSE帧(只适用于全双工模式)。一旦接收到PAUSE帧,发送器将停止发送数据帧,停止的时间在接收到的帧内给出。每接收到有效的PAUSE帧,PAUSE定时计数器就会更新数值。RFCE=0,忽略接收到的PAUSE控制帧。
D2—帧地址混合模式位,可读/写。当EMAC=1时,不能修改该位。当接收器忙时修改该位,可能会影响滤波结果。PROM=1,地址识别滤波不起作用,无论帧的目的地址是什么,所有帧都被接收;PROM=0,EMAC将按照CONMC位和BCREJ位的设置接收相应的地址帧。
D1—条件组播地址接收设置位,可读/写。当EMAC=1时,不能修改该位。当接收器忙时修改该位,可能会影响滤波结果。CONMC=1,用组播hash表检查所有接收到的组播地址帧;CONMC=0,接收所有组播地址帧。
D0—广播帧地址接收设置位,可读/写。当EMAC=1时,不能修改该位。BCREJ=1,拒绝所有广播地址帧,只接收唯一帧;BCREJ=0,接收所有广播地址帧。
(3) 发送控制和状态寄存器(Transmit Control and Status,TXCTS)
该寄存器的地址为:$0144。通过该寄存器可以判断发送器的状态,设置流量控制功能,设置以太帧操作命令等。
D7—发送器状态位,只读。该状态位反应EMAC发送器是否忙。TXACT=1,发送器忙。当TCMD中写入有效命令时,TXACT=1;TXACT=0,发送器空闲。当EMAC完成了帧的发送,则TXACT=0。
D5—载波监听丢失标志位,可读/写。该位保证了帧正常发送,并且无需软件重试。向该位写1则清除该位,写0无影响。CSLF=1,载波监听丢失(半双工模式)或在无冲突的传输过程(不包括帧前导位)中没有发生载波监听;CSLF=0,没有检测到载波监听丢失。
D4—PAUSE帧定时器寄存器控制位,可读/写。PTRC =1,可以对PTIME寄存器进行写操作,从而更新PAUSE的持续时间,该时间单位为512位时间;PTRC =0,可以对PTIME寄存器进行读操作,获取接收器接收到PAUSE帧后,还余留持续时间,单位为512位时间。此时对PTIME写操作对其无影响。
D3—时间片设置位,可读/写。SSB=1,单个以太网时间片;SSB =0,随机backoff算法时间。
D1、D0—发送命令位,只写。通过这两位可以发送3个不同的命令:START,PAUSE和ABORT。START表示开始发送在发送缓冲区的帧;PAUSE表示发送一个由硬件产生的PAUSE帧;如果错误的CRC校验码添加到帧尾以及MII_TXER=1,ABORT命令可以中止任何帧发送。如果TXACT=1,START和PAUSE命令被忽略;如果接收到PAUSE命令,则START命令帧被悬挂直到PAUSE帧持续时间结束;在PAUSE帧持续时间,如果没有START命令被悬挂,EMAC帧可以发送一个控制PAUSE帧。
TCMD=0,保留,忽略;
TCMD=1,START,启动发送缓冲区帧;
TCMD=2,PAUSE,启动pause帧(只适用全双工);
TCMD=3,ABORT,取消发送。
(4) 以太帧类型控制寄存器(Ethertype Control,ETCTL)
该寄存器的地址为:$0145。通过该寄存器可以设置EMAC可以接收哪些类型的帧。当EMAC=1时,不能修改该寄存器值。当接收器忙时修改该寄存器,可能会影响滤波结果。
如果ETCTL寄存器中的每位均为1,则可以接收所有类型的帧。相反,该寄存器中表示某种类型的位为0,则该类型的帧被滤波。
D7—可编程以太帧类型,FPET=1,接收ETYPE寄存器中设置的类型帧;FPET=0,忽略ETYPE寄存器中设置的类型帧。
D4—Emware类型帧(0x8876),FEMW =1,接收Emware类型帧;FEMW =0,忽略Emware类型帧。
D3—网际协议6类型帧(0x86DD),FIPV6=1,接收IPv6类型帧;FIPV6 =0,忽略IPv6类型帧。
D2—地址解析协议类型帧(0x0806),FARP =1,接收ARP类型帧;FARP=0,忽略ARP类型帧。
D1—网际协议4类型帧(0x8600),FIPV4=1,接收IPv4类型帧;FIPV4 =0,忽略IPv4类型帧。
D0—IEEE802.3长度域以太帧(长度在0x0000~0x05DC),FIEEE=1,接收该长度范围的帧;FIEEE=0,忽略该长度范围的帧。
(5) 可编程以太帧类型寄存器(Programmable Ethertype,ETYPE)
该寄存器的地址为:$0146。它是16位寄存器,与ETCTL寄存器一起用于以太帧类型滤波。
(6) PAUSE帧定时和计数寄存器(PAUSE Timer Value and Counter,PTIME)
该寄存器的地址为:$0148。它是16位寄存器,控制PAUSE帧的持续时间,详细解释见TXCTS寄存器中PTRC位的解释。此外,无论PTRC为何值,接收到一个有效的PAUSE控制帧,将更新PAUSE定时计数器的值。
(7) 中断事件寄存器(Interrupt Event,IEVENT)
该寄存器的地址为:$014A。它是16位寄存器,包含了EMAC中的所有中断事件标志位,通过该标志可以判断发生了何种中断或者直接进入中断事件。该寄存器可读/写,向各个中断事件位写1将清除中断标志,写0无影响。
D15—接收流量控制中断标志位。RFCIF=1,表示在全双工模式下,接收到了流量控制帧,发送器停止发送数据;RFCIF=0,正常发送数据。
D13—接收帧过长错误标志位。BREIF=1,表示接收到的帧长度大于MAXFL的值,产生出错中断;否则正常通信。
D12—接收帧错误标志位。RXEIF=1,表示接收帧的长度不匹配、队列出错或者CRC出错;否则数据正确。
D11—接收缓冲区A溢出中断标志位。RXAOIF=1,表示接收缓冲区A发生溢出;否则正常。
D10—接收缓冲区B溢出中断标志位。RXBOIF=1,表示接收缓冲区B发生溢出;否则正常。
D9—A缓冲区接收完成标志位。RXACIF=1,表示接收缓冲区A接收数据完成;否则表示接收帧还未被确认有效。
D8—B缓冲区接收完成标志位。RXBCIF=1,表示接收缓冲区B接收数据完成;否则表示接收帧还未被确认有效。
D7—MII管理传输完成中断标志位。MMCIF=1,表示MII管理传输完成,否则表示MII管理传输正在进行或者无请求。
D5—滞后冲突中断标志位。LCIF=1,表示在半双工模式下,在512位时间的冲突窗口之后发生了中断,否则表示没有发生该中断。
D4—过量冲突中断标志位。ECIF=1,表示在半双工模式下,冲突次数超过了最大重发次数15,此时该帧被丢弃,必须启动START命令重新发送。ECIF=0,表示冲突数量未超过15次。
D1—帧发送完成中断标志位。TXCIF=1,表示帧发送完成,否则表示发送还未确认。
(8) 中断屏蔽寄存器(Interrupt Mask,IMASK)
该寄存器的地址为:$014C。它是16位寄存器,包含了IEVENT中的所有中断事件的使能位,它们的每位含义相同。该寄存器可读/写,位值=1,表示允许中断,位值=0,表示禁止中断。
(9) 软复位寄存器(Software Reset,SWRST)
该寄存器的地址为:$014E。它主要实现EMAC软复位功能,当BUSY=1时,不能修改该位。
D7—EMAC软复位,有关EMAC的所有逻辑被初始化,所有EMAC寄存器被复位。任何正在进行的发送和接收操作全部结束。MACRST=1,复位EMAC;MACRST=0,正常操作。
(10) MII管理PHY地址寄存器(MII Management PHY Address,MPADR)
该寄存器的地址为:$0150。该寄存器的D4~D0位可以对32个与其连接的PHY设备进行编号。复位值为0,表示内部PHY的编号,当然也可以通过此寄存器改变该值。
(11) MII管理寄存器地址寄存器(MII Management Register Address,MRADR)
该寄存器的地址为:$0151。该寄存器的D4~D0位可以对32个MII管理寄存器设置地址。
(12) MII管理写数据寄存器(MII Management Write Data,MWDATA)
该寄存器的地址为:$0152。它是16位寄存器,可以通过该寄存器将数据写入MII寄存器。
(13) MII管理读数据寄存器(MII Management Read Data,MRDATA)
该寄存器的地址为:$0154。它是16位寄存器,只读,可以通过该寄存器读出MII寄存器数据。读操作必须在MMCIF=1时数据才有效。
(14) MII管理命令和状态寄存器( MII Management Command and Status,MCMST)
该寄存器的地址为:$0156。
D7、D6—操作码位,可读/写,2位。OP=10,将产生读帧操作;OP=01,将产生写帧操作;如果为其他组合的值均无意义。需要注意的是,这些操作必须在BUSY=0时才能进行。如果MDCSEL=0,OP写被忽略,这2位读出值始终为00。
D5—操作状态位,只读。BUSY=1,MII忙,当OP被写时该位置1;BUSY=0,MII空闲,当MMCIF=1时该位置0。
D4—前导设置位。根据IEEE802.3标准,如果PHY层不需要前导位,那么MII管理接口可以不发前导位。NOPPRE=1,无前导位;NOPPRE=0,32位前导位。
D3~D0—管理时钟频率设置位,可读/写,4位。该时钟用于MII管理传输,当MDC空闲时保持低电平。MDC频率的计算公式如下:
MDC频率=总线时钟/(2* MDCSEL)
根据IEEE的 MII 规范,MDCSEL的设置值必须使得MDC的时钟频率小于或等于2.5MHz,且MDCSEL不能为0。下面举例计算MDCSEL值。假设总线频率为25 MHz,需要MDC的频率为2.5MHz,则MDCSEL=总线时钟/(MCD频率*2)=25 MHz/(2.5MHz*2)=5。
(15) 以太网缓冲区配置寄存器(Ethernet Buffer Configuration,BUFCFG)
该寄存器的地址为:$0158。它是16位寄存器,主要设置以太帧发送接收缓冲区的大小和存储分配,复位值不全为0。
D14~D12—缓冲区大小和起始地址映射位,3位。复位之后且EMACE=0,该值才能且只能写一次。表15-4是缓冲区映射配置。
D10~D0—允许接收最大帧长度位,11位。当EMACE=1时,不能改变这些位的值。MAXFL设置值的单位为字节,如果接收帧长度超过MAXFL值会发生帧过长事件。如果写入的数据小于64则被置64,如果写入的数据大于1518则被置1518。
(16) 接 收 缓 冲 区 A 帧 结束 指 针 寄 存器 ( Receive A End-of-Frame Pointer ,RXAEFP)
该寄存器的地址为:$015A。它是16位只读寄存器,高位D15~D11无意义。RXAEFP位为D10~D0,指出写到接收缓冲区A的最后一个字节的地址偏移量。当RXACIF=1时,RXAEFP的值才有效。
(17) 接收缓 冲区 B帧 结 束指针 寄存 器( Receive B End-of-Frame Pointer,RXBEFP)
该寄存器的地址为:$015C。它是16位只读寄存器,高位D15~D11无意义。RXBEFP位为D10~D0,指出写到接收缓冲区B的最后一个字节的地址偏移量。当RXBCIF=1时,RXBEFP的值才有效。
(18) 发送缓冲区帧结束指针寄存器(Transmit End-of-Frame Pointer,TXEFP)
该寄存器的地址为:$015E。它是16位寄存器,高位D15~D11只读无意义。TXEFP位为 D10~D0,可读 /写,指出写到发送缓冲区的最后一个字节的地址偏移量。当TXACT=1时,不能TXEFP的值。
(19) 组播HASH表寄存器(Multicast Hash Table,MCHASH)
该组寄存器的地址为:$0160~$0166。每个寄存器为16位,对接收到的组播帧进行地址识别处理。Hash表算法计算如下:48位目的MAC地址映射到64位中的1位上。将48位地址进行32位CRC计算,取出最高6位(该值在0~63之间)。当接收到的组播帧按照该算法计算的结果在MCHASH对应的位被置1,则接受该帧。
(20) MAC地址寄存器(MAC Unicast Address,MACAD)
该组寄存器的地址为:$0168~$016C。每个寄存器为16位,复位后只能写一次,EMAC地址必须是唯一的。EMAC地址通常固化在非挥发性内存中,用户软件初始化时被拷贝到MAC地址寄存器。
(21) 杂项寄存器(Miscellaneous,EMISC)
该寄存器的地址为:$016E。它是16位寄存器,包括2个字段域:INDEX(D15~D13)和MISC(D10~D0)。该寄存器主要给出EMAC使用的内部计数器个数。INDEX域可读/写,MISC只读。
INDEX:MISC的索引位,用于选择何种计数器将在MISC位上读出。
2.EMAC模块收发器
NE64有2个接收缓冲区和一个发送缓冲区,在初始化的时候定位在RAM空间中,起始地址和缓冲区大小由BUFCFG寄存器的BUFMAP段定义。接收缓冲区中存放以太帧的目的MAC地址、源MAC地址、长度/类型、数据域和CRC校验段。而发送缓冲区与接收缓冲区相比不包含CRC校验段,这个段在发送时由发送器自动添加。
接收以太帧首先要使能EMAC模块,这样一旦缓冲区A和缓冲区B中的一个完成中断标志被清零就开始接收以太帧。如果两个缓冲区都为空则以太帧优先放在缓冲区A中。当缓冲区完成中断标志都被置位时,即无空闲的接收缓冲区,这时不接收以太网数据。
其次,接收以太帧首先需要通过地址匹配。如果接收模式设为混杂模式,将接收所有以太帧。本书将接收模式设置为非混杂模式接收所有广播地址帧,组播地址帧以及唯一地址帧。
单播(Unicast)传输在发送者和每一接收者之间实现点对点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也必须相应的复制多份的相同数据包。
如果有大量主机希望获得数据包的同一份拷贝时,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需增加硬件和带宽。
组播(Multicast)传输在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。
广播(Broadcast)传输是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和交换机网络设备控制广播传输。
最后,要进行长度/类型位的匹配,满足了设定的条件时才将以太帧放入接收缓冲区,包括是否接收ARP帧、Ipv4、Ipv6和长度信息等。
这些功能在EMAC正确初始化设置后由模块自动完成。下列情况会产生EAMC模块接收错误,当接收错误中断允许时置接收错误中断标志位。
① 接收的以太帧长度超出1518个字节(包括以太帧首部及校验);
② MII接口收到PHY模块发出的传输媒介错误;
③ 当长度/类型位的值等于46,而数据域的长度小于46个字节;
④ 以太帧CRC校验出错;