Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление PHY через MDC/MDIO
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
beles
Необходимо сделать проет, который бы читал/записывал данные из внутренних регистров PHY, при этом использовался бы интерфейс MDC/MDIO.
При подачи этих сигналов в режиме чтения физика ни как не реагирует. Сигналы формировал согласно стандарту. Тактовый сигнал менял от 25кГц до 3МГц, но реакции ни какой. Смотрел осциллографом, сигналы до физики доходят такие какие я подовал, после перехода в Z состояние и начало приема, на сигнале MDIO постоянно весит "1", т.к. на плате этот сигнал подтянут к питанию. Адрес физики использовал 0 (стандартный) и 7 (таким она хардово сконфигурирована), адрес регистра ставил любой (менял), реакции тоже ни какой.
Подскажите в чем может быть проблема?
Костян
Делал. Работало.

Вот Вам пример. Конфигурирование PHY на 100М линк
Код
----------------------------------------------------------------------------------

entity mii_mem is
    Port ( clk     : in  STD_LOGIC;
           en     : in  STD_LOGIC;
           addr : in  STD_LOGIC_VECTOR (6 downto 0);
           do     : out  STD_LOGIC
        );
end mii_mem;

architecture Behavioral of mii_mem is
  type rom_type is array (0 to 127) of std_logic;
  signal rom : rom_type :=
  (
    --preambl
    '1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
    --ST
    '0','1',
    --OP CODE
    '0','1',
    --PHY ADDR
    '0','0','0','0','0',
    --REG ADDR
    '0','0','0','0','0',
    --TAR
    '1','0',
    --DATA
    '0','0','1','0','0','0','0','0',
    --DATA
    '0','0','0','0','0','0','0','0',
    --post
    --'1','1','1','1',
    --preambl
    '1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
    --ST
    '0','1',
    --OP CODE
    '0','1',
    --PHY ADDR
    '0','0','0','0','0',
    --REG ADDR
    '0','0','0','0','0',
    --TAR
    '1','0',
    --DATA
    '1','0','1','0','0','0','0','0',
    --DATA
    '0','0','0','0','0','0','0','0'
    --post
    --'1','1','1','1'    
    );
    
attribute rom_style: string;
attribute rom_style of rom: signal is "distributed";

begin
  process(clk)
  begin
    if clk'event and clk = '1' then
      if en = '1' then
        do <= rom(conv_integer(addr));
      end if;
    end if;
  end process;

end Behavioral;


сигнал addr инкрементирутся по каждому clk
beles
Попробывал сделать как вы предложили, но конфигурировал на 10Мбит, не получилось. И зачем вы два раза подавали команду? первый на конфигурирование 100Мбит, а втрой на Reset + 100Мбит, разве после ресета все настройки физики не сбросятся? И производили ли вы чтение регистров?
cioma
Какой PHY используете?
beles
Использую отладочную плату от Xilinx ML507, физика Marvell 88E1111, плисина Virtex5 FX70T.
Так же пробывал на плате "Spartan-3E Starter Kit" с физикой SMSC LAN83C185, результат такой же, то есть реакции на команды не наблюдается.
Костян
Цитата(beles @ Jan 26 2009, 12:49) *
Попробывал сделать как вы предложили, но конфигурировал на 10Мбит, не получилось.

Если не ошибаюсь, при включении phy по умолчанию на 10Мбит настроена , если конечно Вы не подаете особую конфигурацию посредством пинов CONFIG (на плате вашей должны быть джамперы)

Цитата
физика Marvell 88E1111,

У меня на такой же PHY работает. laughing.gif

Цитата
И зачем вы два раза подавали команду? первый на конфигурирование 100Мбит, а втрой на Reset + 100Мбит,

Честно - не помню, давно писал. Так как даташита на PHY толкового нет, то переписывал по xapp1042 (полистайте его, там так же используется Marvell 88E1111)

Цитата
И производили ли вы чтение регистров?

нет. только запись
beles
> при включении phy по умолчанию на 10Мбит настроена
при включении у физики по умолчанию вытавлен режи опрделения скорости текущего соединения, как раз с помощью конфигурационных ног, по этому и выставлял скорость 10Мбит, т.к. подключал к 100 или 1000 Мбитной сети.

Все, разобрался, но не совсем. Физика реагирует на запосы подаваемые только с её адресом "00111", а на запрос с адресом "00000" не отвечает. Хотя в документации "Virtex-5 FPGA Embedded Tri-Mode Ethernet MAC User Guide.pdf" (UG194) указано следующее:
The PHYAD field for an MDIO frame is a 5-bit binary value capable of addressing 32
unique addresses. However, every MDIO slave must respond to physical address 0.
Почему в данном случае физика не реагирует на нулевой адре пока не понятно, буду разбираться...
cioma
Может стандарт IEEE 802.3 поможет - там должно быть описание MDI. Если мне не изменяет память, то встречал один PHY, для которого нулевой адрес означал отключение от MDI, но это был точно не Marvell
iosifk
Цитата(beles @ Jan 26 2009, 12:58) *
Подскажите в чем может быть проблема?

