Цілком зрозуміло, що пристрій USB 2.0 зможе реалізувати високу швидкість, тільки якщо по дорозі від нього до хост - контролера (теж 2.0) зустрічатимуться тільки хаб» 2.0. Якщо це правило порушити і між ним і контролером 2.0 опиниться старий хаб, то зв'язок може бути встановлений тільки в режимі FS. Якщо така швидкість, пристрій і клієнтське ПО влаштує (наприклад, для принтера і сканера це виллється тільки в більший годину очікування користувача), то підключений пристрій працювати буде, але з'явиться повідомлення про неоптимальну конфігурацію з'єднань. По можливості її слід виправити, благо перемикання кабелів USB можна виконувати «на ходу». Пристрої і ПО, критичні до смуги пропускання шини, в неправильній конфігурації працювати відмовляться і категорично зажадають перемикань. Якщо ж хост - контролер старий, то вся краса USB 2.0 виявиться недоступною користувачу. У цьому випадку доведеться міняти хост - контролер (міняти системну платню або набувати PCI-карти контролера). Контролер і хаби USB 2.0 дозволяють підвищити сумарну пропускну спроможність шини і для старих пристроїв. Якщо пристрої FS підключати до різних портів хабов USB 2.0 (включаючи і кореневий), то для них сумарна пропускна спроможність шини USB зросте в порівнянні з 12 Мбіт/с в стільки разів, скільки використовується портів високошвидкісних хабів.
Для виявлення помилок передачі кожен пакет має контрольні поля CRC-кодів, що дозволяють виявляти всі одиночні і подвійні бітові помилки. Апаратні засоби виявляють помилки передачі, а контролер автоматичний проводити триразову спробу передачі. Якщо повтори безуспішні, повідомлення про помилку передається клієнтському ПО.
Хочу поділитися своїми напрацюваннями у області передачі даних від саморобного пристрою на мікроконтролері до комп'ютера і назад по шині USB. До цього я міг писати тільки простенькі програми для обміну даними через COM-порт, але оскільки зараз прийшла епоха заходу для COM, довелося переходити на USB програмку для комп'ютера, яка обмінюється даними з пристроєм на мікроконтролері PIC16F876A через COM-порт, але із-за того що на нових комп'ютерах перестали встановлювати COM-порти з'явилася необхідність переробити цей проект на USB. Я дізнався, що є декілька способів це зробити:
У фірми Microchip є відповідні для цієї справи мікроконтролери PIC18F2455/2550/4455/4550. Вони мають в своєму складі модуль USB. Я в цій статті орієнтуватимуся на мікроконтролер PIC18F4550.
Отже, нам потрібно написати програму для мікроконтролера PIC18F4550. Таку програму щоб при підключенні цього мікроконтролера до комп'ютера відбувалося створення віртуального COM-порту, через який можна передавати і приймати дані. Задачка не з адже легких , не дивлячись на те, що в цій мікросхемі є модуль USB загальне уявлення про те, що відбувається на шині потрібно знати. Модуль USB займається дуже глибокими речами на дуже низькому рівні, такими як канальне кодування, декодування подій і помилок, а що стосується протоколів транзакцій, структури дескрипторів, обробки запитів і інших повинна займатися програма мікроконтролера, що управляє. Означає, щоб написати цю програму доведеться все-таки ознайомитися із специфікацією USB і із специфікацією CDC класу? Тут довелося подсуетиться мені і парирувати цей проект на асемблер. Але я не просто переписав цей проект, а узяв на себе сміливість внести в нього істотні зміни. Власне про те, що у мене вийшло я і хочу розповісти в цій дипломні.
Опис USB і програми я вирішив почати не з утомливої теорії, , а з найцікавішого, тобто з практики. Я хочу, щоб ви відчули як це, коли твоя робота при підключенні до USB розпізнається комп'ютером як пристрій готовий до роботи. Для цього потрібно зібрати наступну схему. Рис . 11 Підключення мікропроцесора PIC18F4550 до ПК через порт USB
4. РОЗРОБКА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ДЛЯ МІКРОКОНТРОЛЕРА РІС18F4550 ТА ПРОГРАМНЕ ЗАБЕЗПЕЧЕНН ДЛЯ USB.
LIST P=18F4550
INCLUDE <P18F4550.INC>
model small
stack 100h
dataseg
str0 DB 0ah,0dh,'$'
str1 DB 'Connect programmer & press "Enter" key to continue','$'
str2 DB 0ah,0dh,'Data write & read is not equal,press Enter to repeat','$'
str3 DB 0ah,0dh,'OK','$'
codeseg
mov ax,@data
mov ds,ax
mov es,ax
mov dx,378h
mov al,24h
out dx,al
mov ah,9
lea dx,str1
int 21h
lea dx,str0
mov ax,71ch
mov al,10h
mov al,8
call loadcon
mov cx,16
cc : call data0
loop cc
mov cx,7
cc1 : call loadinc
loop cc1
mov si,100
cc2 : call loaddat
call data0
call data1
mov di,6
cc3 : call data1
dec di
jnz cc3
call loadbeg
call zat
dec si
jnz cc2
call loadred
xor bp,bp
call redbyte
cmp bp,3f31h
jz m8
lea dx,str2
jmp m0
m8 : mov ah,9
lea dx,str3
zat proc
mov bp,1fh
cycle05: mov cx,0fffh
cycle03: nop
loop cycle03
dec bp
jnz cycle05
ret
zat endp
data0 proc
mov al,0ah
data0 endp
data1 proc
mov al,0bh
mov al,9
data1 endp
loaddat proc
mov al,0ch
loaddat endp
loadbeg proc
loadbeg endp
loadinc proc
loadinc endp
loadred proc
loadred endp
loadcon proc
loadcon endp
redbyte proc
mov al,0eh
mov bh,15
r1 : mov al,0eh
inc dx
in al,dx
dec dx
rcl al,1
rcr bp,1
dec bh
jnz r1
and bp,3fffh
redbyte endp
m0 : mov ah,4ch
end
USB
cblock 0x00
R1
ADRESS
DATA_0_1
DATA_
endc
SI111:
BCF UCON,USBEN,0
CALL DELAY
clrf USTAT
movlw 0x40
movwf UCON
MOVLW