Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Курсовой проект разработка модуля ввода-вывода информации, сопрягаемого с Эвм через шину Usb - файл Белов.doc


Курсовой проект разработка модуля ввода-вывода информации, сопрягаемого с Эвм через шину Usb
скачать (410.4 kb.)

Доступные файлы (6):

1.vsd
2.vsd
3.vsd
Безымянный1.bmp
Безымянный.bmp
Белов.doc2427kb.20.06.2009 13:26скачать

содержание
Загрузка...

Белов.doc

Реклама MarketGid:
Загрузка...
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию


Рыбинская государственная авиационная технологическая академия

им. П. А. Соловьева
Факультет радиоэлектроники и информатики

Кафедра вычислительных систем


КУРСОВОЙ ПРОЕКТ

по дисциплине

Интерфейсы периферийных устройств

на тему

Разработка модуля ввода-вывода информации, сопрягаемого с ЭВМ

через шину USB
Пояснительная записка


Студент группы ВС2-00 Белов С. А.

Руководитель Вишняков В. А.



Рыбинск 2004

Содержание


Техническое задание

3

Введение


4




1 Описание структурной схемы модуля

5




1.1 Канал вывода аналоговой информации

5




1.2 Канал ввода цифровой информации

6




2 Разработка функциональной схемы

7




2.1 Интерфейсные блоки модуля

7




2.2 Исполнительные блоки модуля

8




2.3 Временные диаграммы работы модуля ввода-вывода информации

8




3. Алгоритм функционирования модуля ввода-вывода информации

10




4 Разработка принципиальной схемы

18




4.1 Обоснование элементной базы

18




4.2 Разработка интерфейсной части модуля

18




4.3 Разработка исполнительной части модуля

18




4.4 Другие элементы модуля

19




4.5 Программа функционирования модуля ввода-вывода информации

19




4.6 Расчёт потребляемой мощности

29




5 Требования к объекту управления

30




Заключение

31




Список литературы

32




Приложение А Перечень элементов


















Введение



USB (Universal Serial Bus — универсальная последовательная шина) является промышленным стандартом расширения архитектуры персонального компьютера ориентированным на интеграцию с телефонией и устройствами бытовой электроники. Версия 1.0 была опубликована в январе 1996 года. Архитектура USB определяется следующими критериями:

  • Легко реализуемое расширение периферии PC.

  • Дешевое решение, поддерживающее скорость передачи до 12 Mбит/с.

  • Полная поддержка в реальном времени передачи аудио и (сжатых) видеоданных.

  • Гибкость протокола смешанной передачи изохронных данных и асинхронных сообщений.

  • Интеграция с выпускаемыми устройствами.

  • Доступность в PC всех конфигураций и размеров.

  • Обеспечение стандартного интерфейса, способного быстро завоевать рынок.

  • Создание новых классов устройств, расширяющих PC.


С точки зрения конечного пользователя, привлекательны следующие черты USB:

 

  • Простота кабельной системы и подключений.

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

  • Самоидентифицирующиеся ПУ, автоматическая связь устройств с драйверами и конфигурирование.

  • Возможность динамического подключения и конфигурирования ПУ.


С середины 1996 года выпускаются PC со встроенным контроллером USB, реализуемым чипсетом. Уже появились модемы, клавиатуры, сканеры, динамики и другие устройства ввода/вывода с поддержкой USB, а также мониторов с USB-адаптерами – они играют роль концентраторов для подключения других устройств.

В версии 2.0, опубликованной в 2000 году, определена ещё и высокая скорость – 480 Мбит/с. Шина с использованием промежуточных концентраторов позволяет соединить устройства, удалённые от компьютера на расстояние до 25 метров.

Сегодня USB – это очень популярная универсальная последовательная шина. Она предназначена для легкого подключения различного вида устройств: клавиатуры, мыши, джойстики, колонки, модемы, мобильные телефоны, ленточные, дисковые, оптические и магнитооптические накопители, флэш-диски, сканеры и принтеры, словом все, что подключается к ПК.

1 Описание структурной схемы модуля
По требованиям технического задания (ТЗ) разрабатываемый модуль должен выполнять две функции:

  1. Прием цифровой информации (4 байта за один цикл обмена) от объекта управления с частотой сигнала 8 кГц.

  2. Передача аналоговой информации (импульсы переменной частоты 1-100 кГц.) объекту управления (ОУ) . Максимальная ошибка преобразования – 0,4 %.


Конструкция должна содержать следующие блоки:
- Специальное USB устройство – оно обычно используется совместно с микроконтроллером и связывается с ним по высокоскоростному 8 разрядному универсальному параллельному интерфейсу.
- Преобразователь цифрового кода в аналоговый сигнал – преобразует входной цифровой код, поступающий из микроконтроллера, в импульс переменной частоты. Наиболее простыми являются преобразователи на основе микросхем таймеров. Необходимо, чтобы погрешность преобразования не превышала 0,4 %. Разрядность кода поступающего из микроконтроллера на вход преобразователя считается так.

N =.
- Делители частоты – формируют строб ^ F, поступающий с необходимой частотой на вход преобразователя .
- Микроконтроллер – управляет работой всех вышеперечисленных блоков модуля, формируя необходимые стробы, а также хранит данные, которые необходимо передавать/принимать ОУ или хосту.
Схема электрическая структурная модуля ввода-вывода информации имеет шифр ПУКП. 020100. 000Э1.

Таким образом, анализируя ТЗ и функции модуля ввода-вывода информации, можно выделить два канала передачи данных.
1.1. Канал вывода аналоговой информации


1. Если буфер передаваемых данных для О.У. не пустой, то в порт микроконтроллера, подключённый к шине данных, записывается цифровая информация.

2. Запись информации в блок «преобразователя цифрового кода в аналоговый сигнал», осуществляется по стробу Data_WR.

3. На блок «преобразователя цифрового кода в аналоговый сигнал» с блока делителя частоты поступает строб ^ F, который запускает процесс преобразования цифровой информации. При наличии разрешающего сигнала Gata таймер начинает работать в вычитающем режиме.

4. Далее блок «преобразователя цифрового кода в аналоговый сигнал» выдаёт импульс Sign., который поступает в объект управления.

5. Передача сигнала О. У. заканчивается, и микроконтроллер переходит к пункту 1.
^ 1.2. Канал ввода цифровой информации


1. Микроконтроллер ожидает появления сигнала Byte_WR, строб передачи байта от О.У.

2. После активизации сигнала Byte_WR микроконтроллер считывает байт, полученный от О.У, со своего порта, подключённого к цифровому каналу ввода.

3. Микроконтроллер переходит к пункту 2. до тех пор, пока О.У. не перешлёт все 4 байта информации.

4. Передача данных от О.У. завершена, и микроконтроллер переходит к пункту 1.


2 Разработка функциональной схемы
Функциональную схему, исходя из структурной схемы (ПУКП. 020100. 000Э1), можно представить как совокупность интерфейсных и исполнительных элементов, которые взаимодействуют между собой. Интерфейсными элементами являются блоки, которые отвечают за связь разрабатываемого модуля ввода-вывода информации с ЭВМ. Под исполнительными элементами понимаются блоки, отвечающие за непосредственное выполнение основных функций модуля, таких как преобразование аналогового сигнала в цифровой код, деление частоты и т. д.

Микроконтроллер организует функционирование модуля, путём формирования управляющих стробов, а также связывает интерфейсную и исполнительную части разрабатываемого модуля. В качестве микроконтроллера выбрана микросхема Intel 8051..
Интерфейсная часть:

- Специальное USB устройство, в качестве которого выбрана готовая микросхема PDIUSBD12 фирмы Philips Semiconductors. PDIUSBD12 полностью соответствует USB спецификации версии 2.0.

Исполнительная часть:

- Делитель частоты.

- Преобразователь цифрового кода в аналоговый сигнал.
Схема электрическая функциональная модуля ввода-вывода информации имеет шифр ПУКП. 020100. 000Э2

2.1 Интерфейсные блоки модуля
Специальное USB устройство PDIUSBD12.
Данный блок взаимодействует с блоком микроконтроллера Intel 8051 посредством следующих сигналов:

А0 – данный сигнал отвечает за выборку фазы команд (А0=1) и фазы данных (А0=0) и должен формироваться программно;

INT_Nданный сигнал формируется PDIUSBD12 и сообщает микроконтроллеру о том что необходимо принять данные от хоста или передать данные в хост (активный 0 уровень);

WRс помощью данного строба происходит запись информации из микроконтроллера в порт PDIUSBD12 (активный уровень 0);

RDс помощью данного строба происходит чтение информации из порта PDIUSBD12 в микроконтроллер (активный 0 уровень);

CLKOUTсигнал синхронизации для микроконтроллера;

Data<0> ... Data<7> восьмиразрядную шину данных, через которую осуществляется передача данных между микроконтроллером и PDIUSBD12.

XTAL1 и XTAL2 – входы, для подключения кварцевый резонатор РК169МВ-7АП с частотой 6MГц;

СS_N (выбор чипа) подаётся активный уровень 0 (земля);

ALE (включение закрытия адреса) подаётся 0 для разделения конфигурации шины адрес/данные.


2.2 Исполнительные блоки модуля
^ Блок делителей частоты.
Данная схема необходима для получения сигнала F. Чтобы максимальная ошибка преобразования не превышала 0,4%, необходимо подать этот сигнал с частотой 250 кГц. Этот сигнал можно получить путем деления сигнала CLKOUT на 6.000.000 /24=250.000. Это можно осуществить при помощи двух счетчиков и одного элемента «И».
Блок преобразователя цифрового кода в аналоговый сигнал.
Блок, как было указано выше, состоит из программируемого таймера, управление которым осуществляется по линиям P0.0 и P0.1. Запись цифрового кода из порта микроконтроллера Р2 в блок происходит по сигналу записи Data_WR (активный 0 уровень). Таймер начинает работать в вычитающем режиме, как только на входе разрешения счёта появится сигнал Gata (активный 1 уровень) c логического элемента «И». В конструкцию блока также входит D-триггер. Триггер устанавливается в 1 состояние и сигнал Sign активизируется. Как только счёт закончится, таймер выработает сигнал Daf (активный 1 уровень), который через инвертор поступает на вход сброса триггера.
2.3 Временные диаграммы работы модуля ввода-вывода информации
Для пояснения принципа функционирования разрабатываемого модуля приводятся временные диаграммы для основных сигналов. На рисунке 2.1 приведены временные диаграммы для канала ввода аналоговой информации, а на рисунке 2.2 – временные диаграммы для канала вывода цифровой информации.

