Jump to content

    

SPI, DMA, как убрать прерывание транзакции?

Пишу функции для работы с памятью A25L032 на stm32f405 , с активным использование DMA.  
В функциях чтения/запись массива данных, разбил на 2 части  
Первая часть это отправка команды + адреса  
Вторая часть это отправка самих данных.
 
Можно ли это как-то красиво сделать без разделения на 2 части? А сразу становить транзакцию на прием/передачу 

//==================================================================================================
/*
	* @Описание:	Описание функции.
	* @Параметр:	
	* @Возврат:		Нету
*/
void A25L0xx_ReadBytes(uint8_t* pBuffer, uint32_t ReadAddr, uint32_t NumByteToRead){
    xSemaphoreTakeRecursive(MutexA25L0xx,portMAX_DELAY);
    SPI_CS_OFF();
    //-------------------------------------------------------------------------------
    TempTransmitBuff[0]=0x03;
    TempTransmitBuff[1]=((ReadAddr & 0xFF0000) >> 16);
    TempTransmitBuff[2]=((ReadAddr & 0xFF00) >> 8);
    TempTransmitBuff[3]=(ReadAddr & 0xFF);
    //-------------------------------------------------------------------------------
    Send_Spi_dma(TempReceiveBuff,TempTransmitBuff,4,TYPE_TRANSMIT,USE_MINC); 
    //-------------------------------------------------------------------------------
    Send_Spi_dma(pBuffer,&DUMMY,NumByteToRead,TYPE_RECEIVE,TRANSMIT_NOT_MINC); // Без инкримента данных на передачу 
    //-------------------------------------------------------------------------------
    SPI_CS_ON();
    xSemaphoreGiveRecursive(MutexA25L0xx);
}

 

 

 

Edited by pokk

Share this post


Link to post
Share on other sites
2 hours ago, pokk said:

Можно ли это как-то красиво сделать без разделения на 2 части?

Не знаком с DMA у STM32F405, но если он поддерживает работу со связными списками, то да можно. При этом данные могут быть раскиданы по n-буферам (n количество). Следовательно, каждый элемент связного списка будет указывать на адрес следующего элемента. А элемент - это структура с данными, где одно поле - указатель на те данные, которые нужно передать.

Если связные списки не поддерживает, то нужно завести буфер, который вмещает 4 байта адреса и все байты данных, скопировать всё это в него, а затем передать одной функцией Send_Spi_dma. Вы её писали?

Вот пример, как сделан DMA у LPC4337

image.thumb.png.b02b38d2db47fa973dcc4426e5a0ec8b.png

Share this post


Link to post
Share on other sites

