Показать сообщение отдельно
Непрочитано 15.11.2010, 17:45  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: FAQ (ЧаВО) по PROTEUS для начинающих и не только

6.15. Примитив SPISLAVE. Исследуем поведение последовательного интерфейса с помощью различных цифровых генераторов.
Наряду с обычными аналоговыми, цифровыми и смешанными примитивами, описание которых хоть как то представлено в HELP, в библиотеках Протеуса существует ряд моделей, на основе которых создаются схематичные компоненты, но описания их свойств полностью отсутствуют. К таковым как раз и относятся расположенные в папке Modelling Primitives/Digital(Miscellaneous) примитивы различных подчиненных интерфейсов SPISLAVE (интерфейс SPI), I2SSLAVE (интерфейс I2S), D1WSLAVE (интерфейс 1-wire). Для воссоздания MAX1241 нам потребуется SPI. Вот его-то мы и рассмотрим сейчас. Примитив SPISLAVE, как и АЦП/ЦАП изначально представлен для 8-ми, 12-ти и 16-тибитного интерфейсов. Как и ранее рассмотрим только 8-ми битный, остальные аналогичны. Для начала познакомимся с назначением выводов модели (Рис. 121).
• В левой части модели расположены выводы характерные для внешнего последовательного интерфейса. К ним относятся:
SOSPI Output – цифровой последовательный выход данных на другие компоненты.
SI SPI Input – цифровой последовательный вход данных от других компонентов.
CSCrystal Selector – цифровой вход. По умолчанию низкий уровень на нем служит для выбора (активации) модели.
SCLKSPI Clock – тактовый вход. На него подаются импульсы с частотой обмена информацией по интерфейсу.
В правой части модели расположены выводы и 8-ми разрядные параллельные шины для компоновки внутренней структуры модели какого-либо компонента. Сюда входят:
DI_RDYData Input Ready – цифровой выход выдачи сигналов принятых со входа SI на параллельную шину DI[0..7]. По умолчанию вырабатывает положительный перепад 0-1 по окончанию (перепаду 0-1) входного сигнала CS. При этом принятые данные выводятся на шину. Поведение выхода зависит от параметра DI bus output autoload (см. ниже).
DO_LEData Output Load Enable – цифровой вход для выгрузки данных с параллельной шины DO[0..7] на выход SO. Для правильной (неискаженной) выдачи кода на SO положительный перепад 0-1 на этом входе должен предшествовать первому тактовому импульсу (по умолчанию положительному фронту) на входе SCLK после активизации сигнала CS.
EMPTY – цифровой выход. Сигнал на нем зависит от параметра DI bus output autoload (см. ниже).
• Теперь рассмотрим изменяемые в окне свойств параметры модели:
Два параметра: Clock polarity (по умолчанию Low – низкий уровень) и Clock phase (по умолчанию Positive – положительный 0-1) описывают требуемый входной тактовый сигнал SCLK. При необходимости можно поменять на High и Negative соответственно, чтобы подобрать нужный фронт тактирования модели.
Data order – порядок выдачи (приема) данных в последовательном интерфейсе. По умолчанию принят MSB first, т.е. старший бит данных (для 8-ми разрядной модели это D7) выдается (принимается) первым. Если поменять на LSB first, то первым в последовательности будет D0.
DI bus output autoload – этот параметр определяет логику работы (автозагрузку) шины данных DI[0..7]. По умолчанию [Default] эквивалентно No автозагрузка запрещена. Это означает, что модель не делает подсчет входных тактовых импульсов, а производит выгрузку данных на внутреннюю шину DI по окончании действия сигнала на входе CS. Чем это чревато рассмотрим сразу, не откладывая в долгий ящик.
Предположим, мы загружаем в восьмиразрядный SPISLAVE по входу SI кодовую последовательность 0x91 (b10010001). При этом сигнал выборки CS у нас значительно длиннее, чем длительность восьми тактовых импульсов, а тактовые импульсы следуют непрерывно, т.е. их тоже пройдет больше восьми. Фактически универсальная программная модель SPISLAVE представляет собой сдвиговый регистр, а точнее два – один внутрь на шину DI, другой наружу – на выход SO. Разрядность регистров определил программист Лабцентра при создании модели, и она нам неизвестна. Хотя, учитывая некоторый мой опыт по исследованию моделей, могу предположить, что там заложено не менее 32 разрядов. Допустим, что CS завершится у нас после 10-го тактового импульса. При этом два лишних импульса протолкнут данные на два разряда влево, добавив два нуля в младшие разряды. Если первым следовал MSB, то разряды D7 и D6 уйдут влево за пределы байта, на место D6 встанет единица из бывшего D4, а на D2 единица из бывшего D0. Проверим это на практике. На две модели подадим одинаковые сигналы, но у первой включим режим DI bus output autoload (Yes), а у второй оставим по умолчанию (Рис. 122).
Из графика видно, что предположения полностью подтвердились, т.е. для второй модели (U2) мы имеем на выходе код 0х44 (b01000100). Справа в этом байте появились два нуля, обусловленные двумя лишними импульсами. Для модели U1, у которой включен режим DI bus output autoload данные были занесены в DI правильно. Я прошу вас обратить особое внимание на поведение выходов DI_RDY и EMPTY при включенном (U1) и выключенном (U2) режиме автозагрузки. В первом случае по окончании 8-го импульса (именно для SPISLAVE_8, а для SPISLAVE_12 будет по окончании 12-го) на выходе EMPTY появился импульс и в этот момент появились правильные данные на шине DI[0..7], в то время как DI_RDY вообще не принимал участия в обмене и оставался строго низким. Во втором случае EMPTY был безучастным, но зато на DI_RDY появился положительный перепад по окончании сигнала CS и именно в этот момент были выданы данные, проехавшие на пару разрядов вперед на шину DI[0..7]. Это может быть несколько сложный для сиюминутного восприятия, но очень важный момент поведения модели SPISLAVE при приеме данных и о нем нельзя забывать при использовании примитива для разработки собственных моделей компонентов.
Во временных параметрах модели SPISLAVE присутствуют всего две задержки, по умолчанию нулевые. Они описывают задержку выдачи сигнала в последовательный интерфейс относительно тактового Clock одна по перепаду 0-1, другая по перепаду 1-0.
Чтобы несколько подробнее познакомиться с поведением модели я приложил несколько простых примеров приема, передачи и одновременно приема/передачи (поскольку каналы SI и SO если их не объединить специально абсолютно не мешают друг другу, то возможно и такое) с использованием различных цифровых генераторов из левого меню Generator Mode. Конечно, можно было бы воспользоваться и подручной моделью микроконтроллера, написать программу обмена и т.п. Но я хочу попутно приучить вас использовать «подручные средства» для достижения своих целей. Цифровые генераторы из меню Generator Mode наиболее подходящие для этих целей, поскольку практически не загружают ЦП компьютера и позволяют получить нужный результат. Элементарный пример – для первоначального сброса МК многие пририсовывают в проект обычную RC-цепочку. И свято верят, что это обязательно нужно при моделировании и работает. Кроме бесполезной траты времени компьютера на вычисление начальной точки аналоговой цепи данный прием ничего хорошего не дает. В реальности она работать будет, в симуляции необходимо, по крайней мере, задать начальные условия (IC) для точки соединения R, C и входа сброса МК, ну или задать нулевой начальный заряд конденсатора (PRECHARGE). В то же время, воспользовавшись генератором перепада (DEDGE) расшифровывается как Digital Edge (цифровой перепад) можно на сколь угодно долго задержать старт МК или другого цифрового компонента, имеющего вход сброса. На рисунке 123 пример «безграмотного» и грамотного применений стартовой задержки. Как видите, гарантированные 250 миллисекунд дает только генератор цифрового перепада. И совсем не обязательно применять такой генератор именно для коротких задержек. Вы можете задать ему время перепада и через 3600s (1 час), если требуется имитировать включение какого либо устройства.
Аналогично можно задать и не единичный пепепад, а единичный импульс Single Pulse или непрерывную тактовую Clock именно из генераторов Digital Types. Только параметров там уже можно задать больше. Почему я так настойчиво упираю на применение для цифровых устройств именно этих типов? По прежнему на форуме вылезают кривые проекты со 100% загрузкой ЦП. Открываешь проверять – вот оно, вместо Digital Clock автор кривого проекта пихнул Pulse из расположенного выше окна Analogue Types. В проекте и так напихано аналоговых элементов, так еще и генератор аналоговый. Эти два селектора не зря разделены. Все что аналоговое – оно и работает как аналоговое, со всеми вытекающими при этом дополнительными вычислениями: токи, импедансы и т.п. – отсюда и лишние тормоза. Я в последний раз заостряю на этом внимание, просто устал повторяться. А затеял я разговор о цифровых генераторах по поводу генератора Pattern, который мы сейчас и применим для исследования нашего SPISLAVE. Будут там и Single Edge и Single Pulse, но главным инструментом будет этот. Давайте познакомимся с назначением его свойств (Рис. 124) и применим нужный нам режим, а мне надо получать последовательность из определенного количества импульсов для входа SCLK и синхронизированные с SCLK во времени последовательные кодовые комбинации для входа SI.
В верхней части окна свойств расположены:
Initial State (стартовое состояние) по умолчанию Low (лог. 0) – меня это устраивает и мы оставляем как есть.
First Edge At (Sec) – первый перепад сигнала через 250m (миллисек) – слишком долго ждать, я поставлю 10m.
В следующей группе Timing с помощью флажка Equal Mark/Space Timing определяется, будут ли длительности импульса и паузы одинаковыми. Если флажок убрать, то можно задать отдельно длительность импульса Pulse width и паузы ‘Space’ Time. Я флажок оставлю, но длительности подрежу с 500 до тех же 10m.
Следующая группа Transitions определяет, как будут выдаваться импульсы. Если переключатель стоит так, как на рисунке 124 Specific Number of Edges, то будет выдано определенное в окне ниже число импульсов ( в данном случае 1). Если переключатель установить в Continuous Sequence of Pulses, то будет выдаваться бесконечно повторяющаяся последовательность импульсов ( по сути получим цифровой Clock). Третье положение Determine From Pattern Lengh – определяемое продолжительностью схемы пока не доступно для включения (серое). Но именно оно меня и интересует.
Для того, чтобы оно стало активным переведем переключатель в группе Bit Pattern из положения Standard High-Low Pulse Train – стандартная последовательность нулей и единиц в положение Specific pulse train – заданная последовательность импульсов. Вот теперь в наборе выше нам стали доступны все положения. Там я ставлю Determine From Pattern Lengh, а в группе Bit Pattern щелкаю по кнопке Edit, которая стала активной. В результате откроется окно редактирования последовательности импульсов Edit Pattern (Рис. 125).
В окне Edit Pattern с помощью мышки можно набрать любую требуемую нам комбинацию импульсов, причем с различной длительностью и тремя доступными уровнями: High (лог. 1), Float (неопред. уровень) и Low (лог. 0). Всего доступно 48 временных интервалов – горизонтальная шкала. Длительность каждого интервала определяется заданным в группе Timing значением Pulse width. Таким образом, если я задал там значение 10m, каждая горизонтальная клетка равна 10 миллисекундам. Установка уровня в нужном месте осуществляется левой кнопкой мышки. Если необходимо заполнить несколько временных интервалов одним уровнем – просто проводим по нужному уровню с зажатой левой кнопкой мыши. Если все 48 интервалов не нужны, то незадействованные не заполняем. Они будут индицироваться пунктирной линией и воспроизводиться при симуляции не будут. Ну и если случайно вы заполнили в конце лишние интервалы их можно затереть (пуктиром), используя правую кнопку мыши.
Ну и последний нюанс – мне в данный момент нужен режим Determine From Pattern Lengh, но совсем не обязательно использовать именно его. Если поставить Continuous Sequence of Pulses, то набранная в окне редактирования схема выдачи импульсов при запуске симуляции будет повторяться бесконечно.
Для сигнала SCLK на рисунке 125 я задал 16 импульсов с равными длительностью и паузой. В принципе, для 8-ми разрядного SPI хватило бы и 8-ми, но надо же посмотреть – как поведет себя модель, когда на вход будут поступать лишние импульсы.
Для того чтобы подать на вход SI определенную кодовую комбинацию я просто через Block Copy скопирую в проекте этот генератор, подключу копию к входу SI, а затем подредактирую нужную мне комбинацию Pattern, убрав ненужные импульсы. На рисунке 126 показано окно Edit Pattern для подачи на вход SI кодовой комбинации 0x91.
Ну вот вроде и все об использовании генератора Pattern. Теперь о том, что во вложении SPISLAVE.RAR к этому разделу. В примере SPI_8_autoload.DSN показано влияние свойства DI bus output autoload на прием информации с входа SI на внутреннюю шину DI. В примере SPI_8_Out.DSN показана передача информации на вывод SO с внутренней шины DO. Ну и наконец в примере SPI_8_2direction.DSN показан одновременный прием и передача информации по последовательным выводам SI и SO. Дополнительные комментарии вы найдете непосредственно в проектах.
Рисунки 121,122,123.
Рисунки 124,125,126.
Миниатюры:
Нажмите на изображение для увеличения
Название: Pic_121.gif
Просмотров: 389
Размер:	19.1 Кб
ID:	14905   Нажмите на изображение для увеличения
Название: Pic_122.gif
Просмотров: 348
Размер:	26.9 Кб
ID:	14906   Нажмите на изображение для увеличения
Название: Pic_123.gif
Просмотров: 355
Размер:	33.6 Кб
ID:	14907  

Нажмите на изображение для увеличения
Название: Pic_124.gif
Просмотров: 325
Размер:	14.8 Кб
ID:	14908   Нажмите на изображение для увеличения
Название: Pic_125.gif
Просмотров: 345
Размер:	33.9 Кб
ID:	14909   Нажмите на изображение для увеличения
Название: Pic_126.gif
Просмотров: 295
Размер:	9.7 Кб
ID:	14910  

Вложения:
Тип файла: rar SPISLAVE.rar (43.0 Кб, 838 просмотров)

Последний раз редактировалось Halex07; 19.11.2010 в 20:15.
Halex07 вне форума  
Эти 16 пользователя(ей) сказали Спасибо Halex07 за это сообщение:
bozhko (26.12.2010), Chettuser (17.11.2010), Dante_strelok (20.11.2010), gena1959 (20.11.2010), grbizly (21.11.2010), Nik0lay (19.11.2010), ReLe1 (14.08.2011), tigerV (19.11.2010), Tischon (21.01.2011), toklyn (21.11.2010), Traan (16.09.2013), vale1 (02.12.2010), valvlad (13.05.2011), WjaCHSL (19.11.2010), ДимаК (21.06.2011)