Перейти к содержанию
    

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);
}

 

 

 

Изменено пользователем pokk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, pokk said:

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

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

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

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

image.thumb.png.b02b38d2db47fa973dcc4426e5a0ec8b.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

43 minutes ago, haker_fox said:

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

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

43 minutes ago, haker_fox said:

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

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

 

Изменено пользователем pokk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 что-то вам подскажут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, haker_fox said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, pokk сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, jcxz said:

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

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

10 hours ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Лучше скачате документацию и поглядите по диагонали)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, pokk сказал:

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

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

Цитата

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, haker_fox сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, haker_fox сказал:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, jcxz said:

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

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

8 minutes ago, jcxz said:

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

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

13 minutes ago, HardEgor said:

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

Точно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...