Да со связными списками хороший вариант получается, жаль их нету в stm =( 

43 minutes ago, haker_fox said:

то нужно завести буфер, который вмещает 4 байта адреса и все байты данных

Да вот это тоже не хотелось бы делать так как буфер неизвестного размера  надо определить, да и памяти жалко на такую фигню тратить.

43 minutes ago, haker_fox said:

функцией Send_Spi_dma. Вы её писали? 

Да, там просто настройка DMA +ожидание завершения на ulTaskNotifyTake, а разрешение идет из прерываний по завершению транзакции DMA.

 

Edited by pokk

Share this post


Link to post
Share on other sites
2 hours ago, pokk said:

жаль их нету в stm =( 

Да, бегло глянул RM. Думал просмотрел, но, значит, действительно нет. Странно! Такой мощный микроконтроллер на вид(((

2 hours ago, pokk said:

да и памяти жалко на такую фигню тратить.

Выделить статически буфер заведомо большого размера, но так, чтобы не всю ОЗУ потратить. А те блоки данных, которые не будут влзазить засылать в цикле. Да, DMA будет запускаться несколько раз, но не дёргаться по схеме 4 байта - 1 кБ.

2 hours ago, pokk said:

ulTaskNotifyTake, а разрешение идет из прерываний по завершению транзакции DMA.

Я понял, я ведь тоже также DMA использую только в LPC4337. Но со связными списками:blum:

Возможно остальные коллеги, кто более плотно работает с STM что-то вам подскажут.

Share this post


Link to post
Share on other sites
27 minutes ago, haker_fox said:

Я понял, я ведь тоже также DMA использую только в LPC4337. Но со связными списками:blum:

А если надо передать 1 байт ? Как делаеться ожидание на выставление CS? К примеру что бы разрешит  запись во  flash надо 1 байт передать.
Сначала подумал  все просто сделаю так же как DMA  на прерываниях, но там получилось что после передачи, буфер TX пустой и прерывания начинают опять генерироваться пришлось включать выключать прерывания, и после всех манипуляций получилось что CS выставляется(в 1), примерно через 1.5 времени передачи байта, не то что бы долго но интересно как сделать по компактнее.

Share this post


Link to post
Share on other sites
4 минуты назад, pokk сказал:

А если надо передать 1 байт ? Как делаеться ожидание на выставление CS? К примеру что бы разрешит  запись во  flash надо 1 байт передать.

В МК с полноценной периферией (типа LPC/XMC4xxx/Tiva/...) SPI-каналы имеют FIFO. Так что можно записать команду (в несколко байт) в FIFO (процессором), а потом сразу разрешить работу DMA->SPI. И получить прерывание только одно - в конце DMA. Но Вы же сами выбрали такой МК, в котором SPI ущербный - без FIFO. И DMA без режима "связных списков".

Share this post


Link to post
Share on other sites
8 hours ago, jcxz said:

Но Вы же сами выбрали такой МК, в котором SPI ущербный - без FIFO. И DMA без режима "связных списков".

Охохохо... что-то с каждым днём STM32 мне кажутся всё менее и менее прекрасными.

Share this post


Link to post
Share on other sites
10 hours ago, jcxz said:

Так что можно записать команду (в несколко байт) в FIFO (процессором)

О т.е  4 байта адреса можно туда загнать, и потом включить DMA на передачу данных ? А какой примерно по размерности там буфер FIFO  (2-10 байт или больше ?)

10 hours ago, jcxz said:

В МК с полноценной периферией (типа LPC/XMC4xxx/Tiva/...)

А можно краткое описание чем они отличиаються и под какие задачи тот или другой ипользовать? А то сижу на  stm32 нефига незнаю =(

Share this post


Link to post
Share on other sites
34 minutes ago, pokk said:

А какой примерно по размерности там буфер FIFO  (2-10 байт или больше ?)

image.thumb.png.837ae5e74248dd554b8103e3860b410d.png

34 minutes ago, pokk said:

А можно краткое описание чем они отличиаються и под какие задачи тот или другой ипользовать?

Про LPC4337 могу сказать следующее:

1. Два ядра: Cortex-M0/M4F, 204 МГц.

2. Довольно богатая периферия.

3. Возможность аппаратно кроссировать событий между модулями для их запуска, например.

4. Особняком бы упомянул SGPIO - конфигурируемый модуль последовательно-параллельных интерфейсов. Т.е. вы можете сделать на нём недостающую пару-семёрку USART, интерфейс к матрице цифровой камеры, интерфейс к квадратурным энкодерами и т.п.

5. Лучше скачате документацию и поглядите по диагонали)

Share this post


Link to post
Share on other sites
2 часа назад, pokk сказал:

О т.е  4 байта адреса можно туда загнать, и потом включить DMA на передачу данных ? А какой примерно по размерности там буфер FIFO  (2-10 байт или больше ?)

"Там" это где? Во всех - разные. В XMC4xxx например - до 64 слов.

Цитата

А можно краткое описание чем они отличиаються и под какие задачи тот или другой ипользовать? А то сижу на  stm32 нефига незнаю =(

Чтение технической документации - только за деньги.

Использовать можно любой под любые задачи. Сначала формулируется задача (задачи); потом - предположительные алгоритмы её решения; а уже затем - смотрятся мануалы на разные МК, и выбирается из доступных наиболее подходящий для решения этой задачи. Хотя (как складывается впечатление после прочтения большинства топиков здесь) подавляющее большинство ставят телегу впереди лошади. А потом героически пытаются заставить это хоть как-то ехать.

Share this post


Link to post
Share on other sites
27 minutes ago, jcxz said:

подавляющее большинство ставят телегу впереди лошади.

Тут ещё срабатывает то, что на фирме пара-тройка человек работает только с xxx, yyy, zzz микроконтроллерами. Есть наработки в области ПО и железа. И, иногда, кажется, что проще извратиться, но решиь задачу знакомыми методами и средствами, чем тратить время на изучение нового микроконтроллера и написание под него ПО.

Share this post


Link to post
Share on other sites
5 часов назад, haker_fox сказал:

Охохохо... что-то с каждым днём STM32 мне кажутся всё менее и менее прекрасными.

Дык они проще по возможностям, соответственно проще в освоении.

Share this post


Link to post
Share on other sites
9 минут назад, haker_fox сказал:

Тут ещё срабатывает то, что на фирме пара-тройка человек работает только с xxx, yyy, zzz микроконтроллерами. Есть наработки в области ПО и железа. И, иногда, кажется, что проще извратиться, но решиь задачу знакомыми методами и средствами, чем тратить время на изучение нового микроконтроллера и написание под него ПО.

В этом случае, если не изучать нового, мозги со временем закисают и уже не способны решить новой задачи.

Не надо идти на поводу у лентяев и неумех.

Настоящий инженер (и программист в том числе) всю жизнь должен изучать и осваивать новое. Иначе он не инженер уже.

Share this post


Link to post
Share on other sites
7 minutes ago, jcxz said:

Настоящий инженер (и программист в том числе) всю жизнь должен изучать и осваивать новое. Иначе он не инженер уже.

Повторюсь) Я не знаю, как у вас, например, на работе) Но у меня есть начальник отдела. И, иногда, даже пяток обоснований не срабатывают. Есть уставка: использовать имеющееся.

8 minutes ago, jcxz said:

Иначе он не инженер уже.

Ну решение новой задачи на неподходящем для этого железа - тоже задача. Извините за тавтологию))) И мозги не закиснут)

13 minutes ago, HardEgor said:

Дык они проще по возможностям, соответственно проще в освоении.

Точно!

Share this post


Link to post
Share on other sites

Да ладно! Вы всерьёз завели разговор о смене МК только потому, что у автора темы одно "лишнее" прерывание при отправке пакета по SPI? :acute:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now