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

 
 
 
Reply to this topicStart new topic
> STM32 SPI через DMA не хочет работать, STM32 SPI DMA
Brain13
сообщение Jun 28 2011, 12:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Здравствуйте.
Пишу прогу которая должна работать с внешним АЦП по SPI. Ему нужно дать 64 клока, MOSI использую для генерации импульса старта. То есть я отправляю по SPI 4 16битных слова, первый - 0xffff, остальные 0x0000. Чем городить 4 прерывания по SPI для передачи лучше сделать передачу и прием буферов через DMA. На основе примера SPI_RAM сделал свой код:
CODE

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_BASE;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_SPI_DMA_RX_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ADC_SPI_DMA_Buffer_size;
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_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);

DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_BASE;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_SPI_DMA_TX_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);

/* Enable SPI_MASTER DMA Tx request */
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
/* Enable SPI_MASTER DMA Rx request */
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);


DMA_Cmd(DMA1_Channel2, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE);

while(!DMA_GetFlagStatus(DMA1_FLAG_TC2));
while(!DMA_GetFlagStatus(DMA1_FLAG_TC3));

DMA_Cmd(DMA1_Channel2, DISABLE);
DMA_Cmd(DMA1_Channel3, DISABLE);

return;


До return программа доходит, биты в регистрахстатуса DMA висит 0x770. То есть DMA считает что он передал и прянял в/из SPI. Но ноги SPI не дрыгаются, хотя если передать что то программно все работает.
Подскажите в чем проблема.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 28 2011, 14:03
Сообщение #2


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

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



Цитата(Brain13 @ Jun 28 2011, 18:25) *
Код
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_BASE;

Адрес надо указывать не SPI1_BASE, а &SPI1->DR.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Brain13
сообщение Jun 29 2011, 04:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(AHTOXA @ Jun 28 2011, 18:03) *
Адрес надо указывать не SPI1_BASE, а &SPI1->DR.

Спасибо, заработало.
Go to the top of the page
 
+Quote Post

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

 


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


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