Рисунок 2.3.1 - Временные диаграммы для канала ввода цифровой информации
Передача данных от объекта управления в модуль ввода-вывода начинается установкой строба Byte_WR в 1 уровень. Установка строба Byte_WR указывает, что на шине данных находится значимая информация. Микроконтроллер считывает информацию и готов принимать оставшуюся часть пакета (длина которого, согласно техническому заданию, равна 4 байтам).



Рисунок 2.2 - Временные диаграммы для канала ввода цифровой информации
Сигнал F поступает от делителя частоты с периодом 4мкс.С приходом строба Data_WR сигнал Sign устанавливается в единичный уровень. Передача данных прекращается с приходом сигнала DDAF от вычитающего таймера счетчика.

3 Алгоритм функционирования модуля ввода-вывода информации
Алгоритм функционирования модуля ввода-вывода информации оформлен в виде блок-схемы и изображён на рисунке 3.1.




Рисунок 3.1 – Макроуровень программы функционирования модуля
Макроуровень программы состоит из блоков, которые оформлены в виде процедур:

  • «Подключение к шине USB» (USB_LINE);

  • «Обслуживание запросов от PDIUSBD12» (Int_USB);

  • «Обслуживание ОУ» (Proc_OY).


Блок-схемы алгоритмов основных процедур показаны на рисунках 3.2 – 3.9.





Рисунок 3.2 – Процедура подключения к шине USB (USB_LINE)



Рисунок 3.3 – Алгоритм процедуры обслуживания прерывания (Int_USB)



Рисунок 3.4 – Алгоритм процедуры Process_EP0_OUT_Interrupt





Рисунок 3.5 – Алгоритм процедуры D11WriteEndpoint
Процедура, алгоритм которой изображён на рисунке 3.5, предназначена для записи пакета в буфер выбранной конечной точки.




Рисунок 3.6 – Алгоритм процедуры D12_ReadEndpoint
Процедура, алгоритм которой изображён на рисунке 3.6, предназначена для чтения пакета из буфера выбранной конечной точки.



Рисунок 3.7 – Алгоритм процедуры Proc_OU
Для вывода данных из модуля ввода-вывода вызывается процедура OUT_OU.
Для ввода данных из объекта управления вызывается процедура INP_OU.



Рисунок 3.8 – Алгоритм процедуры INT _OU



Рисунок 3.9 – Алгоритм процедуры OUT _OU

4 Разработка принципиальной схемы
Схема электрическая принципиальная модуля ввода-вывода информации имеет шифр ПУКП. 020100. 000Э3.

4.1 Обоснование элементной базы
При выборе элементной базы руководствовались такими параметрами микросхем, как быстродействие, разрядность, потребляемая мощность, функциональное и электрическое сопряжение и другие параметры. Таким образом, для построения модуля ввода-вывода информации используются цифровые микросхемы серии 1533. Выбор данной серии основан на том, что цифровые микросхемы этой серии имеют наиболее подходящие параметры для разрабатываемого устройства сопряжения, по сравнению с другими сериями, а именно:

-малые входные токи (I1вх<0,02 мА, I0вх<-0,2 мА)

-относительно высокое быстродействие (средняя задержка при переходах «0 и «10» 4 нс);

-относительно малая потребляемая мощность (Pпот<1 мВт на один логический элемент);

-питание микросхем от +5 В, которое можно получить с шины USB.
4.2 Разработка интерфейсной части модуля
Специальное USB устройство PDIUSBD12.

Этот узел представлен на принципиальной схеме модуля элементом DD8. Блок состоит из микросхемы PDIUSBD12, которая соединяется с блоком микроконтроллера Intel 8051 (DD7) через восьмиразрядную шину данных P0…P7. Узел соединяется с шиной USB посредством линий D+ и D-. К линии D+ подсоединён согласующий резистор номиналом 1,5 кОм, данный резистор уже встроен в PDIUSBD12 и может быть подключён программным путём. Данный тип подключения свидетельствует, что устройство, присоединяемое к шине USB, является полно скоростным.
4.3 Разработка исполнительной части модуля
1. Блок делителей частоты.

Данный блок представлен на принципиальной схеме двумя четырехразрядными счётчиками DD1 и DD2, логическими элементами «И» DD6.1 и «НЕ» DD4.3. В качестве микросхем выбраны КР1533ИЕ7, КР1533ЛИ1 и КР1533ЛН1. Счетчик обеспечивает деление деления сигнала CLKOUT с USB-устройства на 16. Низкий уровень сигнала с выхода прямого переноса поступает на инвертор и служит сигналом для разрешения счета на счетчиках блока аналог-код.

^ 2. Блок преобразователя цифрового кода в аналоговый сигнал.

