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

 
 
> STM32F4. Конфликт ADC c LwIP, Ошибка FEIF0
proga
сообщение Dec 30 2012, 09:36
Сообщение #1


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

Группа: Участник
Сообщений: 86
Регистрация: 17-01-06
Из: иркутск
Пользователь №: 13 278



У меня возникла проблема следующего характера. В разрабатывамом мной проекте необходимо осуществлять передачу данных, оцифрованных в ADC, по Ethernet (UDP протокол). АЦП работает в режиме 500 кГц. Собственно код инициализации АЦП:
CODE

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit();
//CONFIGURE DMA FOR ADC
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)getbuf_ADC(0);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = BUFSIZE_ADC;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
/* DoubleBufferMode enable*/
DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)getbuf_ADC(1), (uint32_t)getbuf_ADC(0));
DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE);
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
//enable DMA interrupt
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
//CONFIGURE GPIO FOR ADC;
/*ADC Channel 10 -> PC0*/
GPIO_InitSt_C.GPIO_Pin = GPIO_Pin_0;
GPIO_InitSt_C.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitSt_C.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitSt_C);
/* ADC Common Init */
ADC_struct.ADC_Mode = ADC_Mode_Independent;
ADC_struct.ADC_Prescaler = ADC_Prescaler_Div8; //need ADC_Prescaler_Div8
ADC_struct.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
ADC_struct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles; //need ADC_TwoSamplingDelay_5Cycles
ADC_CommonInit(&ADC_struct);
/* ADC Channels Init */
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

Для управления сетью использую lwip_v1.3.2. Наблюдается следующая ситуация, изначально АЦП работает исправно, однако после того, как контроллер получает ARP пакет, содержащий MAC адрес собеседника, и начинает передавать ему данные, DMA АЦП тут же вылетает с ошибкой FIFO ERROR: FEIF0. Возникает ощущение, что DMA Ethernet отнимает доступ к шине у DMA ADC, в результате чего, тот не успевает вовремя забрать данные с приёмного буфера ADC. С другой стороны, скорость обновления небольшая, и у DMA ADC достаточно времени, чтобы забрать данные. Если, у кого-нибудь есть какие-либо соображения о причине неполадки, или же он уже встречался с такой проблемой, прошу высказаться. Спасибо.

Сообщение отредактировал IgorKossak - Dec 30 2012, 13:35
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
adnega
сообщение Dec 30 2012, 15:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(proga @ Dec 30 2012, 13:36) *
Для управления сетью использую lwip_v1.3.2. Наблюдается следующая ситуация, изначально АЦП работает исправно, однако после того, как контроллер получает ARP пакет, содержащий MAC адрес собеседника, и начинает передавать ему данные, DMA АЦП тут же вылетает с ошибкой FIFO ERROR: FEIF0. Возникает ощущение, что DMA Ethernet отнимает доступ к шине у DMA ADC, в результате чего, тот не успевает вовремя забрать данные с приёмного буфера ADC. С другой стороны, скорость обновления небольшая, и у DMA ADC достаточно времени, чтобы забрать данные. Если, у кого-нибудь есть какие-либо соображения о причине неполадки, или же он уже встречался с такой проблемой, прошу высказаться. Спасибо.

Использую SPI и DMA для аппаратной динамической индикации. При работе Ethernet наблюдаю моргания. "Возникает ощущение..."
В ближайшее время планирую разобраться.
PS. стек самописный. Общение по UDP с аппаратным рассчетом сумм заголовков.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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