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

ему надо от опоры в 25 МГц разогнать PLL на 125 МГц, и чтобы она стабильно залочилась.

короче, везде, где есть PLL, необходимо строго следить за reset-ами, их длительностями, и наличием lock-ов

Однако до того как я стал делать такой длинный (теперь ясно что такой и надо) резет - у меня работало на прием. И вообще, процессор Nios2 и самодельный UART хорошо работали при моих ожиданиях что там должно быть 125 МГц. Я даже отдельно замерял что 125 МГц есть, через делитель и оценивал длительность...

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


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

Несколько лет назад подробно разбирался со связкой 88E1111+CycloneIV, на этом форуме всё уже было с детальными пояснениями. Большое спасибо форумчанам, особенно vadimuzzz! Если есть уверенность, что разводка+подключение ПЛИС и марвела сделаны правильно, то дело в программировании регистров. У меня функция инициализации выглядела так (там кое-что лишнее, применительно к моей конкретной реализации + отладочная информация, но разобраться можно ):

 

alt_u32 t2=0;

int status=0;

 

IPADDR2[0]=192;

IPADDR2[1]=168;

IPADDR2[2]=1;

IPADDR2[3]=247;

 

GATE2[0]=192;

GATE2[1]=168;

GATE2[2]=1;

GATE2[3]=254;

 

MASK2[0]=255;

MASK2[1]=255;

MASK2[2]=255;

MASK2[3]=0;

 

MACADDR2[0]=0x00;

MACADDR2[1]=0x07;

MACADDR2[2]=0xab;

MACADDR2[3]=0xf0;

MACADDR2[4]=0x0d;

MACADDR2[5]=0xb2;

 

//Чтение регистра конфигурации TSE - регистр 0 - номер версии IP TSE (32 бита)

t2 = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE);

#ifdef DEBUG

alt_printf("TSE Command Reg : %x\n",t2);

#endif

 

alt_u32 t, r;

for (t=0;t<33;t++)

{

IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE2_BASE, t);

Delay(0xFFFF);

//alt_printf("Probing PHY at address %x ...\n", t);

r = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1);

if( r== 0x141 ) {

#ifdef DEBUG

alt_printf("Found Marvell 88E1111, PHY=%x\n", t);

#endif

break;

}

}

 

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

#ifdef DEBUG

alt_printf("Reg 27 : %x\n",t2);

#endif

t2 &= 0xFFF0;

 

IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x1B,t2|0xf); //f - GMII to Copper; 7 - GMII to fiber; e - GMII to SGMII(=fiber);

 

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14);//Extended PHY Specific Control Register

#ifdef DEBUG

alt_printf("Reg 20 : %x\n",t2);

#endif

 

IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14,t2|0x83);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs

 

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,26);//

#ifdef DEBUG

alt_printf("Reg 26 : %x\n",t2);

#endif

 

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0);

#ifdef DEBUG

alt_printf("Reg 0 : %x\n",t2);

#endif

 

 

IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2|PCS_CTL_sw

_reset);//Previous Operations Require SW Reset

 

do

{

Delay(0xFFFF);

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS);

//alt_printf("Reg 1 : %x\n",t2);

 

Delay(0xFFFF);

Delay(0xFFFF);

Delay(0xFFFF);

}

while((t2&(alt_u32)0x0004)==0);//wait for link-up

 

// Get the Rx and Tx SGDMA addresses

sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA2_TX_NAME);

if(!sgdma_tx_dev) {

#ifdef DEBUG

alt_printf("[triple_speed_ethernet_init] Error opening RX SGDMA\n");

#endif

}

 

sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA2_RX_NAME);

if(!sgdma_rx_dev) {

#ifdef DEBUG

alt_printf("[triple_speed_ethernet_init] Error opening TX SGDMA\n");

#endif

}

 

IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA2_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFT

WARERESET_MSK);

IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA2_RX_BASE, 0x0);

 

// reset the mac

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE , ALTERA_TSEMAC_CMD_SW_RESET_MSK | ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);

while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK)

{

}

 

 

// Initialize MAC registers

IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE2_BASE, ALTERA_TSE_MAX_FRAME_LENGTH);

IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE2_BASE, 8);

IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE2_BASE, 8);

IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE2_BASE, 8);

IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE2_BASE, 3);

IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE2_BASE, 0);

IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE2_BASE, 0);

IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE2_BASE,0);

IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE2_BASE,0);

 

