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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Пауза между байтами в SPI DMA, STM32F4xx
adnega
сообщение Sep 20 2013, 10:12
Сообщение #46


Гуру
******

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



Цитата(Golikov A. @ Sep 20 2013, 13:46) *
А ДМА как я понимаю послав один байт перенастраивается на следующий, и таким образом происходит посылка группы байт через ДМА, но критерий посылки следующего байта не готовность буфера, а таймер.

Именно!
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 20 2013, 11:29
Сообщение #47


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Golikov A. @ Sep 20 2013, 13:46) *

Да, Вы правы, в таком варианте будет работать. Придется конечно поизвращаться со стартом транзакции, но это не сложно.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 13:48
Сообщение #48


Гуру
******

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



Ну собственно работа SPI с TIM и DMA.
Обращаю внимание на последнюю картинку. Желтый фронт - событие таймера (считай запуск DMA), но сама посылка начинается значительно позже. И время не стабильно. Поэтому зазор tNXT плавает приблизительно от 170нс до 290нс. И я об этом с самого начала предупреждал. Так сойдет?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

 
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 14:11
Сообщение #49


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



плавая пауза между байтами думаю не проблема, главное что бы минимальная пауза была регулируемая в понятных приделах
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 20 2013, 14:43
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну это понятно ДМА то надо дождаться свободной шины, но гарантированный минимум спокойно получится... это в разы лучше чем полингом тупить...
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 15:17
Сообщение #51


Гуру
******

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



Цитата(Rash @ Sep 20 2013, 18:11) *
плавая пауза между байтами думаю не проблема, главное что бы минимальная пауза была регулируемая в понятных приделах

Тогда вот:
CODE

//-----------------------------------------------------------------------------
// void __inline init_SPI2(void)
//-----------------------------------------------------------------------------
void __inline init_SPI2(void)
{
SPI2->CR1 =
(0 << SPI_CR1_SPE)
| (0 << SPI_CR1_DFF)
| (1 << SPI_CR1_SSM)
| (1 << SPI_CR1_SSI)
| (1 << SPI_CR1_MSTR)
| (2 << SPI_CR1_BR);

SPI2->CR2 =
(0 << SPI_CR2_RXNEIE)
| (0 << SPI_CR2_TXDMAEN)
| (1 << SPI_CR2_SSOE);

SPI2->CR1 =
(1 << SPI_CR1_SPE)
| (0 << SPI_CR1_DFF)
| (1 << SPI_CR1_SSM)
| (1 << SPI_CR1_SSI)
| (1 << SPI_CR1_MSTR)
| (2 << SPI_CR1_BR);
}

//-----------------------------------------------------------------------------
// void __inline init_TIMER3(void)
//-----------------------------------------------------------------------------
void __inline init_TIMER3(void)
{
TIM3->PSC = 0;
TIM3->CR1 = 0;
TIM3->ARR = 147 - 1; // ПЕРИОД СЛЕДОВАНИЯ ТУТ
TIM3->CCR1 = 10; // для отладки "желтый фронт"
TIM3->CCR4 = 1;
TIM3->CCMR1 = (OC_MODE_PWM1 << TIM_CCMR1_OC1M);
TIM3->CCER = (1 << TIM_CCER_CC1E) | (1 << TIM_CCER_CC4E);
TIM3->SMCR = 0;
TIM3->DIER =
(0 << TIM_DIER_CC1IE)
| (0 << TIM_DIER_CC4DE)
| (0 << TIM_DIER_UIE);
}

Еще нужно разрешить прерывание для DMA1_Stream3.

void DMA1_Stream3_IRQHandler(void) __attribute__((interrupt("IRQ")));
void DMA1_Stream3_IRQHandler(void)
{
if(DMA1->LISR & (1 << 27))
{
TIM3->CR1 = 0;
GPIOB->BSRRL = (1 << 12); // NSS=1
DMA1->LIFCR = (1 << 27);
}
}

Запускаем так:

TIM3->CR1 = 0;
TIM3->CNT = 0;

TIM3->DIER =
(0 << TIM_DIER_CC1IE)
| (0 << TIM_DIER_CC4DE)
| (0 << TIM_DIER_UIE);

SPI2->CR2 =
(0 << SPI_CR2_RXNEIE)
| (0 << SPI_CR2_TXDMAEN)
| (0 << SPI_CR2_RXDMAEN)
| (1 << SPI_CR2_SSOE);

DMA1->LIFCR = 0x0F7D0000;

DMA1_Stream2->CR =
(2 << DMA_SCR_PL)
| (5 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (1 << DMA_SCR_DIR)
| (0 << DMA_SCR_EN);
DMA1_Stream2->PAR = (DWORD)&SPI2->DR;
DMA1_Stream2->M0AR = (DWORD)&spi_tx[0];
DMA1_Stream2->NDTR = SPI_DATA_SIZE;
DMA1_Stream2->CR =
(2 << DMA_SCR_PL)
| (5 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (1 << DMA_SCR_DIR)
| (1 << DMA_SCR_EN);

DMA1_Stream3->CR =
(3 << DMA_SCR_PL)
| (0 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (0 << DMA_SCR_DIR)
| (0 << DMA_SCR_EN)
| (1 << DMA_SCR_TCIE);
DMA1_Stream3->PAR = (DWORD)&SPI2->DR;
DMA1_Stream3->M0AR = (DWORD)&spi_rx[0];
DMA1_Stream3->NDTR = SPI_DATA_SIZE;
DMA1_Stream3->CR =
(3 << DMA_SCR_PL)
| (0 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (0 << DMA_SCR_DIR)
| (1 << DMA_SCR_EN)
| (1 << DMA_SCR_TCIE);

GPIOB->BSRRH = (1 << 12);

SPI2->CR2 =
(0 << SPI_CR2_RXNEIE)
| (0 << SPI_CR2_TXDMAEN)
| (1 << SPI_CR2_RXDMAEN)
| (1 << SPI_CR2_SSOE);

TIM3->DIER =
(0 << TIM_DIER_CC1IE)
| (1 << TIM_DIER_CC4DE)
| (0 << TIM_DIER_UIE);

TIM3->CR1 = (1 << TIM_CR1_CEN);
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 23 2013, 06:37
Сообщение #52


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



adnega, спасибо буду пробовать
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:31
Рейтинг@Mail.ru


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