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

 
 
> Не могу запустить канал 2 DMA1, SPIrx -> mem (Stm32 HD)
kan35
сообщение Aug 12 2011, 11:21
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



В 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 не уменьшается)

Сообщение отредактировал kan35 - Aug 12 2011, 12:27
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
AHTOXA
сообщение Aug 12 2011, 12:43
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Чтобы что-то принять из SPI, надо что-то туда записатьsm.gif
Соответственно, берите второй канал DMA (который SPI TX), и заряжайте его на передачу count dummy байтов. Тогда всё заработает.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kan35
сообщение Aug 12 2011, 13:21
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



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

БОЛЬШОЕ СПАСИБО))
да, действительно так работает, НО у меня канал 3 (который на передачу) занят TM3_CH4... переносить на другой порт и иначе никак?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 12 2011, 14:15
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, придётся переносить. В этом смысле у STM32 гибкости маловато.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kan35
сообщение Aug 12 2011, 15:02
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(AHTOXA @ Aug 12 2011, 18:15) *
Да, придётся переносить. В этом смысле у STM32 гибкости маловато.

На порту PB1 есть еще выход 8 таймера:
ADC12_IN9/TIM3_CH4
TIM8_CH3N
Я тупо заменил все установки с TIM3 на TIM8 и выход с 4 на 3 соответственно, прерывания все заменил, но выхода не вижу, хотя DMA2 работает с TIM8 и данные в CCR регистре меняются, может что то еще я не делаю, чтобы вторая альтернативная функция включалась? они же должны по закону ИЛИ там работать?

Сообщение отредактировал kan35 - Aug 12 2011, 15:03
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 12 2011, 15:21
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



TIM8, в отличие от TIM3, - это продвинутый таймер, рассчитанный на работу с моторами. Поэтому у него есть хитрый бит для включения/отключения всех выходов одновременно. И по умолчанию все выходы отключены.
Бит называется TIM_BDTR_MOE.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kan35
сообщение Aug 13 2011, 04:44
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(AHTOXA @ Aug 12 2011, 19:21) *
TIM8, в отличие от TIM3, - это продвинутый таймер, рассчитанный на работу с моторами. Поэтому у него есть хитрый бит для включения/отключения всех выходов одновременно. И по умолчанию все выходы отключены.
Бит называется TIM_BDTR_MOE.

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

Тут столкнулся с другой проблемой: шим на DMA работает не корректно, походже данные из буфера дважды за период грузятся в ШИМ (в итоге имею удвоенную частоту моего сигнала), смотрю в описание RM0008 - как же не четко все описано ...
Go to the top of the page
 
+Quote Post
kan35
сообщение Aug 15 2011, 09:04
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(kan35 @ Aug 13 2011, 08:44) *
Да, и еще CCxNE бит в регистре CCER надо выставить. Заработало вроде.

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


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

AHTOXA, спасибо за консультации.
Go to the top of the page
 
+Quote Post
kan35
сообщение Oct 26 2012, 14:52
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



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

PS: Если бы мне не понадобился канал 3 DMA1 для других задач (а именно USART3_RX), то может быть и не было бы этого сообщения.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 26 2012, 18:57
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Спасибо за информацию, записал в блокнотикsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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