DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

DevioLab підбирає стратегії, відстежує ринки та автоматизує купівлю і продаж активів. Кількість доступних криптовалют, акцій і торгових можливостей зростає щодня.

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Звіт з лабораторної роботи “Моделювання роботи шини USB”

Оригінальна назва роботи

Моделювання роботи шини USB

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних наук та інформаційних технологій
Факультет:
Комп’ютерні науки
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2004
Тип роботи:
Звіт
Предмет:
Комп ютерні системи та мережі
Група:
КІ
Коротко про документ

Про що ця робота

У звіті досліджено протокол роботи та принципи передачі даних універсальної послідовної шини USB. Наведено приклади програмної реалізації моделювання взаємодії хоста з пристроями.

У роботі розглядаються

  • Універсальна послідовна шина USB
  • Протоколи обміну даними
  • Архітектура хост-ведомий
  • Формати пакетів USB
  • Моделювання периферійних пристроїв
  • Програмна реалізація інтерфейсу

Зміст і розділи

  1. Мета роботи
  2. Теоретичні відомості
  3. Формати пакетів
  4. Приклад проведення транзакції
  5. Висновок
Для кого:Студенти технічних спеціальностей вищих навчальних закладів
Викладачі:Викладач кафедри ЕОМ

Ключові поняття

