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

пакетное чтение

Здраствуйте всем. подскажите с вопросом.

Сделал свое PCI устройство. Оно поддерживает только одиночные передачи.

Имеет некоторое ПЗУ, отображаемое на память.

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

У меня при выставлении сигнала TRDY я выставляю одновременно STOP. но все равно данные передаеются некорректно.

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


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

Здраствуйте всем. подскажите с вопросом.

Сделал свое PCI устройство. Оно поддерживает только одиночные передачи.

Имеет некоторое ПЗУ, отображаемое на память.

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

У меня при выставлении сигнала TRDY я выставляю одновременно STOP. но все равно данные передаеются некорректно.

А кто из вашего устройства пакетами читает??? Сама система (чипсет, в память системы) пакетами читать не умеет, я не встречал ни одного чипсета, который мог бы пакетами читать... (жаль, что такой режим не предусмотрен =()

 

А вообще по делу:

Вы держите сигнал STOP до отпускания мастером сигнала FRAME?? Вам нужно после первого такта, в котором обнаружите сигнал IRDY активным (естесственно Ваши сигналы TRDY и STOP тоже должны быть активны в данный момент) отпустить TRDY, а STOP отпускать только в случае отсутствия сигнала FRAME, иначе посыпятся ложные фазы данных!

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


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

спасибо, что ответили. Смысл в том, что пакетами мою память читает другое устройство, и это я изменить не могу. =(

С TRDY и IRDY я поступаю так как Вы говорите. А вот STOP отпукаю вместе с TRDY, т.е. не жду frame.

Вопрос такой:если мастер читает пакетно 2 dword. если передать 1 dword данных выставив одновременно с TRDY STOP,то мастер перезапросит данные с адреса 2 dword или опять повторит пакетное чтение с адреса первого dword.

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


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

спасибо, что ответили. Смысл в том, что пакетами мою память читает другое устройство, и это я изменить не могу. =(

С TRDY и IRDY я поступаю так как Вы говорите. А вот STOP отпукаю вместе с TRDY, т.е. не жду frame.

Вопрос такой:если мастер читает пакетно 2 dword. если передать 1 dword данных выставив одновременно с TRDY STOP,то мастер перезапросит данные с адреса 2 dword или опять повторит пакетное чтение с адреса первого dword.

Если мастер сделан нормально, то он запросит второе dword.

 

Выдержка из PCI Specification:

В заключение, перечислим следующие общие правила при управлении сигналами FRAME#, IRDY#, TRDY#

и STOP# во всех транзакциях PCI:

1. Всякий раз, когда сигнал STOP# становится активным, FRAME# должен перейти в неактивное состояние

как можно скорее, в соответствии с правилами такого установления (то есть IRDY# должен быть

активным). Сигнал FRAME# должен стать активным после перехода STOP# в неактивное состояние как

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

попытки установить связь в интервалах времени между переходом сигнала STOP# в активное состояние, а

сигнала FRAME# - в неактивное но при этом оно должно сохранять активным сигнал STOP#, пока

FRAME# не станет неактивным. Когда мастер обнаружил, что активен STOP#, он должен установить в

неактивное состояние сигнал FRAME# в первом цикле, начиная с которого стал активным IRDY#.

Установка в активное состояние IRDY# (а, следовательно, установка FRAME# в неактивное состояние)

может произойти как следствие нормального поведения сигнала IRDY# мастера (при условии, что

транзакция не была прервана целевым устройством), и может быть задержана нулевым или большим

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

качестве альтернативы, мастер может установить сигнал IRDY# в активное состояние немедленно (даже

без подготовки к завершению передачи данных), при условии, что TRDY# - неактивный, таким образом

показывая, что больше не будет никаких дальнейших передач данных.

2. Будучи установленным, STOP# должен остаться активным до тех пор, пока FRAME# не перейдет в

неактивное состояние, после чего STOP# также должен стать неактивным.

3. В течение заключительной фазы данных транзакции (FRAME# неактивный и IRDY# активен), любой

фронт синхроимпульса, на котором сигналы STOP# и TRDY# переходят в активное состояние, становится

последним циклом транзакции, а сигнал IRDY# становится неактивным по следующему положительному

фронту (таким образом, создается цикл ожидания и определяется конец транзакции).

4. Мастер должен повторить запрос, который был завершен целевым устройством (за исключением

аварийного прекращения работы целевым устройством) по адресам следующих еще не переданных

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

мастер может не повторять запрос.

5. Если целевое устройство установило в активное состояние сигналы TRDY# или STOP#, то оно не должно

изменять DEVSEL#, TRDY# или STOP# до тех пор, пока не завершится текущая фаза данных.

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


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

внес изменения в устройство, оно теперь завершет пакетное чтение как сказано в спецификации тип disconnect-A т.е. завепешение транзакции посл передачи 1 dword данных. Но проблема осталась.

Я в DOS читаю память моего устройства с помощью инструкции MOVQ т.е. читаю 8 байт при этом читается 2 раза 1 dword. Т.е. получается, что мастер все время устанавливает адрес 1 dwordа.

Никтом не может подсказать как ведет себя PCI в таком случае?

Буду благодарен за ЛЮБУЮ помошь.

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


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

внес изменения в устройство, оно теперь завершет пакетное чтение как сказано в спецификации тип disconnect-A т.е. завепешение транзакции посл передачи 1 dword данных. Но проблема осталась.

Я в DOS читаю память моего устройства с помощью инструкции MOVQ т.е. читаю 8 байт при этом читается 2 раза 1 dword. Т.е. получается, что мастер все время устанавливает адрес 1 dwordа.

Никтом не может подсказать как ведет себя PCI в таком случае?

Буду благодарен за ЛЮБУЮ помошь.

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

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


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

Но ведь в спецификации(и в приведенной вами цитате) сказано ,что

" Мастер должен повторить запрос, который был завершен целевым устройством (за исключением

аварийного прекращения работы целевым устройством) по адресам следующих еще не переданных

данных, если он, конечно, предполагает полностью завершить запрос."

Т.е. получается, что чипсет не соответсвует спецификции?

На самом деле я пробовал на разных чипсетах - тот же результат. причем результат стабильный.

У меня есть предположение, может я что -то не так делаю, что мастер опять выставляет адрес первого dwordа.Но я смотрел осциллографом, все соответствует спецификации.

Если я запрещею декодирование адреса в своем устройстве, то эта область памяти читается верно (все 8 байт), а если разрешаю то два раза читается 1 dword кождой пары dword ов.

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


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

Но ведь в спецификации(и в приведенной вами цитате) сказано ,что

" Мастер должен повторить запрос, который был завершен целевым устройством (за исключением

аварийного прекращения работы целевым устройством) по адресам следующих еще не переданных

данных, если он, конечно, предполагает полностью завершить запрос."

Т.е. получается, что чипсет не соответсвует спецификции?

На самом деле я пробовал на разных чипсетах - тот же результат. причем результат стабильный.

У меня есть предположение, может я что -то не так делаю, что мастер опять выставляет адрес первого dwordа.Но я смотрел осциллографом, все соответствует спецификации.

Если я запрещею декодирование адреса в своем устройстве, то эта область памяти читается верно (все 8 байт), а если разрешаю то два раза читается 1 dword кождой пары dword ов.

Полагаю, что чипсет начинает читать 1 dword потому, что он не может разделить команду MOVQ на две итерации и при неудачном завершении MOVQ, операция должна повторится еще раз сначала. И к тому-же, как я говорил ранее, команда MOVQ не есть пакетное чтение, а исключение из спецификации.

А зачем Вам в 32-разрядной системе вообще пользоваться 64-разрядными командами??

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


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

Спасибо. за помощь. Я уже разобрался с проблемой. Смысл был в том. что у меня сигнал TRDY# держался 2 такта (моя ошибка).Поэтому мастер на каждый такт считывал по dword , т.е. одни и те же денные, поэтому и не повторял запрос. Сделал TRDY# активным в течении одного такта и все заработало.

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


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

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

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

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

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

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

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

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

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

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