|
|
  |
USB своими руками для sam7x256, или проблемы с которыми я столкнулся. |
|
|
|
Feb 25 2011, 11:27
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата "После сброса устройство надо заново проинициализировать " - это имеется в виду прерывание ENDBUS?
вообщем не помогло. всё так же нет прерывания конечной точки. у меня конфигурация частоты вынесена в стартуп, может в основном теле программы повторить? глаза замылились, чувствую, что бьюсь о стенку. уже вторую плату сделали - тоже самое Да оно самое ENDBUSRES. Попробуйте в другой порт USB воткнуть или вообще в другой комп))) У меня была такая проблема на работе HID устройство (джостик) работало на всех компах корректно и не зависало (В Battlefield 2 пробовали  ). Дома подключаю, дрова поставились, но где-то через несколько минут девайс зависал не знаю почему... Точнее не исследовал почему зависает). В стартупе я написал вход в прерывание и выход из него и инициализировал стек. Далее PC шел на инициализацию периферии и т.д., а затем на main(). С другой стороны возьмите и разрешите все прерывания (например по RS-232 можно послать состояние регистра UDP_ISR, все равно прерывания чистить надо вручную). По порядку. Инициализация частот. Настройка PLL. Разрешение тактирования UDP модуля где нужно 48 МГц отдельно!!! (AT91C_BASE_PMC -> PMC_SCER = AT91C_PMC_PCK | AT91C_PMC_UDP;) Конфигурация контроллера прерываний. Код AT91C_BASE_AIC -> AIC_IDCR = AT91C_ALL_INT; //запрещение всех прерываний AT91C_BASE_AIC -> AIC_ICCR = AT91C_ALL_INT; //сброс всех прерываний AT91C_BASE_AIC -> AIC_EOICR = 0xF1F1F1F1; //запись в регистр конца прерывания AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_N_UDP] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0;//режим прерывания IRQ от USB запуск высоким уровнем!!! AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_N_UDP] = (int) usb; //адрес обработчика прерывания IRQ от USB AT91C_BASE_AIC -> AIC_IDCR = AT91C_ALL_INT; //запрещение всех прерываний Конфигурация USB. Разрешение его тактирования! (AT91C_BASE_PMC -> PMC_PCER = AT91C_ID_UDP;) Разрешаем прерывание по USB. (AT91C_BASE_AIC -> AIC_IECR = AT91C_ID_UDP;) Если у Вас отдельно как-то подключается резистор к шине (например транзистором) подключаем. Дальше должны пойти прерывания. Первые буду сброс шины ENDBUSRES у меня раза четыре шина сбрасывалась.После сброса надо заново инициализировать USB. Потом туча прерываний SOFINT. Потом должно быть прерывание от конечной точки. Причем только от НУЛЕВОЙ!!! И она должна быть КОНТРОЛЬНОЙ!!! Проверте тактируете вы USB частотой 48 МГц, тактируете ли вы сам периферийный модуль USB, сконфигурировали ли вы модуль USB, разрешили ли вы в модуле прерывания от конечных точек, разрешили ли вы прерывания для модуля USB в контроллере прерываний?
|
|
|
|
|
Mar 1 2011, 11:44
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
к моей плате подходят только пару-тройку ENBUSRES, а потом несколько resume. тот же самый проект, но с другой конфигурацией частоты(от кварца) на отладочной плате почти сразу получает и SOF и EP0 прерывание в UDP_ISR.
выложите пожалуйста кто-нибудь вашу электрическую схему. кусочек только про USB интерфейс.
на своей плате проверил PLL через программируемы клок: вывел на ножку - нормально и 48MHz и 12MHz.
заново инициализировать USB после ENDBUSRES: может здесь я не догоняю что-то?
AT91C_BASE_UDP -> UDP_IDR = AT91C_UDP_ALL_INT | AT91C_UDP_ALL_EP; //Запрещаем все прерывания AT91C_BASE_UDP -> UDP_IER = AT91C_UDP_ALL_INT | AT91C_UDP_EPINT0; //Разрешить прерывание от 0 AT91C_BASE_UDP -> UDP_CSR[AT91C_UDP_EP0] = AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS;//0 конечная контрольная точка AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_ENDBUSRES; //Сброс прерывания по сбросу шины
так?
а как проверить возимело-ли это действие? атмеловцы советуют перепроверять запись флагов в UDP_CSR и в цикле долбить флаги пока не изменятся. это иногда к зависанию приводит, еще метод есть? можно ли заставить UDP просто выдать что-нибудь на линию? может оба контроллера бракованные, у нас вообще были проблемы с их покупкой
|
|
|
|
|
Mar 1 2011, 16:25
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата к моей плате подходят только пару-тройку ENBUSRES, а потом несколько resume. тот же самый проект, но с другой конфигурацией частоты(от кварца) на отладочной плате почти сразу получает и SOF и EP0 прерывание в UDP_ISR. А от чего у вас тогда ARM тактируется?... Атмелу для USB вроде нужна ТОЛЬКО 48 МГц. 12 МГц туда ни к сегу ни к городу. 48 МГц USB нужно чтобы частоту 12 МГц получить. У меня тоже "отладочная платка" AT91SAM7A3-EK. На ней все прекрасно. На тех платках, которые я проэктировал на основе ARMа, я перенес все с кита (обьвязку и цепочку PLL). Все запускалось и прекрасно работало кроме PLL. Не запускался... Наивно полагая, если склонирую с кита, что все заработает. USB нужны 2 частоты 48 МГц для приемо-передающего устройства, которая получается только с PLL, и "любая" тактовая частота для модуля чтобы ядро общалось с USB. 48 МГц включатся командой: Код AT91C_BASE_PMC -> PMC_SCER = AT91C_PMC_UDP; Перед этим 48 МГц надо получить (она еще делится в своем же спец делителе для USB). Для "общения ядра с USB": Код AT91C_BASE_PMC -> PMC_PCER = AT91C_ID_UDP;
Сообщение отредактировал shrek - Mar 1 2011, 16:40
|
|
|
|
|
Mar 2 2011, 13:19
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(shrek @ Mar 1 2011, 19:25)  ... Не забываем про AT91C_BASE_PMC -> CKGR_PLLR USB_DIV
Сообщение отредактировал IgorKossak - Mar 2 2011, 17:19
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Mar 4 2011, 07:39
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
то, что было на PLL, я и проверял, выводя наружу, с разными делениями. поскольку 48MHz МК может получить из 96MHz PLL, я решил до UDP частота доходит в порядке. CODE Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT EQU 0x17 Mode_UND EQU 0x1B Mode_SYS EQU 0x1F
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
; Internal Memory Base Addresses FLASH_BASE EQU 0x00100000 RAM_BASE EQU 0x00200000
;// <h> Stack Configuration (Stack Sizes in Bytes) ;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8> ;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8> ;// <o2> Abort Mode <0x0-0xFFFFFFFF:8> ;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8> ;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8> ;// <o5> User/System Mode <0x0-0xFFFFFFFF:8> ;// </h>
UND_Stack_Size EQU 0x00000000 SVC_Stack_Size EQU 0x00000008 ABT_Stack_Size EQU 0x00000000 FIQ_Stack_Size EQU 0x00000000 IRQ_Stack_Size EQU 0x00000080 USR_Stack_Size EQU 0x00000400
ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ FIQ_Stack_Size + IRQ_Stack_Size)
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE USR_Stack_Size __initial_sp SPACE ISR_Stack_Size Stack_Top
;// <h> Heap Configuration ;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF> ;// </h>
Heap_Size EQU 0x00000000
AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit
; Reset Controller (RSTC) definitions RSTC_BASE EQU 0xFFFFFD00 ; RSTC Base Address RSTC_MR EQU 0x08 ; RSTC_MR Offset
;/* ;// <e> Reset Controller (RSTC) ;// <o1.0> URSTEN: User Reset Enable ;// <i> Enables NRST Pin to generate Reset ;// <o1.8..11> ERSTL: External Reset Length <0-15> ;// <i> External Reset Time in 2^(ERSTL+1) Slow Clock Cycles ;// </e> ;*/ RSTC_SETUP EQU 1 RSTC_MR_Val EQU 0xA5000401
; Embedded Flash Controller (EFC) definitions EFC_BASE EQU 0xFFFFFF00 ; EFC Base Address EFC0_FMR EQU 0x60 ; EFC0_FMR Offset EFC1_FMR EQU 0x70 ; EFC1_FMR Offset
;// <e> Embedded Flash Controller 0 (EFC0) ;// <o1.16..23> FMCN: Flash Microsecond Cycle Number <0-255> ;// <i> Number of Master Clock Cycles in 1us ;// <o1.8..9> FWS: Flash Wait State ;// <0=> Read: 1 cycle / Write: 2 cycles ;// <1=> Read: 2 cycle / Write: 3 cycles ;// <2=> Read: 3 cycle / Write: 4 cycles ;// <3=> Read: 4 cycle / Write: 4 cycles ;// </e> EFC0_SETUP EQU 1 EFC0_FMR_Val EQU 0x00320100
;// <e> Embedded Flash Controller 1 (EFC1) ;// <o1.16..23> FMCN: Flash Microsecond Cycle Number <0-255> ;// <i> Number of Master Clock Cycles in 1us ;// <o1.8..9> FWS: Flash Wait State ;// <0=> Read: 1 cycle / Write: 2 cycles ;// <1=> Read: 2 cycle / Write: 3 cycles ;// <2=> Read: 3 cycle / Write: 4 cycles ;// <3=> Read: 4 cycle / Write: 4 cycles ;// </e> EFC1_SETUP EQU 0 EFC1_FMR_Val EQU 0x00320100
; Watchdog Timer (WDT) definitions WDT_BASE EQU 0xFFFFFD40 ; WDT Base Address WDT_MR EQU 0x04 ; WDT_MR Offset
;// <e> Watchdog Timer (WDT) ;// <o1.0..11> WDV: Watchdog Counter Value <0-4095> ;// <o1.16..27> WDD: Watchdog Delta Value <0-4095> ;// <o1.12> WDFIEN: Watchdog Fault Interrupt Enable ;// <o1.13> WDRSTEN: Watchdog Reset Enable ;// <o1.14> WDRPROC: Watchdog Reset Processor ;// <o1.28> WDDBGHLT: Watchdog Debug Halt ;// <o1.29> WDIDLEHLT: Watchdog Idle Halt ;// <o1.15> WDDIS: Watchdog Disable ;// </e> WDT_SETUP EQU 1 WDT_MR_Val EQU 0x00008000
; Power Mangement Controller (PMC) definitions PMC_BASE EQU 0xFFFFFC00 ; PMC Base Address PMC_MOR EQU 0x20 ; PMC_MOR Offset PMC_MCFR EQU 0x24 ; PMC_MCFR Offset PMC_PLLR EQU 0x2C ; PMC_PLLR Offset PMC_MCKR EQU 0x30 ; PMC_MCKR Offset PMC_SR EQU 0x68 ; PMC_SR Offset PMC_MOSCEN EQU (1<<0) ; Main Oscillator Enable PMC_OSCBYPASS EQU (1<<1) ; Main Oscillator Bypass PMC_OSCOUNT EQU (0xFF<<8) ; Main OScillator Start-up Time PMC_DIV EQU (0xFF<<0) ; PLL Divider PMC_PLLCOUNT EQU (0x3F<<8) ; PLL Lock Counter PMC_OUT EQU (0x03<<14) ; PLL Clock Frequency Range PMC_MUL EQU (0x7FF<<16) ; PLL Multiplier PMC_USBDIV EQU (0x03<<28) ; USB Clock Divider PMC_CSS EQU (3<<0) ; Clock Source Selection PMC_PRES EQU (7<<2) ; Prescaler Selection PMC_MOSCS EQU (1<<0) ; Main Oscillator Stable PMC_LOCK EQU (1<<2) ; PLL Lock Status PMC_MCKRDY EQU (1<<3) ; Master Clock Status
;// <e> Power Mangement Controller (PMC) ;// <h> Main Oscillator ;// <o1.0> MOSCEN: Main Oscillator Enable ;// <o1.1> OSCBYPASS: Oscillator Bypass ;// <o1.8..15> OSCCOUNT: Main Oscillator Startup Time <0-255> ;// </h> ;// <h> Phase Locked Loop (PLL) ;// <o2.0..7> DIV: PLL Divider <0-255> ;// <o2.16..26> MUL: PLL Multiplier <0-2047> ;// <i> PLL Output is multiplied by MUL+1 ;// <o2.14..15> OUT: PLL Clock Frequency Range ;// <0=> 80..160MHz <1=> Reserved ;// <2=> 150..220MHz <3=> Reserved ;// <o2.8..13> PLLCOUNT: PLL Lock Counter <0-63> ;// <o2.28..29> USBDIV: USB Clock Divider ;// <0=> None <1=> 2 <2=> 4 <3=> Reserved ;// </h> ;// <o3.0..1> CSS: Clock Source Selection ;// <0=> Slow Clock ;// <1=> Main Clock ;// <2=> Reserved ;// <3=> PLL Clock ;// <o3.2..4> PRES: Prescaler ;// <0=> None ;// <1=> Clock / 2 <2=> Clock / 4 ;// <3=> Clock / 8 <4=> Clock / 16 ;// <5=> Clock / 32 <6=> Clock / 64 ;// <7=> Reserved ;// </e> PMC_SETUP EQU 1 PMC_MOR_Val EQU 0x00000602 PMC_PLLR_Val EQU 0x10053C01 PMC_MCKR_Val EQU 0x00000001
PRESERVE8
; Area Definition and Entry Point ; Startup Code must be linked first at Address at which it expects to run.
AREA RESET, CODE, READONLY ARM
; Exception Vectors ; Mapped to Address 0. ; Absolute addressing mode must be used. ; Dummy Handlers are implemented as infinite loops which can be modified.
Vectors LDR PC,Reset_Addr LDR PC,Undef_Addr LDR PC,SWI_Addr LDR PC,PAbt_Addr LDR PC,DAbt_Addr NOP ; Reserved Vector ; LDR PC,IRQ_Addr LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR ; LDR PC,FIQ_Addr LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR
Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler DCD 0 ; Reserved Address IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler SWI_Handler B SWI_Handler PAbt_Handler B PAbt_Handler DAbt_Handler B DAbt_Handler IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler
; Reset Handler
EXPORT Reset_Handler Reset_Handler
; Setup RSTC IF RSTC_SETUP != 0 LDR R0, =RSTC_BASE LDR R1, =RSTC_MR_Val STR R1, [R0, #RSTC_MR] ENDIF
; Setup EFC0 IF EFC0_SETUP != 0 LDR R0, =EFC_BASE LDR R1, =EFC0_FMR_Val STR R1, [R0, #EFC0_FMR] ENDIF
; Setup EFC1 IF EFC1_SETUP != 0 LDR R0, =EFC_BASE LDR R1, =EFC1_FMR_Val STR R1, [R0, #EFC1_FMR] ENDIF
; Setup WDT IF WDT_SETUP != 0 LDR R0, =WDT_BASE LDR R1, =WDT_MR_Val STR R1, [R0, #WDT_MR] ENDIF
; Setup PMC IF PMC_SETUP != 0 LDR R0, =PMC_BASE
; Setup Main Oscillator LDR R1, =PMC_MOR_Val STR R1, [R0, #PMC_MOR]
; Wait until Main Oscillator is stablilized IF (PMC_MOR_Val:AND:PMC_MOSCEN) != 0 MOSCS_Loop LDR R2, [R0, #PMC_SR] ANDS R2, R2, #PMC_MOSCS BEQ MOSCS_Loop ENDIF
; Setup the PLL IF (PMC_PLLR_Val:AND:PMC_MUL) != 0 LDR R1, =PMC_PLLR_Val STR R1, [R0, #PMC_PLLR]
; Wait until PLL is stabilized PLL_Loop LDR R2, [R0, #PMC_SR] ANDS R2, R2, #PMC_LOCK BEQ PLL_Loop ENDIF
; Select Clock IF (PMC_MCKR_Val:AND:PMC_CSS) == 1 ; Main Clock Selected LDR R1, =PMC_MCKR_Val AND R1, #PMC_CSS STR R1, [R0, #PMC_MCKR] WAIT_Rdy1 LDR R2, [R0, #PMC_SR] ANDS R2, R2, #PMC_MCKRDY BEQ WAIT_Rdy1 LDR R1, =PMC_MCKR_Val STR R1, [R0, #PMC_MCKR] WAIT_Rdy2 LDR R2, [R0, #PMC_SR] ANDS R2, R2, #PMC_MCKRDY BEQ WAIT_Rdy2 ELIF (PMC_MCKR_Val:AND:PMC_CSS) == 3 ; PLL Clock Selected LDR R1, =PMC_MCKR_Val AND R1, #PMC_PRES STR R1, [R0, #PMC_MCKR] WAIT_Rdy1 LDR R2, [R0, #PMC_SR] ANDS R2, R2, #PMC_MCKRDY BEQ WAIT_Rdy1 LDR R1, =PMC_MCKR_Val STR R1, [R0, #PMC_MCKR] WAIT_Rdy2 LDR R2, [R0, #PMC_SR] ANDS R2, R2, #PMC_MCKRDY BEQ WAIT_Rdy2 ENDIF ; Select Clock ENDIF ; PMC_SETUP
; Copy Exception Vectors to Internal RAM
IF :DEF:RAM_INTVEC ADR R8, Vectors ; Source LDR R9, =RAM_BASE ; Destination LDMIA R8!, {R0-R7} ; Load Vectors STMIA R9!, {R0-R7} ; Store Vectors LDMIA R8!, {R0-R7} ; Load Handler Addresses STMIA R9!, {R0-R7} ; Store Handler Addresses ENDIF
; Remap on-chip RAM to address 0
MC_BASE EQU 0xFFFFFF00 ; MC Base Address MC_RCR EQU 0x00 ; MC_RCR Offset
IF :DEF:REMAP LDR R0, =MC_BASE MOV R1, #1 STR R1, [R0, #MC_RCR] ; Remap ENDIF
; Setup Stack for each mode
LDR R0, =Stack_Top
; Enter Undefined Instruction Mode and set its Stack Pointer MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #UND_Stack_Size
; Enter Abort Mode and set its Stack Pointer MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #ABT_Stack_Size
; Enter FIQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #FIQ_Stack_Size
; Enter IRQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #IRQ_Stack_Size
; Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size
; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR IF :DEF:__MICROLIB
EXPORT __initial_sp
ELSE
MOV SP, R0 SUB SL, SP, #USR_Stack_Size
ENDIF
; Enter the C code
IMPORT __main LDR R0, =__main BX R0
IF :DEF:__MICROLIB
EXPORT __heap_base EXPORT __heap_limit
ELSE ; User Initial Stack & Heap AREA |.text|, CODE, READONLY
IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap
LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + USR_Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ENDIF
END
это стартап с установкой частоты CODE /* Enables the 48MHz USB Clock UDPCK and System Peripheral USB Clock */ AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK |AT91C_PMC_UDP; AT91C_BASE_AIC->AIC_IDCR=AT91C_ALL_INT; //zapr int AT91C_BASE_AIC->AIC_ICCR=AT91C_ALL_INT; //sbros int AT91C_BASE_AIC->AIC_EOICR=0xF1F1F1F1;
/* Global USB Interrupt: Mode and Vector with Highest Priority and Enable */ AT91C_BASE_AIC->AIC_SMR[AT91C_ID_UDP] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL |0; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned long) USB_ISR; AT91C_BASE_AIC->AIC_IDCR=AT91C_ALL_INT; //zapr int AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_UDP);
AT91C_BASE_UDP->UDP_GLBSTATE=0; AT91C_BASE_UDP->UDP_ICR=AT91C_UDP_CLEAR_INT; AT91C_BASE_UDP->UDP_RSTEP=AT91C_UDP_ALL_EP; AT91C_BASE_UDP->UDP_IDR = AT91C_UDP_ALL_INT | AT91C_UDP_ALL_EP; AT91C_BASE_UDP->UDP_IER = AT91C_UDP_ALL_INT | AT91C_UDP_EPINT0; AT91C_BASE_UDP->UDP_CSR[0] = (AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS); AT91C_BASE_AIC->AIC_IECR = 0x0000FFFF;
это начальная инициализация UDP CODE void USB_ISR (void) __irq { DWORD isr, csr, bkm, n; while (isr = pUDP->UDP_ISR) {
; /* End of Bus Reset Interrupt */ if (isr & AT91C_UDP_ENDBUSRES) { AT91C_BASE_UDP -> UDP_IDR = AT91C_UDP_ALL_INT | AT91C_UDP_ALL_EP; //Запрещаем все прерывания AT91C_BASE_UDP -> UDP_IER = AT91C_UDP_ALL_INT | AT91C_UDP_EPINT0; //Разрешить прерывание от 0 while ((pUDP->UDP_CSR[0]&(AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL))!=(AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL)) { AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL; } AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES; }
/* USB Suspend Interrupt */ if (isr & AT91C_UDP_RXSUSP) { USB_Suspend(); #if USB_SUSPEND_EVENT USB_Suspend_Event(); #endif pUDP->UDP_ICR = AT91C_UDP_RXSUSP; }
/* USB Resume Interrupt */ if (isr & AT91C_UDP_RXRSM) { USB_Resume(); #if USB_RESUME_EVENT USB_Resume_Event(); #endif pUDP->UDP_ICR = AT91C_UDP_RXRSM; }
/* External Resume Interrupt */ if (isr & AT91C_UDP_EXTRSM) { USB_WakeUp(); #if USB_WAKEUP_EVENT USB_WakeUp_Event(); #endif pUDP->UDP_ICR = AT91C_UDP_EXTRSM; }
/* Start of Frame Interrupt */ if (isr & AT91C_UDP_SOFINT) { #if USB_SOF_EVENT USB_SOF_Event(); #endif pUDP->UDP_ICR = AT91C_UDP_SOFINT; }
/* Endpoint Interrupts */ for (n = 0; n < USB_EP_NUM; n++) { if (isr & (1 << n)) { //ВОТ СЮДА ПРОГРАММА НИКОГДА НЕ ПОПАДАЕТ!!!!!(((((
csr = pUDP->UDP_CSR[n];
/* Setup Packet Received Interrupt */ if (csr & AT91C_UDP_RXSETUP) { if (USB_P_EP[n]) { USB_P_EP[n](USB_EVT_SETUP); } /* Setup Flag is already cleared in USB_DirCtrlEP */ /* pUDP->UDP_CSR[n] &= ~AT91C_UDP_RXSETUP; */ }
/* Data Packet Received Interrupt */ bkm = RX_DATA_BK[RxDataBank[n]]; if (csr & bkm) { if (USB_P_EP[n]) { USB_P_EP[n](USB_EVT_OUT); } pUDP->UDP_CSR[n] &= ~bkm; if (DualBankEP & (1 << n)) { RxDataBank[n] ^= 1; } }
/* Data Packet Sent Interrupt */ if (csr & AT91C_UDP_TXCOMP) { // pUDP->UDP_CSR[n] &= ~AT91C_UDP_TXCOMP; if (TxDataBank[n]) { pUDP->UDP_CSR[n] |= AT91C_UDP_TXPKTRDY; TxDataBank[n] = 0; } if (USB_P_EP[n]) { USB_P_EP[n](USB_EVT_IN); } pUDP->UDP_CSR[n] &= ~AT91C_UDP_TXCOMP; }
/* STALL Packet Sent Interrupt */ if (csr & AT91C_UDP_STALLSENT) { if ((csr & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) { if (USB_P_EP[n]) { USB_P_EP[n](USB_EVT_IN_STALL); /* USB_P_EP[n](USB_EVT_OUT_STALL); */ } } pUDP->UDP_CSR[n] &= ~AT91C_UDP_STALLSENT; }
} }
}
*AT91C_AIC_EOICR = 0xF1F1F1F1; /* End of Interrupt */ } это обработчик прерывания собсна. я понимаю, что у многих результат труда это комерческая тайна, но если есть возможность выложите всёже кусок схемы сопряжения с USB разъёмом и PLL фильтр.
|
|
|
|
|
Mar 4 2011, 08:26
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата я понимаю, что у многих результат труда это комерческая тайна, но если есть возможность выложите всёже кусок схемы сопряжения с USB разъёмом и PLL фильтр. А че тут таить то?  Кит AT91SAM7A3-EK Вот его схемка со всеми кусками)
doc6165.pdf ( 450.22 килобайт )
Кол-во скачиваний: 331Кстати одна маленькая деталь. Кварц я заменил с 18.432 МГц, на 8 МГц. Соответственно коэффициенты изменились (чтобы эта же цепочка PLL была работоспособна) DIV = 4, MUL = 47 (коэф. расчитывается как MUL + 1). Это все делалось чтобы вписаться в требования для PLL модуля. А то на родном 18.432 МГц получался коэф деления DIV = 24, по требованиям то нужно чтобы входная частота для PLL была больше 1 МГц. Можно поставить и на 16 МГц и подобрать свои коэф. и свою цепочку PLL по PLL калькулятору.
ATMEL_PLL_LFT_Filter_CALCULATOR_AT91.zip ( 818.05 килобайт )
Кол-во скачиваний: 81
|
|
|
|
|
Mar 15 2011, 11:51
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
перепроверил схему, сверил с предлагаемой Atmel`ем - всё как у них. только я не отслеживаю VBUS, а просто завожу через 10кОм на землю. питание у мя от внешнего источника.
всё попрежнему не работает: только сбросы да resume приходит и всё.
ещё заметил, что после начальной инициализации что-то вызывает прерывание UDP, хотя USB кабель вообще не подключён. почему такое происходит? или это закономерный результат(код я запостил выше)
|
|
|
|
|
Mar 20 2011, 13:23
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
вот кусок схемы относительно интерфейса USB
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 21 2011, 18:24
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
извиняюсь, забыл дорисовать. РЦ-цепочка у 5В - это у 1-ой ножки USB имеется в виду? Если да, то я пытался сделать так как на EK-плате: конденсатор на землю, так же там VSUB идёт на микроконтроллер (чтобы отловить момент подключения) и притянута к GND через резистор. у меня 1-ая ножка USB вообще не используется, но резистор я решил скопировать.
Сообщение отредактировал kichnamid - Mar 21 2011, 18:24
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 22 2011, 17:32
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
земля на моей плате общая для всего. под USB понимается разъём USB(тип В у меня)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|