Добавлю, может оно и напрямую не относится к делу, но!
Посмотрите, сколько времени должен стоять сигнал сброс. У Микрела от этого сильно зависит, прочтется ли аппаратная зашивка...
удачи!
beles
После нескольких опытов с разными PHY от MARVELL, SMSC, AMD выяснилось что ни одна из них не реагирует на запросы с нулевым адресом (PHY_addr), при этом команды формировались как с FPGA (Spartan3E, Virtex5) так и с помощью процессора. При этом если задать адрес физики. заданный с помощью конфигурационных ножек (отличный от нуля), то все работает правильно.
Может быть PHY не должна отвечать на нулевой адрес, если её назначен другой адрес?
MKS
Здравствуйте.
Пытаюсь начать работать с PHY smsc 8700, по ходу возник вопрос по SMI интерфейсу програмирования.
Вот прямая ссылка на описание. Там на стр. 33 приведены временные диаграмы чтения записи регистров микросхемы. На них присутствует загадочный цикл Turn Around, что это за цикл и какова его длительность нигде информации нет. Может кто то прояснить эту ситуацию ? На всякий случай прикладываю снимок экрана с диаграмой.
Нажмите для просмотра прикрепленного файла
iosifk
Цитата(MKS @ Oct 23 2009, 13:47) *
На них присутствует загадочный цикл Turn Around, что это за цикл и какова его длительность нигде информации нет. Может кто то прояснить эту ситуацию ? На всякий случай прикладываю снимок экрана с диаграмой.


Стандартно термин Turn Around означает, что буфер выхода с третьим состоянием, должен переключиться из состояния "выход" в третье состояние или буфер входа-выхода в состояние чтения. Это делается ддля того, чтобы на шине данных не было столкновения двух буферов - одного в передатчике, другого в приемнике. А время этого цикла должно быть задано явно в даташите. На самом деле, там должно быть сказано, что Ваш передатчик устанавливается в 3-е состояние, и сказано, когда последует первый достоверный принимаемый бит.
Далее понятно. Это делается для всех синхронных шин, например для PCI...
Удачи...
MKS
Спасибо за разяснения, iosifk. Но тогда мне непонятно какой смысл термин turn around имеет при записи. Там ведь не происходит переключения буферов, или я что то неправильно понимаю ?
iosifk
Цитата(MKS @ Oct 23 2009, 14:34) *
Спасибо за разяснения, iosifk. Но тогда мне непонятно какой смысл термин turn around имеет при записи. Там ведь не происходит переключения буферов, или я что то неправильно понимаю ?


Надо посмотреть описание шины. Я сейчас не помню тонкости. Но, тогда, в исходном состоянии передатчик должен быть отключен от шины и быть в 3-м состоянии?
Костян
Цитата(MKS @ Oct 23 2009, 09:34) *
Спасибо за разяснения, iosifk. Но тогда мне непонятно какой смысл термин turn around имеет при записи. Там ведь не происходит переключения буферов, или я что то неправильно понимаю ?


Теоретически никакого... иногда turn around требуется после write data, чтобы приемник подтвердил принятие данных.


На практике для данного случае возможно

1. Сделано по образцу и подобию с циклом read

2. приемнику требуется некоторое время , чтобы после выставления адреса он был готов принять данные.

з.ы если уж очень любопытно, тогда ковырять стандарт
http://standards.ieee.org/getieee802/802.3.html
wolfman
Цитата(Костян @ Jan 26 2009, 23:56) *
Делал. Работало.

Вот Вам пример. Конфигурирование PHY на 100М линк
Код
----------------------------------------------------------------------------------

entity mii_mem is
    Port ( clk     : in  STD_LOGIC;
           en     : in  STD_LOGIC;
           addr : in  STD_LOGIC_VECTOR (6 downto 0);
           do     : out  STD_LOGIC
        );
end mii_mem;

architecture Behavioral of mii_mem is
  type rom_type is array (0 to 127) of std_logic;
  signal rom : rom_type :=
  (
    --preambl
    '1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
    --ST
    '0','1',
    --OP CODE
    '0','1',
    --PHY ADDR
    '0','0','0','0','0',
    --REG ADDR
    '0','0','0','0','0',
    --TAR
    '1','0',
    --DATA
    '0','0','1','0','0','0','0','0',
    --DATA
    '0','0','0','0','0','0','0','0',
    --post
    --'1','1','1','1',
    --preambl
    '1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
    --ST
    '0','1',
    --OP CODE
    '0','1',
    --PHY ADDR
    '0','0','0','0','0',
    --REG ADDR
    '0','0','0','0','0',
    --TAR
    '1','0',
    --DATA
    '1','0','1','0','0','0','0','0',
    --DATA
    '0','0','0','0','0','0','0','0'
    --post
    --'1','1','1','1'    
    );
    
attribute rom_style: string;
attribute rom_style of rom: signal is "distributed";

begin
  process(clk)
  begin
    if clk'event and clk = '1' then
      if en = '1' then
        do <= rom(conv_integer(addr));
      end if;
    end if;
  end process;

end Behavioral;


сигнал addr инкрементирутся по каждому clk



простите, а нет ли у вас примера для слейва?
MKS
Цитата(Костян @ Oct 23 2009, 14:11) *
....
з.ы если уж очень любопытно, тогда ковырять стандарт
http://standards.ieee.org/getieee802/802.3.html

Спасибо за ссылки на стандарт, обязательно посмотрю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.