Перейти к содержанию
    

поправил для передатчика

set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}]

насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поправил для передатчика

set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}]

насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma

Спасибо. Я виноват. Мог-бы и сам заметить опечатку.

Сигналтапом нет возможности.

Пробую другие варианты системы...

Если не сложно посоветуйте пожалуйста где можно почитать как строится скрипт констрейнов .sdc. Совсем смутно в этом ориентируюсь.

Изменено пользователем Acvarif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Железо перепроовал по всякому (разные процессоры и т.п) Всеравно 88e1111 виснет на приемнике. В то же время на DE0Nano + ksz8721 и приемник и передатчик работает на любом железе и при небольших вариациях констрейнов без проблем.

Нашел пару документов

1. http://www.altera.com/literature/ug/ug_tq_tutorial.pdf

2. http://embedders.org/sites/default/files/T...for_dummies.pdf

Попробую проанализировать стандартный пример web сервера. Пример работает нормально. Но там столько наворочено...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты.

 

1.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

np_tse_mac *pmac= (np_tse_mac *) TSE_MAC_BASE;

 

void TseMacInit()

{

...

...

pmac->COMMAND_CONFIG = ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK;

...

...

}

 

 

2.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void TseMacInit()

{

...

...

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);

...

...

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты.

во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш,

например установкой breakpoint

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш,

например установкой breakpoint

 

т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD?

Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр?

Изменено пользователем doom13

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:

 

Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать...

 

Элементная база: Cyclone III, Marvell 88E1111, SDRAM

В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить.

Скорость передачи: 48 МБ/с = 380 Мбит/с

 

Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя?

 

Подскажите в каком направление двигаться, заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:

 

Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать...

 

Элементная база: Cyclone III, Marvell 88E1111, SDRAM

В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить.

Скорость передачи: 48 МБ/с = 380 Мбит/с

 

Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя?

 

Подскажите в каком направление двигаться, заранее спасибо.

 

Начать с передачи-приёма данных с помощью ядра TSE, выше выкладывали рабочий драйвер, а к нему уже привинтить реализацию UDP.

На вход мегафункции TSE подаётся готовый пакет со всеми заголовками, IP-crc и UDP-crc. TSE считает только контрольную сумму всего пакета (FRAME CHECK SEQUENCE), может заменять мак-адрес передатчика и при приёме может осуществлять фильтрацию мак-адресов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD?

можно, используйте функцию alt_remap_uncached. иногда можно кэш данных вообще выбросить без ущерба для производительности, зависит от типа памяти.

Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр?

если используете указатель, значит работаете с памятью. вот компилятор и считает себя в праве оптимизировать доступ. если это не совсем то, что вы от него желаете, надо бить его иногда по рукам. в HAL для этого есть несколько функций:

alt_dcache_flush()

alt_dcache_flush_all()

alt_icache_flush()

alt_icache_flush_all()

alt_remap_cached()

alt_remap_uncached()

alt_uncached_free()

alt_uncached_malloc()

 

Элементная база: Cyclone III, Marvell 88E1111, SDRAM

В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить.

Скорость передачи: 48 МБ/с = 380 Мбит/с

я в этой теме выкладывал пример проекта. после небольшой доработки напильником, из него можно выжать примерно вдвое больше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите, пожалуйста, разобраться с приемом TSE.

За основу взят проект уважаемого VadimZZZ.

Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.

 

Передача работает.

Приема нет

При PING ллаты (broadcast) не попадаю в обработчик прерывания.

Код выкладываю.

eth_driver.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите, пожалуйста, разобраться с приемом TSE.

За основу взят проект уважаемого VadimZZZ.

Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.

 

Передача работает.

Приема нет

При PING ллаты (broadcast) не попадаю в обработчик прерывания.

Код выкладываю.

 

Вообще не заходит в прерывание или заходит один раз при старте? Если заходит один раз - где-то ошибка с sgdma, разрешено ли прерывание при возникновении ошибки в макросе ALTERA_TSE_SGDMA_INTR_MASK?

 

Я бы построил обработчик прерывания несколько иначе, см. ug_embedded_ip.pdf подраздел Building and Updating Descriptor List.

alt_sgdma_descriptor * pCurrDescRx = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST];
alt_sgdma_descriptor * pNextDescRx = &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST];
char *rx_buff;

int SgDMARx_Isr(void* context, alt_u32 id)
{
    alt_u32 data;
    alt_u32 *uncached_packet;
    alt_sgdma_descriptor *pDescRx;
    alt_u32 desc_stat = 0;

    data = IORD_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE );
    data &= ~(ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_RUN_MSK);
    IOWR_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE, data );

    if(IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK)
    {
        IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE, 0);
        desc_stat = IORD_ALTERA_TSE_SGDMA_DESC_STATUS(pCurrDescRx);
        if(desc_stat & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK)
        {
            pCurrDescRx->status &= ~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK;
            //,,,  (ОБРАБОТКА ПРИНЯТОГО ПАКЕТА)
        }
        uncached_packet = (alt_u32 *)alt_remap_cached((volatile void*) rx_buff, 4);
        alt_avalon_sgdma_construct_stream_to_mem_desc(pCurrDescRx, pNextDescRx,    uncached_packet, 0, 0);
        alt_dcache_flush(uncached_packet, 4);
        while (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK)
        ;    
        alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, pCurrDescRx);
    }
    return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Порядок действий:

