Доброго времени суток!!!
Пытаюсь сделать анализатор на 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.
Помогите пожалуйста, кто чем может?
Работа с USB в PIC18F2550
- Реклама
Re: Работа с USB в PIC18F2550
Судя о всему, что-то неправильно в проге МК (КЭП).
Без кода сложно сказать в чем загвоздка.
Без кода сложно сказать в чем загвоздка.
Re: Работа с USB в PIC18F2550
Выкладываю код программы, правдо там много всего для того чтобы видеть что происходит.
Дисплей, ком порт и куча переменных, использую для отладки. Работа с 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
return
USB_Processing_Setup:
' LCD_Temp = USB_Data0[EP0_Out_Adrl+1]
' gosub DecHex
' LCD_Char[x] = LCD_Hexe[1]
' LCD_Char[x+1] = LCD_Hexe[0]
' x = x + 2
if USB_Data0[EP0_Out_Adrl] = $80 then ' (BmRequestTupe) стандартный запрос
if USB_Data0[EP0_Out_Adrl+1] = $06 then ' (bRequest) Получить дескриптор
toggle Led2
gosub USB_Request_get_descriptor
EP0_Out_Stat = BD_Stat_SIE
UEP0 = %00010110
UCON.4 = 0
UIR.3 = 0 ' Сброс флага TRNIF (Transaction Complete Interrupt)
endif
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
return
USB_Request_get_descriptor: ' Загрузка стондартного дескриптора в EP0
if USB_Data0[EP0_Out_Adrl+3] = $01 then
EP0_In_Stat = BD_Stat_CPU
for USB_x = 0 to 17
LOOKUP2 USB_x, [18, 1, 0, 2, 0, 0, 0, 64, 1, 0, 2, 0, 3, 0, 1, 2, 3, 1], USB_c
USB_Data0[USB_x + 100] = USB_c
next USB_x
EP0_In_Cnt = 18
EP0_In_Adrl = 100
EP0_In_Adrh = 5
EP0_In_Stat = BD_Stat_SIE
endif
return
Дисплей, ком порт и куча переменных, использую для отладки. Работа с 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
return
USB_Processing_Setup:
' LCD_Temp = USB_Data0[EP0_Out_Adrl+1]
' gosub DecHex
' LCD_Char[x] = LCD_Hexe[1]
' LCD_Char[x+1] = LCD_Hexe[0]
' x = x + 2
if USB_Data0[EP0_Out_Adrl] = $80 then ' (BmRequestTupe) стандартный запрос
if USB_Data0[EP0_Out_Adrl+1] = $06 then ' (bRequest) Получить дескриптор
toggle Led2
gosub USB_Request_get_descriptor
EP0_Out_Stat = BD_Stat_SIE
UEP0 = %00010110
UCON.4 = 0
UIR.3 = 0 ' Сброс флага TRNIF (Transaction Complete Interrupt)
endif
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
return
USB_Request_get_descriptor: ' Загрузка стондартного дескриптора в EP0
if USB_Data0[EP0_Out_Adrl+3] = $01 then
EP0_In_Stat = BD_Stat_CPU
for USB_x = 0 to 17
LOOKUP2 USB_x, [18, 1, 0, 2, 0, 0, 0, 64, 1, 0, 2, 0, 3, 0, 1, 2, 3, 1], USB_c
USB_Data0[USB_x + 100] = USB_c
next USB_x
EP0_In_Cnt = 18
EP0_In_Adrl = 100
EP0_In_Adrh = 5
EP0_In_Stat = BD_Stat_SIE
endif
return
- Вложения
-
- USB_PC_HID.rar
- (4.91 КБ) 272 скачивания