USBхабпакет данихтранзакціяfull speedhigh speedPIDпериферійні пристрої

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” Кафедра ЕОМ Звіт з лабораторної роботи “Моделювання роботи шини USB” Мета роботи: Вивчити протокол роботи шини USB. Теоретичні відомості. USB – Universal Sirial Bus – Універсальна послідовна шина – оріентована на підключення перифирійних пристроїв до персонального комп’ютера. Версія 1.0 і 1.1 підтримують повну швиккіть (full speed) – 12Мбіт/с, і низьку швикість (low speed) – 1.5 Мбіт/с. В версії 2.0 додатково визначена висока швидкість (high speed) – 480 Мбіт/с. В одній системі можуть бути присутні і працювати приствої з трьома різними швидкостями. Шина з використанням проміжних хабів дозволяє з’єднувати пристрої віддалені від комп’ютера до 25 метрів. USB забезпечує обмін між хостом-комп’ютером і багатьма пристроями. Пристрою можуть бути хабами, функціями, або їхньою комбінацією. Хаб забезпечує додаткові точки з’єднання пристроїв до шини. Пристрій функція надає системі додаткові функції. Шина USB є хост-центристською: єдиним ведучим пристроєм, який керує обміном, є хост-комп’ютер, а всі приєднані пристрої – ведомі. Фізично топологія шини USB – багатоярусна зірка. Її вершиною є хост-контроллер. Формати пакетів Командний пакет:  де      Пакет даних:  Приклад проведення транзакції  Текст функцій модлювання USB. void CUSB_modelDlg::OnPrinterConnect() { CString str; PACKET_TYPE p1; str = "HOST: sending SETUP"; p1.TOKEN_PACKET.PID = PID_SETUP; p1.TOKEN_PACKET.ADDR = 0; p1.TOKEN_PACKET.ENDP = 0; p1.TOKEN_PACKET.CRC5 = 0; printer_host.SendPacket(&p1); PACKET_TYPE * res = printer.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_SETUP){ str += "\r\nPRINTER: received SETUP"; p1.TOKEN_PACKET.PID = PID_ACK; p1.TOKEN_PACKET.ADDR = 0; p1.TOKEN_PACKET.ENDP = 0; p1.TOKEN_PACKET.CRC5 = 0; printer.SendPacket(& p1); str += "\r\nPRINTER: sending ACK"; } res = printer_host.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_ACK){ str += "\r\nHOST: received ACK"; p1.DATA_PACKET.PID = PID_DATA0; char data = GET_DISCRIPTOR; p1.DATA_PACKET.DATA = & data; printer_host.SendPacket(& p1); str += "\r\nHOST: sending DATA0 with GET_DESCRIPTOR"; } res = printer.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nPRINTER: received DATA0 with GET_DESCRIPTOR"; p1.DATA_PACKET.PID = PID_DATA0; char data = DISCRIPTOR; p1.DATA_PACKET.DATA = & data; printer.SendPacket(&p1); str += "\r\nPRINTER: sending descriptor"; } res = printer_host.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nHOST: received descriptor"; p1.TOKEN_PACKET.PID = PID_ACK; p1.TOKEN_PACKET.ADDR = 0; p1.TOKEN_PACKET.ENDP = 0; p1.TOKEN_PACKET.CRC5 = 0; printer_host.SendPacket(&p1); str += "\r\nHOST: sending ACK"; } edit_console.SetWindowText(str); } void CUSB_modelDlg::OnPrinterSend() { CString str = ""; PACKET_TYPE p; p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; printer_host.SendPacket(&p); str += "HOST: sending OUT"; PACKET_TYPE * res = printer.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nPRINTER: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ edit_print_data.GetWindowTextLength() ]; edit_print_data.GetWindowText(p.DATA_PACKET.DATA, edit_print_data.GetWindowTextLength()); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; printer_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = printer.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nPRINTER: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; printer.SendPacket(&p); str += "\r\nPRINTER: sending ACK"; } edit_console.SetWindowText(str); } void CUSB_modelDlg::OnFlashConnect() { CString str; PACKET_TYPE p1; str = "HOST: sending SETUP"; p1.TOKEN_PACKET.PID = PID_SETUP; p1.TOKEN_PACKET.ADDR = 0; p1.TOKEN_PACKET.ENDP = 0; p1.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p1); PACKET_TYPE * res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_SETUP){ str += "\r\nFLASH: received SETUP"; p1.TOKEN_PACKET.PID = PID_ACK; p1.TOKEN_PACKET.ADDR = 0; p1.TOKEN_PACKET.ENDP = 0; p1.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(& p1); str += "\r\nFLASH: sending ACK"; } res = flash_host.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_ACK){ str += "\r\nHOST: received ACK"; p1.DATA_PACKET.PID = PID_DATA0; char data = GET_DISCRIPTOR; p1.DATA_PACKET.DATA = & data; flash_host.SendPacket(& p1); str += "\r\nHOST: sending DATA0 with GET_DESCRIPTOR"; } res = flash.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with GET_DESCRIPTOR"; p1.DATA_PACKET.PID = PID_DATA0; char data = DISCRIPTOR; p1.DATA_PACKET.DATA = & data; flash.SendPacket(&p1); str += "\r\nFLASH: sending descriptor"; } res = flash_host.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nHOST: received descriptor"; p1.TOKEN_PACKET.PID = PID_ACK; p1.TOKEN_PACKET.ADDR = 0; p1.TOKEN_PACKET.ENDP = 0; p1.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p1); str += "\r\nHOST: sending ACK"; } edit_console.SetWindowText(str); } void CUSB_modelDlg::OnFlashCreatefile() { CString str = ""; PACKET_TYPE p; p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "HOST: sending OUT"; PACKET_TYPE * res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ 11 ]; strcpy(p.DATA_PACKET.DATA, "CreateFile"); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; } p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "\r\nHOST: sending OUT"; res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ edit_file_name.GetWindowTextLength() +1 ]; edit_file_name.GetWindowText(p.DATA_PACKET.DATA, edit_file_name.GetWindowTextLength() +1); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; FILE * file = fopen(res->DATA_PACKET.DATA,"w"); fclose(file); } edit_console.SetWindowText(str); } void CUSB_modelDlg::OnFlashWritedata() { CString str = ""; PACKET_TYPE p; p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "HOST: sending OUT"; PACKET_TYPE * res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ 11 ]; strcpy(p.DATA_PACKET.DATA, "Write"); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; } p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "\r\nHOST: sending OUT"; res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ edit_file_name.GetWindowTextLength() +1 ]; edit_file_name.GetWindowText(p.DATA_PACKET.DATA, edit_file_name.GetWindowTextLength() +1); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); FILE * file; if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; file = fopen(res->DATA_PACKET.DATA,"w"); } p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "\r\nHOST: sending OUT"; res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ edit_flash_data.GetWindowTextLength() +1 ]; edit_flash_data.GetWindowText(p.DATA_PACKET.DATA, edit_flash_data.GetWindowTextLength() + 1); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; fprintf(file, "%s", res->DATA_PACKET.DATA); } fclose(file); edit_console.SetWindowText(str); } void CUSB_modelDlg::OnFlashReadData() { CString str = ""; PACKET_TYPE p; p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "HOST: sending OUT"; PACKET_TYPE * res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ 11 ]; strcpy(p.DATA_PACKET.DATA, "Read"); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; } p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "\r\nHOST: sending OUT"; res = flash.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nFLASH: received OUT"; } p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ edit_file_name.GetWindowTextLength() +1 ]; edit_file_name.GetWindowText(p.DATA_PACKET.DATA, edit_file_name.GetWindowTextLength() +1); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash_host.SendPacket(&p); str += "\r\nHOST: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash.ReadPacket(); FILE * file; if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nFLASH: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending ACK"; file = fopen(res->DATA_PACKET.DATA,"r"); } p.TOKEN_PACKET.PID = PID_OUT; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash.SendPacket(&p); str += "\r\nFLASH: sending IN"; res = flash_host.ReadPacket(); if(res->TOKEN_PACKET.PID == PID_OUT){ str += "\r\nHOST: received IN"; } char * data = new char [100]; fgets(data,100,file); p.DATA_PACKET.PID = PID_DATA0; p.DATA_PACKET.DATA = new char [ 101 ]; strcpy(p.DATA_PACKET.DATA, data); p.DATA_PACKET.CRC16[1] = 0; p.DATA_PACKET.CRC16[2] = 1; flash.SendPacket(&p); str += "\r\nFLASH: sending DATA0 with "; str += p.DATA_PACKET.DATA; res = flash_host.ReadPacket(); if(res->DATA_PACKET.PID == PID_DATA0){ str += "\r\nHOST: received DATA0 with "; str += res->DATA_PACKET.DATA; p.TOKEN_PACKET.PID = PID_ACK; p.TOKEN_PACKET.ADDR = 0; p.TOKEN_PACKET.ENDP = 0; p.TOKEN_PACKET.CRC5 = 0; flash_host.SendPacket(&p); str += "\r\nHOST: sending ACK"; } fclose(file); edit_flash_data.SetWindowText(res->DATA_PACKET.DATA); edit_console.SetWindowText(str); } Висновок: виконуючи дану лабораторну роботу я ознайомився з роботою шини USB
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!