Здравствуйте.
возник вот какая проблема с использованием PHY_88E1111 + MAC_tse + Nios. В ниосе проект от уважаемого vadimzzz.
Когда подключаешся к сети то все нормально все пакеты ходят взад вперед, все работает, лампочки усердно мигают .
Собственно так проект и отладили до конца через общественную сеть.
Сложность возникла когда стали использовать Media Converter 10/100/1000Base-T to 1000Base-X.
Есть два конвертера, когда делаешь связку
общественная сеть --- КонвертерА --- оптика --- КонвертерВ -- ПК
то все работает как положено, все линки есть и сеть работает.
А вот когда подключаешь прибор например к КонвертеруА( или Б) то лампочки на конвертере горит только PWR и иного мигает
FDX (по описанию это означает коллизия). На плате прибора тоже все лампочки гаснут и иного мигает лампочка Duplex как сказано в описание тоже означает что коллизия.
ни какое шаманство с регистрами не поменяло состояние. Еще заметил что часто бывает что первое чтение после программного сброса возвращает нормальные записи в реситрах,
а последующие чтения рестров возвращают всегда фффф. При просмотре сигналов видно что действительно марвел не отвчает по шине мдио/млс.
при подключении прибора к ПК на прямую прямым кабелем светодиоды маргают что линк есть, но данные идут странные
вот когда связь есть т.е. общественная сеть
http://gyazo.com/05d003d967dae4be0368f02ece9c225dа вот когда анпрямую к ПК
http://gyazo.com/114e94aa45b6d8446475cd91f440cf26видно что потерялась преамбула
я так понимаю что марвел должен был автоматом поменять полярность.. или что то нужно еще сделать чтобы это произошло?
вот рисунок дампа регистров взятых и марвела
http://gyazo.com/ac80ec5b599128cc1efa4ab7eabe9288здесь показан дамп регистров когда прибор подключен к сети и с линком все нормально
http://gyazo.com/c04829de874a1f808321ff8f5d146e03документация на конвертер
http://gyazo.com/d313c01d2734b09e4c8329fceed85d16http://gyazo.com/4c2a277e89eec85bf7ba3d7974a13a04фотка конвертера при подключении его к прибору
http://gyazo.com/63121c90c10225904d2e760dbd4445a6вот код подключения модуля
Код
module DevEthernet(
// Clock
input CLOCK_50,
// reset
input reset_n,
// Ethernet
output NET0_GTX_CLK,
output NET0_MDC,
inout NET0_MDIO,
output NET0_RESET_N,
input NET0_RX_CLK,
input [3: 0] NET0_RX_DATA,
input NET0_RX_DV,
output [3: 0] NET0_TX_DATA,
output NET0_TX_EN
);
wire sys_clk, clk_125, clk_25, clk_2p5, clk_200, tx_clk;
wire core_reset_n;
wire mdc, mdio_in, mdio_oen, mdio_out;
wire eth_mode, ena_10;
// --
wire udp_stack_fifo_start_to_ethernet; // udp_stack_fifo.start_to_ethernet
wire [7:0] udp_stack_fifo_rd_data; // .rd_data
wire udp_stack_fifo_rdreq; // .rdreq
wire udp_stack_fifo_rdempty; // .rdempty
wire [10:0] udp_stack_fifo_rdusedw; // .rdusedw
wire [7:0] udp_stack_fifo_wr_data; // .wr_data
wire udp_stack_fifo_wrreq; // .wrreq
wire udp_stack_fifo_wrfull; // .wrfull
wire udp_stack_eth_cntrl_export; // udp_stack_eth_cntrl.export
assign mdio_in = NET0_MDIO;
assign NET0_MDC = mdc;
assign NET0_MDIO = mdio_oen ? 1'bz : mdio_out;
assign NET0_RESET_N = core_reset_n & udp_stack_eth_cntrl_export;
assign udp_stack_fifo_start_to_ethernet = 1'b0;
assign udp_stack_fifo_rdreq = 1'b0;
assign udp_stack_fifo_wr_data = 8'h00;
assign udp_stack_fifo_wrreq = 1'b0;
pll pll_inst(
.areset(~reset_n),
.inclk0(CLOCK_50),
.c0(sys_clk),
.c1(clk_125),
.c2(clk_25),
.c3(clk_2p5),
.c4(clk_200),
.locked(core_reset_n)
);
assign tx_clk = eth_mode ? clk_125 : // GbE Mode = 125MHz clock
ena_10 ? clk_2p5 : // 10Mb Mode = 2.5MHz clock
clk_25; // 100Mb Mode = 25 MHz clock
ddio_out ddio_out_inst(
.datain_h(1'b1),
.datain_l(1'b0),
.outclock(tx_clk),
.dataout(NET0_GTX_CLK)
);
nios_system system_inst(
.clk_clk (sys_clk), // clk.clk
.reset_reset_n (core_reset_n), // reset.reset_n
.reset_tse_reset_n (udp_stack_eth_cntrl_export),
.tse_export_rx_control (NET0_RX_DV), // tse_mac_conduit.rx_control
.tse_export_rx_clk (NET0_RX_CLK), // .rx_clk
.tse_export_tx_control (NET0_TX_EN), // .tx_control
.tse_export_tx_clk (tx_clk), // .tx_clk
.tse_export_rgmii_out (NET0_TX_DATA), // .rgmii_out
.tse_export_rgmii_in (NET0_RX_DATA), // .rgmii_in
.tse_export_ena_10 (ena_10), // .ena_10
.tse_export_eth_mode (eth_mode), // .eth_mode
.tse_export_mdio_in (mdio_in), // .mdio_in
.tse_export_mdio_out (mdio_out), // .mdio_out
.tse_export_mdc (mdc), // .mdc
.tse_export_mdio_oen (mdio_oen), // .mdio_oen
// --
.udp_stack_fifo_start_to_ethernet(udp_stack_fifo_start_to_ethernet), // udp_stack_fifo.start_to_ethernet
.udp_stack_fifo_rd_data(udp_stack_fifo_rd_data), // .rd_data
.udp_stack_fifo_rdreq(udp_stack_fifo_rdreq), // .rdreq
.udp_stack_fifo_rdempty(udp_stack_fifo_rdempty), // .rdempty
.udp_stack_fifo_rdusedw(udp_stack_fifo_rdusedw), // .rdusedw
.udp_stack_fifo_wr_data(udp_stack_fifo_wr_data), // .wr_data
.udp_stack_fifo_wrreq(udp_stack_fifo_wrreq), // .wrreq
.udp_stack_fifo_wrfull(udp_stack_fifo_wrfull), // .wrfull
.udp_stack_eth_cntrl_export(udp_stack_eth_cntrl_export) // udp_stack_eth_cntrl.export
);
endmodule
вот код инициализации
Код
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_BASE, PHY);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B);//Extended PHY Specific Status Register
t2 &= 0xFFF0;
IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B,t2|0xB);//RGMII to Copper
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14);//Extended PHY Specific Control Register
IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14,t2|0x82);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL);
IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset
do
{
for(i = 0; i < sizeof(reg_phy); i++){
reg_phy[i] = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, i);
}
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS);
}
не могу понять куда дальше копать, в чем проблема что марвел не хочет подключится к прибору?
Как/чем можно посмотреть почему phy не поднял линк?