Данный блок представлен на принципиальной схеме микросхемой программируемого таймера КР1810ВИ54 (DD5), триггера КР1533ТМ2 (DD3), инвертора «НЕ» КР1533ЛН1 (DD4.2). Запись цифрового кода в таймер осуществляется по восьмиразрядной шине данных DA8DA15..


4.4 Другие элементы модуля
Объект управления подключается через разъем X1, в качестве которого взят разъем СНП37. Этот разъем имеет 20 выводов, 12 выводов используются для подключения объекта управления к модулю, а остальные остаются не подключёнными, это можно использовать для дальнейшей модификации модуля. Также, немало важно то, что разъем СНП37 обеспечивает передачу как цифровых, так и аналоговых сигналов.

С шиной USB разработанный модуль ввода-вывода информации подключается обычным образом, то есть с помощью разъёма ^ X2, в качестве которого взят стандартный USB разъём USBA-1J (тип А), одинарной конструкции, применяемый в качестве узла коммутации для персональных компьютеров и периферийных устройств.

Уровень логической “^ 1” организуется подачей напряжения +5 В с шины USB через токоограничивающий резистор R1 с номиналом 2 кОм.

К каждые 3 – 4 DIP-корпуса цифровых микросхем подключается керамический конденсатор емкостью 68 пФ (на принципиальной схеме конденсаторы C3..C7). Также подключается один общий электролитический конденсатор С2, емкостью 47 мкФ.


4.5 Программа функционирования модуля ввода-вывода информации
Листинг программы функционирования модуля приведён ниже.
#include <pic.h>

#include <stdio.h>

#include <string.h>

#include "usbfull.h"
/*описание стандартных дескрипторов USB*/

const USB_DEVICE_DESCRIPTOR DeviceDescriptor = {

sizeof(USB_DEVICE_DESCRIPTOR), /* Длинна дескриптора */

TYPE_DEVICE_DESCRIPTOR, /* Тип дескриптора */

0x0110, /* Версия USB Version 1.1 */

0, /* bDeviceClass */

0, /* bDeviceSubclass */

0, /* bDeviceProtocol */

32, /* размер пакета bMaxPacketSize 32Bytes */

0x0000, /* Производитель idVendor */

0x0000, /* Продукт idProduct (USB Thermometer Example) */

0x0001, /* Версия устройства bcdDevice */

1, /* iManufacturer String Index */

0, /* iProduct String Index */

0, /* iSerialNumber String Index */

1 /* число конфигураций bNumberConfigurations */

},
const USB_CONFIG_DATA ConfigurationDescriptor = {

{ /* configuration descriptor */

sizeof(USB_CONFIGURATION_DESCRIPTOR), /* bLength */

TYPE_CONFIGURATION_DESCRIPTOR, /* bDescriptorType */

sizeof(USB_CONFIG_DATA), /* wTotalLength */

1, /* bNumInterfaces */

1, /* bConfigurationValue */

0, /* iConfiguration String Index */

0x40, /* питание автономное*/

0x85 /* bMaxPower, 133 mA */

},
{ /* interface descriptor */

sizeof(USB_INTERFACE_DESCRIPTOR), /* bLength */

TYPE_INTERFACE_DESCRIPTOR, /* bDescriptorType */

0, /* Номер интерфейса */

0, /* bAlternateSetting */

0x2, /* Количество точек */

0xFF, /* Класс интерфейса(Производителя) */

0xFF, /* Класс интерфейса (Производителя) */

0xFF, /* Протокол интерфейса (Производителя) */

0 /* iInterface String Index */

},
{ /* Дескриптор точки*/

sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */

TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */

0x82, /* точка 1 ввода */

0х1, /* точка 0 вывода */

0x11, /* bmAttributes – прерывание */

0x0064, /* wMaxPacketSize */

0x10 /* для передач данных – bInterval */

},
{ /* endpoint descriptor */

sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */

TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */

0x81, /* bEndpoint Address EP1 IN */

0x03, /* bmAttributes - Interrupt */

0x0008, /* wMaxPacketSize */

0x10 /* bInterval */

}

};
const MANUFACTURER_DESCRIPTOR Manufacturer_Descriptor = { производитель */

sizeof(MANUFACTURER_DESCRIPTOR), /* bLenght */

TYPE_STRING_DESCRIPTOR, /* bDescriptorType */

"m\0a\0r\0i\0n\0a\0" /* Название в UNICODE */

};
#define MAX_BUFFER_SIZE 80

bank1 unsigned char circularbuffer[MAX_BUFFER_SIZE];

unsigned char inpointer;

unsigned char outpointer;

unsigned char *pSendBuffer;

unsigned char BytesToSend;

unsigned char CtlTransferInProgress;

unsigned char DeviceAddress;

unsigned char DeviceConfigured;
#define PROGRESS_IDLE 0

#define PROGRESS_ADDRESS 3
void main (void)

{

TRISB = 0x03; /* Int & Suspend Inputs */

RB3 = 1; /* Device Not Configured (LED) */

RB2 = 0; /* Reset PDIUSBD12 */

I2C_Init();

RB2 = 1; /* Bring PDIUSBD12 out of reset */


USB_Line();

while(1) {

if (!P3.2) Int_USB(); /* если было прерывание */

else Proc_OU(); /* если не было прерывание */

}

}
void USB_Data(void)

