Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу запустить канал 2 DMA1
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
kan35
В PIO SPI1 работает отлично
кроме того, работают каналы DMA1_Ch1 и DMA1_Ch3 - нет проблем, а вот с SPI - ни в какую. Посмотрите незамыленным взглядом:
Код
....
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
....

#define SPI1_DR_Address    (SPI1_BASE+0x0C)
unsigned char DFSPI1_DMARecceiveBlock (unsigned char * buff, unsigned long count)
{
    DMA_InitTypeDef dma_spi1_rx = {
        (uint32_t)SPI1_DR_Address,
        (uint32_t)buff,
        DMA_DIR_PeripheralSRC,
        count,
        DMA_PeripheralInc_Disable,
        DMA_MemoryInc_Enable,
        DMA_PeripheralDataSize_Byte,
        DMA_MemoryDataSize_Byte,
        DMA_Mode_Normal,
        DMA_Priority_VeryHigh, //DMA_Priority_Low,
        DMA_M2M_Disable
    };
    DMA_Init(DMA1_Channel2, &dma_spi1_rx);
    
    DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);            // Enable Interrupt on transmition compleet

    SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);        // Enable Rx DMA

    DMA_Cmd(DMA1_Channel2, ENABLE);                            // Start Rx DMA

    while(!DMA_GetFlagStatus(DMA1_FLAG_TC2));                // Wait while recceive compleet
    
    DMA_Cmd(DMA1_Channel2, DISABLE);
    return 1;
}

Передача по SPI даже не начинается (счетчик в DMA не уменьшается)
AHTOXA
Чтобы что-то принять из SPI, надо что-то туда записатьsm.gif
Соответственно, берите второй канал DMA (который SPI TX), и заряжайте его на передачу count dummy байтов. Тогда всё заработает.
kan35
Цитата(AHTOXA @ Aug 12 2011, 16:43) *
Чтобы что-то принять из SPI, надо что-то туда записатьsm.gif
Соответственно, берите второй канал DMA (который SPI TX), и заряжайте его на передачу count dummy байтов. Тогда всё заработает.

БОЛЬШОЕ СПАСИБО))
да, действительно так работает, НО у меня канал 3 (который на передачу) занят TM3_CH4... переносить на другой порт и иначе никак?
AHTOXA
Да, придётся переносить. В этом смысле у STM32 гибкости маловато.
kan35
Цитата(AHTOXA @ Aug 12 2011, 18:15) *
Да, придётся переносить. В этом смысле у STM32 гибкости маловато.

На порту PB1 есть еще выход 8 таймера:
ADC12_IN9/TIM3_CH4
TIM8_CH3N
Я тупо заменил все установки с TIM3 на TIM8 и выход с 4 на 3 соответственно, прерывания все заменил, но выхода не вижу, хотя DMA2 работает с TIM8 и данные в CCR регистре меняются, может что то еще я не делаю, чтобы вторая альтернативная функция включалась? они же должны по закону ИЛИ там работать?
AHTOXA
TIM8, в отличие от TIM3, - это продвинутый таймер, рассчитанный на работу с моторами. Поэтому у него есть хитрый бит для включения/отключения всех выходов одновременно. И по умолчанию все выходы отключены.
Бит называется TIM_BDTR_MOE.
kan35
Цитата(AHTOXA @ Aug 12 2011, 19:21) *
TIM8, в отличие от TIM3, - это продвинутый таймер, рассчитанный на работу с моторами. Поэтому у него есть хитрый бит для включения/отключения всех выходов одновременно. И по умолчанию все выходы отключены.
Бит называется TIM_BDTR_MOE.

Да, и еще CCxNE бит в регистре CCER надо выставить. Заработало вроде.

Тут столкнулся с другой проблемой: шим на DMA работает не корректно, походже данные из буфера дважды за период грузятся в ШИМ (в итоге имею удвоенную частоту моего сигнала), смотрю в описание RM0008 - как же не четко все описано ...
kan35
Цитата(kan35 @ Aug 13 2011, 08:44) *
Да, и еще CCxNE бит в регистре CCER надо выставить. Заработало вроде.

Тут столкнулся с другой проблемой: шим на DMA работает не корректно, походже данные из буфера дважды за период грузятся в ШИМ (в итоге имею удвоенную частоту моего сигнала), смотрю в описание RM0008 - как же не четко все описано ...


Не учел (точнее неправильно понял пояснения на картинке Clock Tree, а текст почитать было лень), что таймеры тактируются удвоенной частотой если делитель (APB != 1).

AHTOXA, спасибо за консультации.
kan35
2AHTOXA, и всем коллегам
прием по SPI одним каналом DMA все таки возможен, и не надо перегружать шину дополнительными пустыми операциями.
Есть режим RXONLY (выбирается в CFG1 регистре). После пуска - SPI молотит непрерывно тактовый сигнал, что позволяет работать и DMA. Есть нюанс, что передача не останавливается по завершении заполнения DMA - но например в моем случае - это не влияет. Просто отключаю RXONLY в прерывании DMA, и флэшка тоже нормально это переносит.

PS: Если бы мне не понадобился канал 3 DMA1 для других задач (а именно USART3_RX), то может быть и не было бы этого сообщения.
AHTOXA
Спасибо за информацию, записал в блокнотикsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.