IOWR_ALTERA_TSEMAC_MAC_0(TSE2_BASE,((int)(MACADDR2[0]) | (int)(MACADDR2[1] << 8) | (int)(MACADDR2[2] << 16) | (int)(MACADDR2[3] << 24)));

IOWR_ALTERA_TSEMAC_MAC_1(TSE2_BASE,(((int)(MACADDR2[4]) | (int)(MACADDR2[5] << 8)) & 0xFFFF));

 

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE2_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

);

 

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);

 

//объявляет буфер некешируемой областью памяти (устанавливает в 1 31-й бит адреса блока)

alt_u32 *up; //uncached_packet_payload;

up = (void *)alt_remap_uncached ( (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"

up, // starting write_address

0, // read until EOP - переносить пакет до конца данных

0);

 

 

while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA2_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]);

 

#ifdef DEBUG

t2 = IORD_ALTERA_TSEMAC_MAC_0(TSE2_BASE);

alt_printf("MAC 0 : %x\n",t2);

t2 = IORD_ALTERA_TSEMAC_MAC_1(TSE2_BASE);

alt_printf("MAC 1 : %x\n",t2);

t2 = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE2_BASE);

alt_printf("TSE Command Reg : %x\n",t2);

#endif

 

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


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

Несколько лет назад подробно разбирался со связкой 88E1111+CycloneIV, на этом форуме всё уже было с детальными пояснениями. Большое спасибо форумчанам, особенно vadimuzzz! Если есть уверенность, что разводка+подключение ПЛИС и марвела сделаны правильно, то дело в программировании регистров. У меня функция инициализации выглядела так (там кое-что лишнее, применительно к моей конкретной реализации + отладочная информация, но разобраться можно ):
Да, схему передирали с пары референс-дизайнов, подключили всё что даже к гигабиту не относится (TX_CLK), вижу что при подключении к 100-мегабитному интерфейсу у меня и клоки ровно в 5 раз замедляются (125->25) - всё как бы окей.

 

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14);//Extended PHY Specific Control Register

IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14,t2|0x83);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs

А что значат эти биты? RGMII timing control? И включение передатчика?

 

Где мне посмотреть что у меня выбран режим именно GMII/copper?

Читал описание регистра 27.3:0 (HWCFG_MODE) - его я задал конфигурационными пинами и младшие 4 бита равны 1111, что соответствует именно GMII to Copper.

27: 0x808F = 1000_0000_1000_1111

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


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

А что значат эти биты? RGMII timing control? И включение передатчика?

RGMII timing control - определяют задержку клока на TR/RX линиях в режиме RGMII, в режиме GMII не используются.

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


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

RGMII timing control - определяют задержку клока на TR/RX линиях в режиме RGMII, в режиме GMII не используются.
Ясно.

 

Я этот проект ковыряю уже пол года в фоновом режиме, я искренне не понимаю что и где и как еще посмотреть, т.к. судя по всему:

IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x1B,t2|0xf); //f - GMII to Copper; 7 - GMII to fiber; e - GMII to SGMII(=fiber);IOWR_ALTERA_TSEMAC_MDIO(TSE2_BASE,0,0x14,t2|0x83);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs

тут задается лишь режим в регистре 27 (у меня он верный) и включается передатчик в регистре 20, далее резет и полетели. Кажется я всё делаю верно и вычитав регистры я в этом убеждаюсь...

 

Что еще можете посоветовать проверить? Или какие ошибки еще поискать? TX_ER я уже на 0 посадил давно.

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


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

Извините за глупый вопрос. А пробовали проверять на готовом проекте? Сам начинал со стокового проекта данного кита

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


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

Извините за глупый вопрос. А пробовали проверять на готовом проекте? Сам начинал со стокового проекта данного кита
У меня прямо сейчас есть Cyclone IV GX Starter Kit и на нем я уже давно проверил проект Nios 2 + 88E1111 только там разведен лишь SGMII.

Я повторил как мартышка туториал и оно заработало, а вот сделать так чтобы работать без Nios 2 через свою логику так еще и через SGMII мне не удалось!

Ключевой момент в том что разведен там исключительно SGMII, а GMII/RGMII они не подключали вообще.

Хотел сначала сделать так чтобы проверить связку Cyclone IV через SGMII с 88E1111, чтобы потом реализовать свою платку именно так же через SGMII (если было бы проверено), но так и не удалось врубиться как же работать через SGMII...

 