{

unsigned char Buffer[2];

/* Установка адреса по умолчания и активация функции */

Buffer[0] = 0x80;

D11CmdDataWrite(D11_SET_ADDRESS_ENABLE, Buffer, 1);
/* Активировать конечную точку */

Buffer[0] = 0x01;

D11CmdDataWrite(D11_SET_ENDPOINT_ENABLE, Buffer, 1);
/* Установка режима - Enable SoftConnect */

Buffer[0] = 0x1E; /* ISO-i/o,SoftConnect ,no interrupt,clock,no lazy clock*/

D11CmdDataWrite(D11_SET_MODE, Buffer, 1);

}
void Int_USB(void)

{ unsigned short Irq;

unsigned char Buffer[1];

/* Считываем регистр прерываний */

D11CmdDataRead(D11_READ_INTERRUPT_REGISTER, (unsigned char *)&Irq, 2);

/*сброс по шине*/

if (Irq & D11_INT_BUS_RESET) {/**/

USB_Init();

}
/*конечная точка 0 out*/

if (Irq & D11_INT_EP0_OUT) {

Process_EP0_OUT_Interrupt();

}
/*конечная точка 0 in*/

if (Irq & D11_INT_EP0_IN)

if (CtlTransferInProgress == PROGRESS_ADDRESS) { /*передали адрес?*/

D11CmdDataWrite(D11_SET_ADDRESS_ENABLE,&DeviceAddress,1);

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_IN, Buffer, 1);

CtlTransferInProgress = PROGRESS_IDLE;

}

else {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_IN, Buffer, 1);

WriteBufferToEndPoint();

}
}

/*конечная точка 2 iout*/

if (Irq & D11_INT_EP1_OUT) {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_OUT, Buffer, 1);

bytes = D11ReadEndpoint(D11_ENDPOINT_EP1_OUT, Buffer);

for (count = 0; count < bytes; count++) {

circularbuffer[inpointer++] = Buffer[count];

if (inpointer >= MAX_BUFFER_SIZE) inpointer = 0;

}

loadfromcircularbuffer(); //Kick Start

}


if (Irq & D11_INT_EP1_IN) {

printf("EP1_IN\n\r");

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_IN, Buffer, 1);

loadfromcircularbuffer();

}
if (Irq & D11_INT_EP2_OUT) {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP2_OUT, Buffer, 1);

Buffer[0] = 0x01; /* Stall Endpoint */

D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP2_OUT, Buffer, 1);

}
if (Irq & D11_INT_EP2_IN) {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP2_IN, Buffer, 1);

Buffer[0] = 0x01; /* Stall Endpoint */

D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP2_IN, Buffer, 1);

}
}
void Process_EP0_OUT_Interrupt(void)

{

unsigned long a;

unsigned char Buffer[2];

USB_SETUP_REQUEST SetupPacket;
/* Проверка типа пакета SETUP или DATA */

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_OUT, &SetupPacket, 1);
if (SetupPacket.bmRequestType & D11_LAST_TRAN_SETUP) {

/* если это пакет установки считываем его */

D11ReadEndpoint(D11_ENDPOINT_EP0_OUT, &SetupPacket);
/* посылаем сигнал квитирования и очищаем буфер точки 0 OUT */

D11CmdDataWrite(D11_ACK_SETUP, NULL, 0);

D11CmdDataWrite(D11_CLEAR_BUFFER, NULL, 0);
/* посылаем сигнал квитирования в точку 0 IN*/

D11CmdDataWrite(D11_ENDPOINT_EP0_IN, NULL, 0);

D11CmdDataWrite(D11_ACK_SETUP, NULL, 0);
/* Рассматриваем тип запроса */

switch (SetupPacket.bmRequestType & 0x7F) {

case STANDARD_DEVICE_REQUEST:

/*стандартный запрос к устройству*/

switch (SetupPacket.bRequest) {

case GET_STATUS:

/* Remote Wakeup and Self Powered Status */

Buffer[0] = 0x01;

Buffer[1] = 0x00;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;
case CLEAR_FEATURE:

/*выбор возможности*/
case SET_FEATURE:

ErrorStallControlEndPoint();

break;
case SET_ADDRESS:

/*установка адреса*/

DeviceAddress = SetupPacket.wValue | 0x80;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

CtlTransferInProgress = PROGRESS_ADDRESS;

break;
case GET_DESCRIPTOR:

/*дать дескриптор*/

GetDescriptor(&SetupPacket);

break;

case GET_CONFIGURATION:

/*дать конфигурацию*/

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, &DeviceConfigured, 1);

break;
case SET_CONFIGURATION:

/*установить конфигурацию*/

DeviceConfigured = SetupPacket.wValue & 0xFF;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

break;
//case SET_DESCRIPTOR:

default:

/* Unsupported - Request Error - Stall */

ErrorStallControlEndPoint();

break;

}

break;
case STANDARD_INTERFACE_REQUEST:

/*стандартный запрос к интерфейсу*/

switch (SetupPacket.bRequest) {

case GET_STATUS:

/* Дать стстус */

/* статус 0 */

Buffer[0] = 0x00;

Buffer[1] = 0x00;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;
case SET_INTERFACE:

/* Device Only supports default setting, Stall may be */

/* returned in the status stage of the request */

if (SetupPacket.wIndex == 0 && SetupPacket.wValue == 0)

/* Interface Zero, Alternative Setting = 0 */

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

else ErrorStallControlEndPoint();

break;
case GET_INTERFACE:

if (SetupPacket.wIndex == 0) { /* Interface Zero */

Buffer[0] = 0; /* Alternative Setting */

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 1);

break;

} /* else fall through as RequestError */
//case CLEAR_FEATURE:

//case SET_FEATURE:

/* Interface has no defined features. Return RequestError */

default:

ErrorStallControlEndPoint();

break;

}

