热度 17
2013-3-4 21:49
3249 次阅读|
4 个评论
TSE的loopback功能设置和调试 所谓loopback,便是TSE的收发形成一个闭环,通常是在初步调试验证MAC的基本功能时使用。TSE的这个loopback功能的开启可有两道“门槛”,一个不能少,不仅软件编程开启,而且硬件也有“玄机”,一不留意恐怕你死活也搞不定它。尤其是当原型调试时,你还真搞不懂是loopback没配置好还是MAC的收发不工作。 废话不多说,直接上图。首先在配置TSE的IP组件时,需要勾选MAC Options页面的Enable local loopback on MII/GMII/RGMII选项,默认可是不勾选的,所以需要特别开启。在Small MAC模式下,没有loopback功能,所以无从设置。 在User guide中对此有专门说明。 其次,在软件编程时,使能Config寄存器的bit15,使LOOP_ENA功能被开启。 具体编程操作时,可以参考如下顺序进行操作。 初始化的代码如下。 //Ethernet初始化 void ethernet_init(void) { alt_u32 temp; //MDIO phy地址设置 = 5‘b10000(参考88E1111_datasheet page63) IOWR_ALTERA_TSEMAC_MDIO_ADDR0(MY_TSE_BASE,0x11); IOWR_ALTERA_TSEMAC_MDIO_ADDR1(MY_TSE_BASE,0x11); //MAC配置寄存器初始化 //关闭MAC数据流接收和发送使能位 do { IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00802220); temp = IORD_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE); } while(temp != 0x00800220); //MAC FIFO配置 /* Tx_section_empty = Max FIFO size - 16 Tx_almost_full = 3 Tx_almost_empty = 8 Rx_section_empty = Max FIFO size - 16 Rx_almost_full = 8 Rx_almost_empty = 8 //Cut Throught Mode, Set this Threshold to 0 to enable Store and Forward Mode Tx_section_full = 16 //Cut Throught Mode, Set this Threshold to 0 to enable Store and Forward Mode Rx_section_full = 16 */ IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(MY_TSE_BASE,(MY_TSE_TRANSMIT_FIFO_DEPTH-16)); IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(MY_TSE_BASE,3); IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(MY_TSE_BASE,8); IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(MY_TSE_BASE,(MY_TSE_RECEIVE_FIFO_DEPTH-16)); IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(MY_TSE_BASE,8); IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(MY_TSE_BASE,8); IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(MY_TSE_BASE,0); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(MY_TSE_BASE,0); //MAC地址配置 //MAC address is 00-1C-23-17-4A-CB /* Low word (bits 31:0) of MAC address */ IOWR_ALTERA_TSEMAC_MAC_0(MY_TSE_BASE,0x17231c00); /* High half-word (bits 47:32) of MAC address. Upper 16 bits reserved */ IOWR_ALTERA_TSEMAC_MAC_1(MY_TSE_BASE,0x0000cb4a); //MAC功能配置 /* //Maximum Frame Length is 1518 bytes Frm_length = 1518 //Minimum Inter Packet Gap is 12 bytes Tx_ipg_length = 12 //Maximum Pause Quanta Value for Flow Control Pause_quant = 0xFFFF //Set the MAC with the following option: // 100Mbps, User can get this information from the PHY status/PCS status //Full Duplex, User can get this information from the PHY status/PCS status //Padding Removal on Receive //CRC Removal //TX MAC Address Insertion on Transmit Packet //Select mac_0 and mac_1 as the source MAC Address Command_config Register = 0x00800220 */ IOWR_ALTERA_TSEMAC_FRM_LENGTH(MY_TSE_BASE,1518); IOWR_ALTERA_TSEMAC_TX_IPG_LENGTH(MY_TSE_BASE,12); IOWR_ALTERA_TSEMAC_PAUSE_QUANT(MY_TSE_BASE,0xffff); IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00800220); //MAC复位 //Set SW_RESET bit to 1 do { IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00802220); } while(IORD_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE) != 0x00800220); //MAC数据流发送和接收使能 do { //BIT15--loop_enable=1 IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00808223); temp = IORD_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE); } while(temp != 0x00808223); printf("Ethernet initial successful.\n"); } TSE的用户收发端的Avalon-ST接口都连接到了onchip-RAM上,实时观测到他们的收发数据帧是完全一致的。说明这个loopback功能和TSE收发已经完全正常了。