1) В режиме DEBUG устанавливается точка останова в начале обработчика

прерывания

int tse_sgdmaRx_isr(void * context, alt_u32 irqnum)

2) Запускается программа

int main()

{

alt_u32 t=0;

 

alt_printf("Hello from NIOS\n");

MAC_init();

while (1){ }

return 0;

}

3) Затем с PC подается ARP-запрос:

Ping 192.168.1.2

4) На точку останова в обработчике ни разу не попасть!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не попасть при приема в обработчик прерывания.

(для Cyclone IV, SGMI, Marvell 88e1111)

 

int MAC_init()

{

alt_u32 ,t2=0;

int status=0;

p_counter=0;

 

IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TSE_MAC_BASE, 0);

 

// PHY and other board peripherial initialization

IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY);

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B); //Extended PHY Specific Status Register

t2 &= 0xFFF0;

 

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B,t2 | 0x4);//SGMII without clock to Copper

 

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14); // Disable RGMII Timing Control

t2 &= ~0x82; //marvell_cfg_sgmii

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14, t2);

 

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL);// PHY reset

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset

 

if((IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS) & PCS_ST_an_done) == 0)

{ IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL + 16, 0x78);

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL);

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);

}

// Without next string don't work reading packet

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE);

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE,t2 | 0x03); // PCS SGMII mode enabled

 

do {

Delay(0xFFFFF);

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS);

}while((t2&0x04)==0); //wait for link-up

 

// Get the Rx and Tx SGDMA addresses

sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME);

sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME);

IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTWARERESET_MSK);

IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x0);

 

// reset the mac

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_SW_RESET_MSK | ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK );

while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK);

 

// Initialize MAC registers

IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);

IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8);

IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8);

IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE, 8);

IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE, 3);

IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_TRANSMIT_FIFO_DEPTH - 16); //1024/4;

IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0); 32/4; // start transmit when there are 48 bytes

IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); //4000/4);

IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 0);

IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_

MSK);

//IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,0);

IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_

MSK);

//IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,0);

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK | ALTERA_TSEMAC_CMD_PAD_EN_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);//???ALTERA_TSEMAC_CMD_PROMIS_EN_MSK

IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xED << 16) | (int)(0x19 << 24)));

IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x05) | (int)(0x9B << 8)) & 0xFFFF));

 

alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_TSE_SGDMA_INTR_MASK, sgdma_rx_dev);

 

alt_u32 *uncached_packet_payload;

 

uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);

alt_avalon_sgdma_construct_stream_to_mem_desc(

(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with

(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next"

uncached_packet_payload, // starting write_address

0, // read until EOP

0);

while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );

t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);

 

sem=0;

return status;

}

//---------------------------------------------------------------------------------------------

int tse_sgdmaRx_isr(void * context, alt_u32 irqnum)

{

alt_u32 t2=0;

alt_u32 *uncached_packet_payload;

t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE);

if (t2 & (ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK |

ALTERA_AVALON_SGDMA_STATUS_DESC_COMPLETED_MSK))

{

p_counter++;

alt_printf("Packet counter:%x\n",p_counter);

IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_STATUS_CHAIN_C

OMPLETED_MSK);

t2=IORD_ALTERA_TSE_SGDMA_DESC_STATUS(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);

/*check status and handle packet*/

if( (t2 &

(ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK |

ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_PARITY_MSK |

ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_OVERFLOW_MSK |

ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_SYNC_MSK |

ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_UEOP_MSK |

ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MEOP_MSK |

ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MSOP_MSK ) ) == 0)

{

t2=IORD_16DIRECT(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].actual_bytes_transferred, 0)-2;

CheckPacket(pkt,t2);

}

else

{

alt_printf("RX descriptor reported error. Packet dropped\n");

}

uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);

alt_avalon_sgdma_construct_stream_to_mem_desc(

(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with

(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next"

uncached_packet_payload, // starting write_address

0, // read until EOP

0); // don't write to constant address

t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &des[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);

}

return 0;

}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите, пожалуйста, разобраться с приемом TSE.

За основу взят проект уважаемого VadimZZZ.

Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.

 

Передача работает.

Приема нет

При PING ллаты (broadcast) не попадаю в обработчик прерывания.

Код выкладываю.

 

Дурацкий вопрос - а констрейны для приема прописали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

возник вот какая проблема с использованием 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/d313c01d2734b09e4c8329fceed85d16

http://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 не поднял линк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...