zhilik 0 7 января, 2008 Опубликовано 7 января, 2008 · Жалоба Пытаюсь считать данные с AD7265, который подсоединён к SPORT1 BF537. Программа всё время заходит в обработчик прерывания. Ощущение, что надо где-то сбросить флаг прерывания, но я не понимаю где... Вот код обработчика прерывания и инициализации (VisualDP ++ 4.5): EX_INTERRUPT_HANDLER(SPORT1_RX_HANDLER) { *pDMA5_IRQ_STATUS = 1; // write one to clear //вроде как строчка выше должна сбросить флаг прерывания... while(SPORT1_STAT & RXNE) { u16 adc_data = *pSPORT1_RX; //пишу данные куда надо } ssync(); } void init_AD7265() { //инициализирую ноги для выбора канала АЦП и т.д. *pSPORT1_RCR1 = RCKFE | LRFS | RFSR | IRFS | IRCLK; *pSPORT1_RCR2 = RXSE | 15; *pSPORT1_RCLKDIV = 59; *pSPORT1_RFSDIV = 24; ssync(); *pSPORT1_RCR1 |= RSPEN; ssync(); } void init_interrupts() { *pSIC_IAR0 = 0x0FFFFFFF; //SPORT1 RX IRQ 0=IVG7 *pSIC_IAR1 = 0xFFFFFFFF; *pSIC_IAR2 = 0xFFFFFFFF; *pSIC_IAR3 = 0xFFFFFFFF; /* Register Interrupt Handlers and Enable Core Interrupts */ register_handler(ik_ivg7, SPORT1_RX_HANDLER); /* Enable SIC Level Interrupts */ *pSIC_IMASK = IRQ_DMA5; //DMA5 - SPORT1_RX } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhilik 0 8 января, 2008 Опубликовано 8 января, 2008 · Жалоба Всё ещё более странно, программа не заходит внутрь while'а в обработчике прерывания (в while(SPORT1_STAT & RXNE)), т.е. как будто источник прерывания другой и соответстенно сбрасываю не тот флаг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 8 января, 2008 Опубликовано 8 января, 2008 · Жалоба *pSIC_IAR0 = 0x0FFFFFFF; //SPORT1 RX IRQ 0=IVG7 *pSIC_IAR1 = 0xFFFFFFFF; *pSIC_IAR2 = 0xFFFFFFFF; *pSIC_IAR3 = 0xFFFFFFFF; Вы уверены что поставили ноль куда надо, не знаю точно как в 537 но у 533 этот ноль соответствует прерыванию RTC. Думаю регистры этих процессоров одинаковые. Значения этих регистров никогда не менял всегда оставлял по-умолчанию. Тем более вы не меняете приоритет, а оставляетет его как он был. Вы хотите работать с DMA? Если да то не вижу настройку DMA. И тут опять возможно расхождения с 533 но DMA5 соответствует SPI а не SPORT. Вот это while(SPORT1_STAT & RXNE) { u16 adc_data = *pSPORT1_RX; //пишу данные куда надо } надо заменить на while(!(*pSPORT1_STAT & RXNE)); tmp = *pSPORT1_RX16; Что у вас *pSPORT1_RX это указатель на short или int? Судя по всему у вас 16 разрядные слова, по-этому это должен быть указатель на short. Для 533 он определен как *pSPORT1_RX16. Чтение этого регистра уже сбрасывает флаг прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhilik 0 8 января, 2008 Опубликовано 8 января, 2008 · Жалоба Спасибо за ответ. 0 стоит там где надо. А вот ошибка оказалось совершенно дурацкой. надо не while(SPORT1_STAT & RXNE) а while(*pSPORT1_STAT & RXNE) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться