Ох.. извиняюсь за мой русский/английский, ну не дружу я с человеческими языками..
Т.е. нужны только адреса? А разве 031 не должна ответить? По идее проц выставил адрес и что-то точно ответит, либо тайм аут..
Вид для печати
Тут такое дело, что адресный обмен происходит только при активном SYNC. Т.е. если после выставления адреса и выставления DIN, не было ответа RPLY при активном SYNC, то ничего не прочитано. Также при записи по сигналу DOUT, вроде процессор выставил данные для записи, выставил DOUT, но если ответа RPLY не было, то и запись не произошла. Есть ещё цикл обмена, который называется "чтение-модификация-запись", т.е. если надо прочесть данные по конкретному адресу, модифицировать их и туда же записать, то сначала выставляется адрес, потом по DIN читаются данные, SYNC остается активным, потом по DOUT записываются новые данные.
- - - Добавлено - - -
Отвечают только на сигналы DIN и DOUT, если адрес был их. Т.е. если в буфере барахлит какая-то линия, то вместо адреса 0177716 может придти, к примеру, 0177616. Естественно такого адреса нет на шине, потому процессор на сигнал DIN не дождется ответа RPLY, соответственно возникнет прерывание TRAP4.
Я делал так, жду высокий SYNC (неактивный), жду низкий SYNC(активный), читаю адрес, жду EDIN (низкий/активный), если во время ожидания SYNC стал высоким/неактивным, то перехожу в начало, если нет, то жду RPLE, а потом читаю данные и в начало.
- - - Добавлено - - -
Ага, дошло!!! Если все хорошо и комп работает, то ответ будет всегда, а если какие-то косяки, то "местный тайм аут"
Если во время ожидания RPLY SYNC стал неактивным, то и данные не прочитаны. Ибо по такому алгоритму уже можно дождаться RPLY от следующего цикла.
- - - Добавлено - - -
В системах PDP-11 во время адресного обмена устройство должно отвечать на сигналы DIN и DOUT сигналом RPLY. Если за 64 такта ответа не последовало, то считается, что устройство отсутствует на шине и процессор прерывается по прерыванию TRAP4. Таким образом можно просканировать страницу ввода-вывода и узнать какие регистры есть на шине.
Ясно, добавлю еще проверку на приход RPLY, кстати, можно сделать так, если RPLY не пришел, а пришел SYNC, то в память микроконтроллера записать какой-нибудь хитрый код.. ну там 0х1234, тогда будет ясно, что в этом месте словил тайм аут.
к сожалению, СТМка не в состоянии отсчитать такты выше мегагерца, во всяком случае 4й серии, а моя L476RG вообще разогнана из штатных 80 до 120 МГц, хотя хватало и штатных, но больше - не меньше :)
По хорошему логгер надо на верилоге делать, но сейчас все ПЛМки 3.3 В, значит нужен конвертер уровней.
А зачем их считать, такты? МПИ ведь асинхронная... Когда я сочинял свой AZ, у меня даже F103 с его 72 МГц вполне справлялся с МПИ, только оптимизацию прищлось сделать по скорости (дефолтно она по размеру). Только тот факт, что контроллер обязан отвечать по МПИ и в то время, когда он манипулирует с SD-карточкой (состояние "Занято"), а не только когда он свободен и ждет команды, заставил меня прикрутить туда аппаратный распознаватель адресов МПИ (на простейших ПЛИС). Если бы, получив команду, можно было просто отключиться от МПИ на время ее исполнения, так хватило бы и единственного МК.
А нельзя получить адрес из МПИ, сказать занято, сделать манипуляции с сд-картой, снять занято?
ну, L476 мало чем от 103 серии отличается (только пониженным потреблением), да и взял я ее только потому, что она у меня есть :)
Вот кстати да, у меня тут мысль возникла, а почему нельзя прикрутить к Сетевому адаптеру сд-шку, по идее там же все сделано за нас, только интерфейс соорудить? Только прикрутить не к входу/выходу, а к логической части, тогда и скорость можно поднять.
Если под занято Вы понимаете - карта не отвечает, но нельзя - при попытке обратиться к её адресам получим прерывание по вектору 4
Э? К какому такому сетевому адаптеру? Который в УК-НЦ? Так есть уже вариант AZ для УК-НЦ - именно вместо сетевого адаптера
RPLY - это НЕ сигнал готовности устройства выполнить следующую операцию. Это сигнал о том, что ведомое устройство приняло запрос от ведущего устройство (обычно процессор) на обращение к своим регистрам (или ячейкам памяти) и выполнило его. Никакого отношения к долговременным операциям (типа чтения сектора с диска) он НЕ имеет. Для этого используется бит в одном из регистров устройства, традиционно - 7-ой.
И если обратиться к РЕГИСТРАМ устройством, а оно не выдаёт сигнал RPLY, потому что занято выполнением долгоиграющей операции, получим прерывание по вектору 4
И я про него