реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> USB своими руками для sam7x256, или проблемы с которыми я столкнулся.
shrek
сообщение Feb 25 2011, 11:27
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата
"После сброса устройство надо заново проинициализировать " - это имеется в виду прерывание ENDBUS?

вообщем не помогло. всё так же нет прерывания конечной точки.
у меня конфигурация частоты вынесена в стартуп, может в основном теле программы повторить? глаза замылились, чувствую, что бьюсь о стенку. уже вторую плату сделали - тоже самое

Да оно самое ENDBUSRES. Попробуйте в другой порт USB воткнуть или вообще в другой комп))) У меня была такая проблема на работе HID устройство (джостик) работало на всех компах корректно и не зависало (В Battlefield 2 пробовали biggrin.gif ). Дома подключаю, дрова поставились, но где-то через несколько минут девайс зависал не знаю почему... Точнее не исследовал почему зависает).
В стартупе я написал вход в прерывание и выход из него и инициализировал стек. Далее 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 в контроллере прерываний?
Go to the top of the page
 
+Quote Post
kichnamid
сообщение Mar 1 2011, 11:44
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 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 просто выдать что-нибудь на линию? может оба контроллера бракованные, у нас вообще были проблемы с их покупкой
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2011, 15:07
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(kichnamid @ Mar 1 2011, 14:44) *
атмеловцы советуют перепроверять запись флагов в UDP_CSR и в цикле долбить флаги пока не изменятся. это иногда к зависанию приводит, еще метод есть?

Иногда - это когда между записью и проверкой вклинивается прерывание. Правильный способ: запретить прерывания - установить/сбросить биты - дождаться изменения - восстановить прерывания. И проверка эта нужна далеко не во всех случаях, смотрите внимательно описание регистра CSR.
Go to the top of the page
 
+Quote Post
shrek
сообщение Mar 1 2011, 16:25
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Mar 2 2011, 13:19
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 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
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
kichnamid
сообщение Mar 4 2011, 07:39
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 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 фильтр.
Go to the top of the page
 
+Quote Post
shrek
сообщение Mar 4 2011, 08:26
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата
я понимаю, что у многих результат труда это комерческая тайна, но если есть возможность выложите всёже кусок схемы сопряжения с USB разъёмом и PLL фильтр.


А че тут таить то? fman.gif
Кит 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
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 4 2011, 09:04
Сообщение #38


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Совет. Мы купили как-то отладочную плату, где во входных цепях USB стояли фильтрующие ферриты. Я над запуском USB протра...ся недели две, пока мы не закоротили эти долбаные ферриты. Резюме - проверьте номиналы RC на входе и внимательно посмотрите, так ли все у вас, как советует Atmel.
Go to the top of the page
 
+Quote Post
kichnamid
сообщение Mar 15 2011, 11:51
Сообщение #39


Участник
*

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



перепроверил схему, сверил с предлагаемой Atmel`ем - всё как у них. только я не отслеживаю VBUS, а просто завожу через 10кОм на землю. питание у мя от внешнего источника.

всё попрежнему не работает: только сбросы да resume приходит и всё.

ещё заметил, что после начальной инициализации что-то вызывает прерывание UDP, хотя USB кабель вообще не подключён. почему такое происходит? или это закономерный результат(код я запостил выше)
Go to the top of the page
 
+Quote Post
shrek
сообщение Mar 15 2011, 14:39
Сообщение #40


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Вашу схему в студию! sm.gif
Go to the top of the page
 
+Quote Post
kichnamid
сообщение Mar 20 2011, 13:23
Сообщение #41


Участник
*

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



вот кусок схемы относительно интерфейса USB
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2011, 14:44
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А где, простите, земля у USB? И зачем эта непонятная RC цепочка на 5V?
Go to the top of the page
 
+Quote Post
kichnamid
сообщение Mar 21 2011, 18:24
Сообщение #43


Участник
*

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



извиняюсь, забыл дорисовать.

РЦ-цепочка у 5В - это у 1-ой ножки USB имеется в виду? Если да, то я пытался сделать так как на EK-плате: конденсатор на землю, так же там VSUB идёт на микроконтроллер (чтобы отловить момент подключения) и притянута к GND через резистор. у меня 1-ая ножка USB вообще не используется, но резистор я решил скопировать.

Сообщение отредактировал kichnamid - Mar 21 2011, 18:24
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
shrek
сообщение Mar 22 2011, 14:47
Сообщение #44


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Под "USB" что в схеме понимается? Земля полюбому должна быть у USB и контроллера связана!
Go to the top of the page
 
+Quote Post
kichnamid
сообщение Mar 22 2011, 17:32
Сообщение #45


Участник
*

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



земля на моей плате общая для всего. под USB понимается разъём USB(тип В у меня)
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01589 секунд с 7
ELECTRONIX ©2004-2016