Поэтому сделал свою платку, даже могу часть где подключаю ПЛИС + 88E1111 показать, проверил заинтересованный коллега - ошибок не увидел.

У меня есть возможность по сути работать в режимах GMII и RGMII. Надо попробовать, вдруг у меня линии битые и если повезет то в RGMII заработает.

 

Кажется выше я упоминал что через RMII таким образом я уже работал с ПЛИС, но это 100 мегабит и другой PHY другая ПЛИС. Там я сделал самодельный MAC и раз оно так хорошо работало то видимо контрольные суммы и пакеты формировать научился :)

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


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

Поэтому сделал свою платку, даже могу часть где подключаю ПЛИС + 88E1111 показать, проверил заинтересованный коллега - ошибок не увидел.

У меня есть возможность по сути работать в режимах GMII и RGMII. Надо попробовать, вдруг у меня линии битые и если повезет то в RGMII заработает.

 

А можете прислать или здесь выложить схему соединения плис с марвелом и часть из qsys, что относится к связке ниос+tse+всё остальное))

SGDMA используете?

 

потому как выложил ранее абсолютно рабочую конфигурацию для интерфейса GMII, и напрашивается вывод, что копаем не в том месте.

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


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

А можете прислать или здесь выложить схему соединения плис с марвелом и часть из qsys, что относится к связке ниос+tse+всё остальное))

SGDMA используете?

потому как выложил ранее абсолютно рабочую конфигурацию для интерфейса GMII, и напрашивается вывод, что копаем не в том месте.

Я не использую Nios, хотя когда разбирался - пытался его туда воткнуть вместе с TSE, думал что может помочь или упростить отладку. С Ethernet вполне реально работать со своим простейшим MAC.

Вечером обязательно скину схему!

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


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

Я не использую Nios, хотя когда разбирался - пытался его туда воткнуть вместе с TSE, думал что может помочь или упростить отладку. С Ethernet вполне реально работать со своим простейшим MAC.

Вечером обязательно скину схему!

 

Уже года два надеюсь, что вот ещё немножко, появится время - сяду и напишу свой МАС вместо TSE.... Эх, завидую белой завистью, что у Вас руки до этого дошли!

Давайте схему, а там посмотрим, может для начала с TSE будет проще - хотя бы убедиться, что с марвелом всё хорошо)))

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


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

Уже года два надеюсь, что вот ещё немножко, появится время - сяду и напишу свой МАС вместо TSE.... Эх, завидую белой завистью, что у Вас руки до этого дошли!
У меня настолько примитивный MAC, что он лишь формировалка UDP и считалка IP CRC и FCS...

Давайте схему, а там посмотрим, может для начала с TSE будет проще - хотя бы убедиться, что с марвелом всё хорошо)))
TSE можно задействовать без Nios 2 и без SGDMA и прочих ужасов? У меня не влезает туториаловский проект, как я ни пытался всё до минимума ужать...

 

Прилагаю часть схемы где на первой странице ПЛИС, а на второй - PHY...

my_horrible_ethernet_sch.pdf

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


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

AVR, надеюсь самописные модули были проверены на девкиатх, чтобы не ловить баги на новых платах. Вообще тсе не так сложен если разобраться, у нас сделана схема тсе + ниос + генератор удп пакетов на логике. По схеме, не понятен режим в котором она работает, пины CONFIG[6..0] стоят не понятно как.

 

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


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

я некоторое время назад уже выкладывал на форум свою инициализацию altera TSE (MAC) + 88e1111 (PHY) на verilog-е но она куда-то протерялась.

выложу ещё раз.

tse_config_2.v

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


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

AVR, надеюсь самописные модули были проверены на девкиатх, чтобы не ловить баги на новых платах. Вообще тсе не так сложен если разобраться, у нас сделана схема тсе + ниос + генератор удп пакетов на логике. По схеме, не понятен режим в котором она работает, пины CONFIG[6..0] стоят не понятно как.

И на девкитах, и signal tap и отдельный свой софт для CRC - всё в дело пошло.

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

Его можно увидеть на первой странице этой темы - там прочтенные регистры и этот конфиг туда в регистры ложится.

 

я некоторое время назад уже выкладывал на форум свою инициализацию altera TSE (MAC) + 88e1111 (PHY) на verilog-е но она куда-то протерялась.

выложу ещё раз.

tse_config_2.v

Спасибо, посмотрим, лишним не будет.

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


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

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

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

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

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

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

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

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

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

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