Необходима реализация обмена ПК-ПЛИС по Ethernet.
Имеется дев.борд Стратикс 4.
Нашел в форуме такую фразу от vadimuzzz:
Цитата
Последовательность запуска марвеловского PHY такая:
1. Запись по адресу 0 значения 0x8000 (SwRst==1)
2. Задержка
3. Запись по адресу 0 значения 0х1000 (AutoNeg==1)
4. Задержка
5. Чтение значения из адреса 1, проверка бита 2 (Link==1), если не установлен - 1)
6. Запись по адресу 27 нижних бит [3:0] == 4'b1111 (GMII,copper)//смотреть доки на плату, это для девборды циклон-3!
7. При RGMII IF - запись по адресу 20 прочитанного значения с установленными битами 7,1//смотреть доки на плату, это для девборды циклон-3!
8. Повторять пункты 1-5, до установления линка. (SwRst)
1. Запись по адресу 0 значения 0x8000 (SwRst==1)
2. Задержка
3. Запись по адресу 0 значения 0х1000 (AutoNeg==1)
4. Задержка
5. Чтение значения из адреса 1, проверка бита 2 (Link==1), если не установлен - 1)
6. Запись по адресу 27 нижних бит [3:0] == 4'b1111 (GMII,copper)//смотреть доки на плату, это для девборды циклон-3!
7. При RGMII IF - запись по адресу 20 прочитанного значения с установленными битами 7,1//смотреть доки на плату, это для девборды циклон-3!
8. Повторять пункты 1-5, до установления линка. (SwRst)
В Квартусе создал систему:
Нажмите для просмотра прикрепленного файла
Настройки TSE:
Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла
В Ниосе пытаюсь инициализировать железо, а именно для начала добиться линка:
Код
alt_u32 t2=0;
IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TRIPLE_SPEED_ETHERNET_0_BASE, 0); // PHY and other board peripheral initialization
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TRIPLE_SPEED_ETHERNET_0_BASE, PHY);
do
{
// Control Register .15 = 1 - Reset
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, 0x8000);
Delay(0xFFFF);
// (.13=0, .6=1) - 1000 Mbps, .12=1 - Enable Auto-Negatiation,
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, 0x1040);
Delay(0xFFFF);
// read Control Register
t2 = IORD_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 1);
Delay(0xFFFF);
// Control Register .15 = 1 - Reset
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, t2 | 0x8000);
Delay(0xFFFF);
// read Staus Register
t2 = IORD_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 1);
alt_printf("Reg 1 : %x\n",t2);
//check Link
if( (t2&0x0004)==0 )
{
// Control Register .15 = 1 - Reset
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, t2 | 0x8000);
Delay(0xFFFF);
}
// .15=1 - Copper, (.3:.0)='0100' - SGMII without Clock with SGMII Auto-Neg to copper
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 27, 0x8004);
Delay(0xFFFF);
// read Staus Register
t2 = IORD_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 1);
alt_printf("Reg 1 : %x\n",t2);
}
while( (t2&0x0004)==0 );
IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TRIPLE_SPEED_ETHERNET_0_BASE, 0); // PHY and other board peripheral initialization
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TRIPLE_SPEED_ETHERNET_0_BASE, PHY);
do
{
// Control Register .15 = 1 - Reset
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, 0x8000);
Delay(0xFFFF);
// (.13=0, .6=1) - 1000 Mbps, .12=1 - Enable Auto-Negatiation,
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, 0x1040);
Delay(0xFFFF);
// read Control Register
t2 = IORD_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 1);
Delay(0xFFFF);
// Control Register .15 = 1 - Reset
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, t2 | 0x8000);
Delay(0xFFFF);
// read Staus Register
t2 = IORD_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 1);
alt_printf("Reg 1 : %x\n",t2);
//check Link
if( (t2&0x0004)==0 )
{
// Control Register .15 = 1 - Reset
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 0, t2 | 0x8000);
Delay(0xFFFF);
}
// .15=1 - Copper, (.3:.0)='0100' - SGMII without Clock with SGMII Auto-Neg to copper
IOWR_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 27, 0x8004);
Delay(0xFFFF);
// read Staus Register
t2 = IORD_ALTERA_TSEMAC_MDIO(TRIPLE_SPEED_ETHERNET_0_BASE, 0, 1);
alt_printf("Reg 1 : %x\n",t2);
}
while( (t2&0x0004)==0 );
в итоге на экране сполшные 9 выводятся.
Подскажите что-нибудь по этому поводу.