break;
case STANDARD_ENDPOINT_REQUEST:

/*Запрос к точке доступа*/

case CLEAR_FEATURE:

case SET_FEATURE:

/* Halt(Stall) feature required to be implemented on all Interrupt and */

/* Bulk Endpoints. It is not required nor recommended on the Default Pipe */

if (SetupPacket.wValue == ENDPOINT_HALT)

{

if (SetupPacket.bRequest == CLEAR_FEATURE) Buffer[0] = 0x00;

else Buffer[0] = 0x01;

switch (SetupPacket.wIndex & 0xFF) {

case 0x01 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_OUT, Buffer, 1);

break;

case 0x81 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_IN, Buffer, 1);

break;

case 0x02 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_OUT, Buffer, 1);

break;

case 0x82 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_IN, Buffer, 1);

break;

case 0x03 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_OUT, Buffer, 1);

break;

case 0x83 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_IN, Buffer, 1);

break;

default : /* Invalid Endpoint - RequestError */

ErrorStallControlEndPoint();

break;

}

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

} else {

/* No other Features for Endpoint - Request Error */

ErrorStallControlEndPoint();

}

break;

case GET_STATUS:

/* Get Status Request to Endpoint should return */

/* Halt Status in D0 for Interrupt and Bulk */

switch (SetupPacket.wIndex & 0xFF) {

case 0x01 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_OUT, Buffer, 1);

break;

case 0x81 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_IN, Buffer, 1);

break;

case 0x02 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_OUT, Buffer, 1);

break;

case 0x82 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_IN, Buffer, 1);

break;

case 0x03 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_OUT, Buffer, 1);

break;

case 0x83 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_IN, Buffer, 1);

break;

default : /* Invalid Endpoint - RequestError */

ErrorStallControlEndPoint();

break;

}

if (Buffer[0] & 0x08) Buffer[0] = 0x01;

else Buffer[0] = 0x00;

Buffer[1] = 0x00;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;

default:

/* Unsupported - Request Error - Stall */

ErrorStallControlEndPoint();

break;

}

break;

case VENDOR_DEVICE_REQUEST:

case VENDOR_ENDPOINT_REQUEST:

printf("Vendor Device bRequest = 0x%X, wValue = 0x%X, wIndex = 0x%X\n\r", \

SetupPacket.bRequest, SetupPacket.wValue, SetupPacket.wIndex);

switch (SetupPacket.bRequest) {
case VENDOR_GET_ANALOG_VALUE:

printf("Get Analog Value, Channel %x :",SetupPacket.wIndex & 0x07);

ADCON0 = 0xC1 | (SetupPacket.wIndex & 0x07) << 3;

/* Wait Acquistion time of Sample and Hold */

for (a = 0; a <= 255; a++);

ADGO = 1;

while(ADGO);

Buffer[0] = ADRESL;

Buffer[1] = ADRESH;

a = (Buffer[1] << 8) + Buffer[0];

a = (a * 500) / 1024;

printf(" Value = %d.%02d\n\r",(unsigned int)a/100,(unsigned int)a%100);

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;

case VENDOR_SET_RB_HIGH_NIBBLE:

printf("Write High Nibble of PORTB\n\r");

PORTB = (PORTB & 0x0F) | (SetupPacket.wIndex & 0xF0);

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

break;
default:

ErrorStallControlEndPoint();

break;

}

break;

default:

printf("UnSupported Request Type 0x%X\n\r",SetupPacket.bmRequestType);

ErrorStallControlEndPoint();

break;

}

} else {

printf("Data Packet?\n\r");

/* This is a Data Packet */

}

}
/*Вернуть дескриптор*/

void GetDescriptor(PUSB_SETUP_REQUEST SetupPacket)

{

switch((SetupPacket->wValue & 0xFF00) >> 8) {
case TYPE_DEVICE_DESCRIPTOR:

/*дескриптор устройства*/

pSendBuffer = (const unsigned char *)&DeviceDescriptor;

BytesToSend = DeviceDescriptor.bLength;

if (BytesToSend > SetupPacket->wLength)

BytesToSend = SetupPacket->wLength;

WriteBufferToEndPoint();

break;
case TYPE_CONFIGURATION_DESCRIPTOR:

/*дескриптор конфигурации*/

SetupPacket->wLength, sizeof(ConfigurationDescriptor));

pSendBuffer = (const unsigned char *)&ConfigurationDescriptor;

BytesToSend = sizeof(ConfigurationDescriptor);

if (BytesToSend > SetupPacket->wLength)

BytesToSend = SetupPacket->wLength;

WriteBufferToEndPoint();

break;

case TYPE_STRING_DESCRIPTOR:

/*дескриптор строки*/

SetupPacket->wIndex, SetupPacket->wValue & 0xFF);

