|
Не могу запустить канал 2 DMA1, SPIrx -> mem (Stm32 HD) |
|
|
|
Aug 12 2011, 11:21
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Aug 12 2011, 13:21
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Цитата(AHTOXA @ Aug 12 2011, 16:43)  Чтобы что-то принять из SPI, надо что-то туда записать  Соответственно, берите второй канал DMA (который SPI TX), и заряжайте его на передачу count dummy байтов. Тогда всё заработает. БОЛЬШОЕ СПАСИБО)) да, действительно так работает, НО у меня канал 3 (который на передачу) занят TM3_CH4... переносить на другой порт и иначе никак?
|
|
|
|
|
Aug 12 2011, 15:02
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 13 2011, 04:44
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Цитата(AHTOXA @ Aug 12 2011, 19:21)  TIM8, в отличие от TIM3, - это продвинутый таймер, рассчитанный на работу с моторами. Поэтому у него есть хитрый бит для включения/отключения всех выходов одновременно. И по умолчанию все выходы отключены. Бит называется TIM_BDTR_MOE. Да, и еще CCxNE бит в регистре CCER надо выставить. Заработало вроде. Тут столкнулся с другой проблемой: шим на DMA работает не корректно, походже данные из буфера дважды за период грузятся в ШИМ (в итоге имею удвоенную частоту моего сигнала), смотрю в описание RM0008 - как же не четко все описано ...
|
|
|
|
|
Aug 15 2011, 09:04
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Цитата(kan35 @ Aug 13 2011, 08:44)  Да, и еще CCxNE бит в регистре CCER надо выставить. Заработало вроде.
Тут столкнулся с другой проблемой: шим на DMA работает не корректно, походже данные из буфера дважды за период грузятся в ШИМ (в итоге имею удвоенную частоту моего сигнала), смотрю в описание RM0008 - как же не четко все описано ... Не учел (точнее неправильно понял пояснения на картинке Clock Tree, а текст почитать было лень), что таймеры тактируются удвоенной частотой если делитель (APB != 1). AHTOXA, спасибо за консультации.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|