Доброго времени суток!!!
Пытаюсь сделать анализатор на 16 входов на базе PIC18F2550 подключаемый через USB к компьютеру.
Со стороны компа PureBasic, проблем нет.
А вот с процессором, точнее с SIE (аппаратный USB) процессора, возникла огромная проблема.
По задумке мне нужно 2 конечных точки, №0 - для конфигурации при включении и №1 - для изохорной передачи данных.
Но вот возникает проблема: комп присылает команду SETUP и данные с описанием дескриптора, потом присылает IN и должен получить буфер с дескриптором, который я уже записал, но происходит ошибка называемая "IDLE длится более 16 бит с момента EOP" и все по кругу (SETUP, IN, установка флага BTOEF) несколько раз (3-7), после чего ставится флаг IDLEIF и комп кречит "USB устройство работает неправильно".
Пишу программу на MicroCode Studio PICBASIC PRO.
Помогите пожалуйста, кто чем может?
Выкладываю код программы, правдо там много всего для того чтобы видеть что происходит.
Дисплей, ком порт и куча переменных, использую для отладки. Работа с SIE:
'-------------------- Конфигурация USB -----------------------------
UCON.6 = 0 'PPBRST Ping-Pong Buffers Reset bit
UCON.4 = 0 'PKTDIS
UCON.3 = 0 'USBEN USB Module Enable
UCON.2 = 0 'RESUME Resume Signaling Enable
UCON.1 = 0 'SUSPND Suspend USB 0 = USB module and supporting circuitry in normal operation
UCFG.7 = 0 'UTEYE USB Eye Pattern Test Enable
UCFG.6 = 0 'UOEMON USB OE Monitor Enable
UCFG.4 = 1 'UPUEN USB On-Chip Pull-up Enable
UCFG.3 = 0 'UTRDIS On-Chip Transceiver Disable
UCFG.2 = 0 'FSEN Full Speed Enable (FS - CONFIG1L = 22h CONFIG1H = 0Ch, LS - CONFIG1L = 32h CONFIG1H = 0Eh)
UCFG.1 = 0 'PPB1 Ping-Pong Buffers Configuration
UCFG.0 = 0 'PPB0
'-EndPoint0-
UEP0.4 = 1 'EPHSHK Endpoint Handshake Enable
UEP0.3 = 0 'EPCONDIS Bidirectional Endpoint Control 0 = SETUP, IN and OUT
UEP0.2 = 1 'EPOUTEN Endpoint Output Enable bit
UEP0.1 = 1 'EPINEN Endpoint Input Enable bit
UEP0.0 = 0 'EPSTALL Endpoint Stall Enable bit
'-EndPoint1-
UEP1.4 = 1 'EPHSHK Endpoint Handshake Enable
UEP1.3 = 1 'EPCONDIS Bidirectional Endpoint Control 1 = IN and OUT
UEP1.2 = 1 'EPOUTEN Endpoint Output Enable bit
UEP1.1 = 1 'EPINEN Endpoint Input Enable bit
UEP1.0 = 0 'EPSTALL Endpoint Stall Enable bit
UIE.3 = 1 'TRNIE
UIE = 255
UEIE = 255
'-------------------------------------------------------------------
'-EndPoint0-
EP0_Out_Stat var byte $400
EP0_Out_Cnt var byte $401
EP0_Out_Adrl var byte $402
EP0_Out_Adrh var byte $403
EP0_In_Stat var byte $404
EP0_In_Cnt var byte $405
EP0_In_Adrl var byte $406
EP0_In_Adrh var byte $407
'-EndPoint1-
EP1_Out_Stst var byte $408
EP1_Out_Cnt var byte $409
EP1_Out_Adrl var byte $40A
EP1_Out_Adrh var byte $40B
EP1_In_Stat var byte $40C
EP1_In_Cnt var byte $40D
EP1_In_Adrl var byte $40E
EP1_In_Adrh var byte $40F
BD_Stat_SIE con %10000000
BD_Stat_CPU con %00000000
USB_Data0 var byte [255] $500
USB_Data1 var byte [255] $600
USB_x var byte
USB_y var byte
USB_c var byte
loop:
'sleep 1
'pauseus 2
'------------------------ Прерывание от USB --------------------
if PIR2.5 = 1 then 'USBIF Interrupt Flag bit
PIR2.5 = 0 '(must be cleared in software)
PIR2_count = PIR2_count + 1
gosub USB_Processing
endif ' END USB Interrupt Flag bit
'-------------------------------------------------------------------------
Goto loop
End
'---------------------- Îáðàáîòêà USB ------------------------------------------
USB_Processing:
gosub Log_wr
if UIR > 0 then 'Ñòàòóñ ïðåðûâàíèÿ USB
UIR_count = UIR_count + 1
if UEP0.0 = 1 then 'Áèò îñòàíîâêè êîíå÷íîé òî÷êè
UEP0.0 = 0
endif
if UIR.6 = 1 then 'SOFIF START-OF-FRAME Token Interrupt
'Led1 = 1
UIR.6 = 0
endif
if UIR.3 = 1 then 'TRNIF Transaction Complete Interrupt (Òðàíçàêöèÿ âûïîëíåíà)
Led1 = 1
TRNIF_count = TRNIF_count + 1
gosub USB_trnif
UIR.3 = 0
endif
if UEIR > 0 then
'Led3 = 1
UEIR_count = UEIR
UEIR = 0
endif
endif
UIR = 0 ' Сброс флагов прерываний USB
UEIR = 0 ' Сброс флагов ошибок USB
UCON.4 = 0 'Пакетная обработка включена
UEP0 = %00010110
EP0_Out_Stat = BD_Stat_SIE ' Передаю дескрипторы памяти ЕР0 для SIEì
EP0_In_Stat = BD_Stat_SIE
return
USB_trnif: ' Транзакция завершена
if USTAT = 0 then ' Принят пакет OUT или SETUP в EP0
if UCON.4 = 1 then ' Принят пакет SETUP, маркер SIE и обработка пакетов остановлены
gosub USB_Processing_Setup
endif
UCON.4 = 0 'маркер SIE и обработка пакетов включены
EP0_Out_Stat = BD_Stat_SIE
EP0_In_Stat = BD_Stat_SIE
endif
If USTAT = %00000100 then ' Принят пакет IN в EP0
LED3 = 1
endif
if USB_Data0[EP0_Out_Adrl] = $00 then ' Стандартный запрос от Хоста к USB (BmRequestTupe)
if USB_Data0[EP0_Out_Adrl+1] = $05 then ' Установить адрес (bRequest)
UADDR = USB_Data0[EP0_Out_Adrl+2]
endif
endif