switch (SetupPacket->wValue & 0xFF){
case 0 : pSendBuffer = (const unsigned char *)&LANGID_Descriptor;

BytesToSend = sizeof(LANGID_Descriptor);

break;
case 1 : pSendBuffer = (const unsigned char *)&Manufacturer_Descriptor;

BytesToSend = sizeof(Manufacturer_Descriptor);

break;
default : pSendBuffer = NULL;

BytesToSend = 0;

}

if (BytesToSend > SetupPacket->wLength)

BytesToSend = SetupPacket->wLength;

WriteBufferToEndPoint();

break;

default:

ErrorStallControlEndPoint();

break;

}

}
/*читать точку*/

unsigned char D11ReadEndpoint(unsigned char Endpoint, unsigned char *Buffer)

{

unsigned char D11Header[2];

unsigned char BufferStatus = 0;
/* Проверяем буфер точки */

D11CmdDataRead(Endpoint, &BufferStatus, 1);
if(BufferStatus & 0x01)

{

/*читаем из буфера*/

D11CmdDataRead(D11_READ_BUFFER, D11Header, 2);

if(D11Header[1]) D11CmdDataRead(D11_READ_BUFFER, Buffer, D11Header[1]);

/* очищаем буфер*/

D11CmdDataWrite(D11_CLEAR_BUFFER, NULL, 0);

}

return D11Header[1];

}
/*записываем в точку*/

void D11WriteEndpoint(unsigned char Endpoint, const unsigned char *Buffer, unsigned char Bytes)

{

unsigned char D11Header[2];

unsigned char BufferStatus = 0;

D11Header[0] = 0x00;

D11Header[1] = Bytes;
D11CmdDataRead(Endpoint, &BufferStatus, 1);

/* записываем заголовок */

D11CmdDataWrite(D11_WRITE_BUFFER, D11Header, 2);

/* записываем в буфер*/

if (Bytes) D11CmdDataWrite(D11_WRITE_BUFFER, Buffer, Bytes);

/* Буфер полон */

D11CmdDataWrite(D11_VALIDATE_BUFFER, NULL, 0);

}
/*записываем буфер в точку*/

void WriteBufferToEndPoint(void)

{

if (BytesToSend == 0) {

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

} else if (BytesToSend >= 64) {

/* считываем 64 байта и посылаем */

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, pSendBuffer, 8);

pSendBuffer += 64;

BytesToSend -= 64;

} else {

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, pSendBuffer, BytesToSend);

BytesToSend = 0;

}

}
void loadfromcircularbuffer(void)

{

unsigned char Buffer[10];

unsigned char count;
// Read Buffer Full Status

D11CmdDataRead(D11_ENDPOINT_EP1_IN, Buffer, 1);
if (Buffer[0] == 0){

// Buffer Empty

if (inpointer != outpointer){

// We have bytes to send

count = 0;

do {

Buffer[count++] = circularbuffer[outpointer++];

if (outpointer >= MAX_BUFFER_SIZE) outpointer = 0;

if (outpointer == inpointer) break; // No more data

} while (count < 8); // Maximum Buffer Size

// Now load it into EP1_In

D11WriteEndpoint(D11_ENDPOINT_EP1_IN, Buffer, count);

}

}

}
/*команда записать*/

void D11CmdDataWrite(unsigned char Command, const unsigned char *Buffer, unsigned char Count)

{

I2C_Write(D11_CMD_ADDR, &Command, 1);

if(Count) I2C_Write(D11_DATA_ADDR_WRITE, Buffer, Count);

}

/*команда читать*/

void D11CmdDataRead(unsigned char Command, unsigned char Buffer[], unsigned char Count)

{

I2C_Write(D11_CMD_ADDR, &Command, 1);

if(Count) I2C_Read(D11_DATA_ADDR_READ, Buffer, Count);

}
/*Обработка ОУ*/

void Proc_OU(void)

{

if (P3.0==1) INP_OU(); /*если необходим ввод в ОУ*/

if (P3.1==0) OUT_OU(); /*если необходим вывод из ОУ*/

}
void INP_OU (void)

{

unsigned char Buffer[2];

Buffer[0] = P1; /*считывание первого байта */

D11WriteEndpoint(D11_ENDPOINT_EP2_IN, Buffer, 2); /*запись данных в буфер*/

}
void OUT_OU (void)

