На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Hardware:
1. Если вы не уверены в правильности ответа, напишите об этом, или не отвечайте вообще, не давайте дезинформацию!
2. Не забывайте указывать полное наименование, модель, изготовителя и краткие характеристики оборудования.
3. Аргументируйте свое мнение - приводите развернутое высказывание или источник информации.
4. Прежде чем задать вопрос посмотрите, нет ли ответа на него на перечисленных ниже ресурсах:
FAQ
Полезные ссылки
www.ixbt.com
www.overclockers.ru
www.fcenter.ru
www.3dnews.ru
www.thg.ru
www.nvworld.ru
www.radeon2.ru

Здесь вы можете выразить мнение о модераторе этого раздела, ^D^ima.
Модераторы: DimA3
  
> проблемы с получением доступа к EEPROM у чипа i82546 (эзернет)
    Мучаю этот нещасный интеловский изернет (82546GB) с его епромом выносным.

    Столкнулся с непоняткой: по какой-то причине чип (контроллер интеловский) не даёт разрешение на работу с его епромом. Хотя я всё делаю по инструкции. (интеловский контроллер выступает в роли Master(SPI) )

    Вот в даташите написано:

    To directly access the eeprom, software should follow these steps:
    1. Write a 1b to the EEPROM request bit (EECD.REQ)
    2. Read the EEPROM grant bit (EECD.GNT) until it becomes 1b. It remains 0b as long as the hardware is accessing the EEPROM.
    3. можете читать и писать теперь

    Вот мой код:

    (
    в регистре EECD:
    6 бит это REQ,
    7 бит это GNT,
    5-4 биты это FWE (доступ на запись)
    )

    (
    функции InDword и OutDword соответственно в порты пишут и читают.
    )

    ExpandedWrap disabled
      /* ----------------------------------------------------------------- */
      void GntEEPROMAcces( DWORD *EECDAddr )
      {
      DWORD Reg;
       
      /* reset REQ, GNT and FWE */
      FreeEEPROMAccess( EECDAddr ); //(тут просто нолики в эти биты записываются для надёжности)
       
      /* 1b to REQ */
      Reg = InDword( *EECDAddr );
      Reg = Reg | 0x40;
      OutDword( Reg, *EECDAddr );
       
      /* waiting 1b from GNT */
      while ( 1 ) {
      Reg = InDword( *EECDAddr );
      if ( Reg & 0x80 ) break;
      }
       
      /* 10b to FWE */
      Reg = InDword( *EECDAddr );
      Reg = Reg & 0xFFFFFFCF;
      Reg = Reg & 0x20;
      OutDword( Reg, *EECDAddr );
       
      return;
      } /* --------------------------------------------------------------- */

    Вот и весь урюк в том, что вот вот этой еденицы в GNT я могу ждать хоть до завтрашнего утра.. не ставит он её и всё тут.

    ЗЫ
    на всякий:
    EECD это 32 битный регистр и ввод/вывод у него тоже 32-битный.
    ЗЫ2
    SPI тут не причём! до него дело ещё не дошло! я пока общаюсь только с Master чипом
      Цитата Arisu @
      Мучаю этот нещасный интеловский изернет (82546GB) с его епромом выносным.

      Столкнулся с непоняткой: по какой-то причине чип (контроллер интеловский) не даёт разрешение на работу с его епромом. Хотя я всё делаю по инструкции. (интеловский контроллер выступает в роли Master(SPI) )
      ....

      если я Вас правильно понял конечно же...
      Что говорит даташит на данную милкосхему ? Обчно в даташитах есть примеры работы с переферией. Обычно в епром пишут запретив прерывания, и посылая строгую магическую последовательность (зависит от самого производителя)... Дабы защититься от самопроизвольной записи при сбоях...

      с уважением
      (круглый)
        блин. пишу же что конкретно ЭТО не SPI ещё. это уровнем выше. как писать в микруху я знаю )) делал уже. НО вот это дренной контроллер, который выступает в роли SPI Master - не даёт доступа к микрухе слэйву.

        У контроллера есть регистр для запроса доступа к микрухе (ну типа что бы знать использует он её сам сейчас или нет) .. это бит REQ
        И если контроллеру микруха сейчас нафег не сдалась, то он возвращает 1б в регистр GNT.

        но ничерта он туда 1 не возвращает )) а пока он этого не сделает - я не имею доступа к контактам SPI (Di, Do, Sk, Cs)
          Попробуй вставить задержки между операциями in/out. Сделай
          программу помедленнее.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0546 ]   [ 15 queries used ]   [ Generated: 27.04.24, 14:47 GMT ]