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

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

Just now, AHTOXA said:

что у автора темы одно "лишнее" прерывание при отправке пакета по SPI?

Чесс говоря, я бы не стал париться, если производительность системы не падает. Осваивать новый МК - это не пуд соли купить)

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


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

26 минут назад, AHTOXA сказал:

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

А где тут был разговор о "смене МК"?  :unknw:

И завели тему не мы, а автор. И по другому вопросу: как сиё сделать на STM. По существу вопроса что-то посоветовать можете?

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


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

По существу уже ответили: только копированием в промежуточный буфер. Но я бы оставил всё как есть.

Но раз уж зашла речь про NXP-шные SPI и DMA, спрошу: можно ли там сделать передёргивание CS между блоками (например, после отправки  команды и адреса)? Ну, без прерывания конечно.

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


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

Создать структуру для команды, адреса и данных, и посылать всю целиком. Не?

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


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

А я бы запустил DMA для команды, а инфу о блоке данных запомнил бы и запустил DMA для данных из ISR (не дёргая для такой ерунды задачу). А семафор взводил бы уже после завершения DMA блока данных.

Собственно у меня так и делается в проекте на STM где есть работа с SPI-flash.

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


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

3 минуты назад, ViKo сказал:

Создать структуру для команды, адреса и данных, и посылать всю целиком. Не?

Если блок данных достаточно длинный, то это может быть невыгодно - нужен большой промежуточный буфер, и время копирования может превышать затраты на лишнее прерывание.

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


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

2 минуты назад, ViKo сказал:

Создать структуру для команды, адреса и данных, и посылать всю целиком. Не?

Это и есть "с копированием в промежуточный буфер".

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


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

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

Если блок данных достаточно длинный, то это может быть невыгодно - нужен большой промежуточный буфер, и время копирования может превышать выигрыш.

А почему массив данных в структуре не использовать сразу, без буфера?

Если это данные из ПЗУ, тогда понятно, посылать отдельно команду, отдельно данные. Команду - без DMA, на прерываниях по пересылке байта. Данные - по DMA. 

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


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

Только что, ViKo сказал:

А почему массив данных в структуре не использовать сразу, без буфера?

Это сильно усложняет работу с SPI. Нельзя будет просто передать на запись произвольный блок данных.
 

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


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

2 минуты назад, ViKo сказал:

А почему массив данных в структуре не использовать сразу, без буфера?

Потому что SPI-flash требует передачи команды перед данными.

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


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

5 минут назад, jcxz сказал:

А я бы запустил DMA для команды, а инфу о блоке данных запомнил бы и запустил DMA для данных из ISR (не дёргая для такой ерунды задачу). А семафор взводил бы уже после завершения DMA блока данных.

Ну, это уже детали реализации - каким образом запускать вторую транзакцию. Можно из ISR, можно из задачи.
 

Я там выше вопрос дописал:

13 минут назад, AHTOXA сказал:

Но раз уж зашла речь про NXP-шные SPI и DMA, спрошу: можно ли там сделать передёргивание CS между блоками (например, после отправки  команды и адреса)? Ну, без прерывания конечно.

Реализуемо?

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


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

17 минут назад, jcxz сказал:

Потому что SPI-flash требует передачи команды перед данными.

Стандартная ситуация. Четверку байтов переслать - вам DMA нужен? Не заморачивайтесь на пустом месте.

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


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

19 минут назад, AHTOXA сказал:

Но раз уж зашла речь про NXP-шные SPI и DMA, спрошу: можно ли там сделать передёргивание CS между блоками (например, после отправки  команды и адреса)? Ну, без прерывания конечно.

В известных мне NXP (LPC17xx, LPC43xx) насколько помню - нет. Можно в XMC4xxx, в OMAP-L13x, про Tiva - не помню.

7 минут назад, ViKo сказал:

Стандартная ситуация. Четверку байтов переслать? Не заморачивайтесь на пустом месте.

Вообще-то не четвёрку, а намного больше. И ТС тут печётся об одном прерывании, а Вы ему советуете вместо этого ещё десяток прерываний добавить.

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


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

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

Вообще-то не четвёрку, а намного больше. И ТС тут печётся об одном прерывании, а Вы ему советуете вместо этого ещё десяток прерываний добавить.

В стартовом сообщении - именно четверку.

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


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

35 minutes ago, AHTOXA said:

По существу уже ответили: только копированием в промежуточный буфер.

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

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


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

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

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

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

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

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

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

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

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

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