{

unsigned char Buffer[64];

unsigned char count;

unsigned char byte;

byte = D11ReadEndpoint(D11_ENDPOINT_EP2_OUT, Buffer);

if (byte){

/* если непустой*/

for (count = 0; count < byte; count++) {

while(P3.1) /*если ОУ требует данные */

{

P2 = buffer[count];

}

4.6 Расчет потребляемой мощности
Потребляемая мощность рассчитывается по формуле:




(1)
Таким образом, каждая микросхема имеет следующие параметры:


  • DD1, DD2 (КР1533ИЕ7)

Uп = +5 В, Iпот = 22 мА, Pпот = 110 · 2 = 220 мВт;

  • DD3 (КР1533ТМ2)

Uп =+5 В , Iпот =4 мА , Pпот = 20 мВт;

  • DD4 (КР1533ЛН1)

Uп = +5 В, Iпот = 4,2 мА, Pпот = 21 мВт;

  • DD6 (КР1533ЛИ1)

Uп = +5 В, Iпот = 4 мА, Pпот = 20 мВт;

  • DD8 (Intel 8051)

Uп = +5 В, Iпот = 41,1 мА, Pпот = 205,5 мВт ;

  • DD9 (PDIUSBD12)

Uп = +5 В, Iпот =100 мА, Pпот =500 мВт;
На резисторах мощность рассчитывается по следующей формуле:




(2)
Потребляемая мощность резисторами будет равна:


  • R1 = 2 кОм, Iд = 2,5 мА, Pпот = 12,5 мВт;


Таким образом, общая потребляемая мощность модуля равна:
PПОТ = 1329 мВт =1,2 Вт.


5 Требования к объекту управления
Для корректной работы спроектированного модуля объект управления должен удовлетворять следующим требованиям:

- объект управления должен принимать цифровые данные (4 байт за 1 цикл обмена) с максимальной частотой 8 кГц;
- входной аналоговый сигнал по напряжению должен соответствовать положительной ТТЛ-логике;
- объект управления должен иметь 8-ми разрядную шину данных DA0DA7;
- объект управления должен подключаться к модулю ввода-вывода информации через разъем СНП34;
- в качестве соединительного кабеля необходимо использовать витую пару.

Заключение



В результате проделанной работы был разработан модуль ввода-вывода информации. В качестве документации к разработанному модулю прилагается:
- пояснительная записка;

- схема электрическая структурная (ПУКП. 020100. 000Э1);

- схема электрическая функциональная (ПУКП. 020100. 000Э2);

- схема электрическая принципиальная (ПУКП. 020100. 000Э3);

- перечень элементов (ПУКП. 020100. 000ПЭ).
В пояснительной записке приведены временные диаграммы, поясняющие работу модуля ввода-вывода информации. Также приводится листинг программы функционирования модуля.

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

Таким образом, задание на курсовой проект, с учетом всех требований к разработке модуля и оформлению документации, выполнено.

^

Список используемой литературы





  1. Вишняков В. А., Беляев О. А. Универсальная последовательная шина USB: Пособие. – Рыбинск: РГАТА, 2004.




  1. Вишняков В.А., Соколов С. Ю. Микроконтроллеры семейства MCS-51: Пособие. – Рыбинск: РГАТА, 2004.




  1. Вишняков В.А., Рахманин Д. А. Специализированное USB устройство PDIUSBD12: Пособие. – Рыбинск: РГАТА, 2004.




  1. Вишняков В.А. Интерфейсы периферийных устройств: Методические указания к курсовой работы. – Рыбинск: РГАТА, 2004. – 8 с.




  1. Единая система конструкторской документации: Справочное пособие / Борушек С.С., Волков А.А., Ефимова М.М. и др. - 2-е изд., перераб. и доп. - М.: Издательство стандартов, 1989.




  1. Комаров В.М. Микропроцессорные системы: Учебное пособие. - Рыбинск: РГАТА, 1997.




  1. Петровский И. И., Прибыльский А. В., Троян А. А. Логические ИС КР1533, КР1554. Справочник. – М.: Бином, 1993.



Поз. обозначение
^

Наименование

Кол.

Примечание


Документация




ПУКП. 020100. 000Э3

^

Схема электрическая принципиальная






Стандартные изделия






Конденсаторы

^



С1

1

КМ-5б-П33-10пФ±5% ОЖО 461.121ТУ




С2

1

К50–6–47мкФ +80% - 6,3В ОЖО 464.137ТУ




^

С3..С7

4

К10–17–68пФ 10% - 25В ОЖО 460. 171ТУ






^

Микросхемы



DD1, DD2

2

КР1533ИЕ7 бК0.348.806-08ТУ




DD3


КР1533ТМ2 бК0.348.806-02ТУ
^

1



DD4


КР1533ЛН1 бК0.348.806-01ТУ

1




DD6

1


КР1533ЛИ1 бК0.348.806-13ТУ


^

DD7

1

Intel 8051




DD8

1

PDIUSBD12



DD5




1

^

КР1810ВИ54 бК0.348.800-11 ТУ




Разъемы




СНП34 – 20/44X12,5B-21-B




^

X1

1




X2

1

USBА – 1J






^

Резистор



МЛТ – 0,125 – 2 кОм 10 % ОЖО 467.180ТУ

R1

1







^

Резонатор кварцевый







BQ

1


РК169МA-7АП-6МГц ОД.338.017ТУ


^




Разраб. Белов С. А.


РГАТА

ВС2-00




Лит. Лист Листов

Н. контр.

Пров. Вишняков В. А.
^

Модуль ввода-вывода.

Перечень элементов


Изм. Лист № докум. Подп. Дата
^

ПУКП. 020100. 000ПЭ


У

Утв.

1



Скачать файл (410.4 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru