Доброго Всем дня! Помогите пожалуйста найти ошибку. Имеется стек Wiznet +LPC2214 . Стек INT -выводом висит на EINT0 ( P0.16 ) LPC. Пытаюсь реализовать fiq-прерывание . Для этого имеется следующая C-функция в main:
__fiq __arm void fiq_handler (void) { uint8 int_val; IINCHIP_ISR_DISABLE(); int_val = IINCHIP_READ(INT_REG); // зачитываю int-регистр стека
if (int_val & INT_IPCONFLICT) { printf("IP conflict : %.2x\r\n", int_val); } IINCHIP_ISR_ENABLE(); //iinchip_irq(); EXTINT = 0x1; }
В файле startup следующее ( среда IAR 4.40 ):
__program_start ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte ; b ?cstartup ; Relative branch allows remap, limited to 32 MByte ; Vectors can be enabled by removing the comments below or by ; using #pragma vector from C code. org 0x04 ; ldr pc,[pc,#24] ; Branch to undef_handler org 0x08 ; ldr pc,[pc,#24] ; Branch to swi_handler org 0x0c ; ldr pc,[pc,#24] ; Branch to prefetch_handler org 0x10 ; ldr pc,[pc,#24] ; Branch to data_handler org 0x18 ; ldr pc,[pc,#24] ; Branch to irq_handler org 0x1c ldr pc, FIQ_Addr // закидываю в pc адрес обработчика
; Constant table entries (for ldr pc) will be placed at 0x20 ; Exception vectors can be specified in C code by #pragma vector or by filling ; in the vectors below. The vector address is the ARM vector number + 0x20. org 0x20 dc32 ?cstartup org 0x24 ; dc32 undef_handler org 0x28 ; dc32 swi_handler org 0x2c ; dc32 prefetch_handler org 0x30 ; dc32 data_handler org 0x38 ; dc32 irq_handler
org 0x3c FIQ_Addr: dc32 fiq_handler // получаю адрес обработчика
; LTORG ENDMOD __program_start ; ENDMOD
Линия P0.16 настроена как вход, через PINSEL1 для этой ноги выбрана функция EINT0. Настройки контроллера прерываний следующие : PINSEL1 = 0x01; VICIntSelect = 0x4000; // выбираем fiq для EINT0 VICIntEnable = 0x4000; // разрешаем прерывание
В регистре IMR (Interrupt Mask Register) стека Wiznet записано значение 0x80 ( т.е разрешено прерывание только в случае IP-Conflict ). Хотя тут есть неястность - в даташите на стек написано, что если прерывание нужно разрешить - то в соответствующий бит писать 1. В Wizne-товском драйвере же написано следующее:
void setINTMask(uint8 mask) { IINCHIP_WRITE(INTMASK,mask); // must be setted 0x10. }
Или же это указано для запрещения прерываний? Но опять же в даташите указано, что бит 4 этого регистра должен быть выставлен в 0, а здесь он в 1.
При отладке как только доходит до соединения по одному из каналов ( стек в режиме клиента пытается законнектится к хосту), то винда начинает верещать о конфликте IP-адресов ( т.к в качестве IP стека указан IP хоста ), но код из обработчика не выполняется, а стек, согласно программе переходит в режим listen... Не могу понять , что он хочет... Помогите пожалуйста!!
Сообщение отредактировал Sarez - May 8 2007, 12:26
|