Страница 1 из 2

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Вт мар 24, 2026 4:39 pm
dvk
День добрый. Задумал я читать данные с флешки быстро-быстро. Настроил SPI фул-дуплекс и частоту в два раза ниже системной. Записал на флешку "очень" важную информацию и пытаюсь читать. Получается не очень быстро. Если ждать флаг RXNE , то пауза между принятыми байтами, примерно равна времени приёма самого байта. Потом прикрутил DMA к каналу RX , стало намного всё красивее , но не идеально
log.png
Пауз стало меньше и они короче , но мне они не нравятся. Не хватает немного скорости)))) Поэтому возник вопрос , можно ли как-то оптимизировать мой код ???
kod.png
Если убрать цикл и отправлять байт за байтом , то получается идеально. Но это для 10 байт , а если 100 или 1000 или .....
no_loop.png
Ещё и на TX прикручивать DMA не охота пока

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 7:48 am
VitGo
dvk писал(а): Вт мар 24, 2026 4:39 pm Поэтому возник вопрос , можно ли как-то оптимизировать мой код ???kod.png Если убрать цикл и отправлять байт за байтом , то получается идеально.
да, ваш код отправки не использует всех возможностей блока spi stm32
сейчас уже ухожу на работу, но могу предложить почитать мою же статью на Хабре STM32: SPI: LCD — Вы всё делаете не так [восклицательный знак] https://habr.com/ru/articles/276605/

смотрите как делается отправка (исп флага TXE)
посмотрите как реализована отправка в исходниках драйверов LCD в папке examples по вашему микроконтроллеру или схожему
вечером если не забуду еще отпишусь

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 10:37 am
dvk
VitGo писал(а): Ср мар 25, 2026 7:48 am
посмотрите как реализована отправка в исходниках драйверов LCD в папке examples по вашему микроконтроллеру или схожему
вечером если не забуду еще отпишусь
В примерах в папке examples LCD для F401 используется SPI2 , и этот spi там работает на скорости 21Мгц , что в четыре раза ниже системной частоты, которая у вас там 84 Мгц. И на таких частотах всё идеально. А если частоту SPI настроить в два раза ниже системной то у вас там всё ещё хуже чем у меня )))
spi_exampl.png
Это идёт заливка экрана . Системная частота 16 Мгц а SPI 8 Мгц :shock:

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 2:41 pm
VitGo
dvk писал(а): Ср мар 25, 2026 10:37 am В примерах в папке examples LCD для F401 используется SPI2 , и этот spi там работает на скорости 21Мгц , что в четыре раза ниже системной частоты, которая у вас там 84 Мгц. И на таких частотах всё идеально. А если частоту SPI настроить в два раза ниже системной то у вас там всё ещё хуже чем у меня ))) spi_exampl.png Это идёт заливка экрана . Системная частота 16 Мгц а SPI 8 Мгц :shock:
пример какой ?
точно не софт спи ? а то у нас был какой то на тех же пинах что и spi2 но софт spi
хуже быть не может, потому что spi + txe - это конвейер передачи.. если данные уже готовы - то все будет максимально быстро
а при системной частоте 16 мгц и спи 8 мгц - надо смотреть как данные подготавливаются, может быть как раз имеет место быть долгой подготовки данных, опять таки не всегда 16 тактов cpu достаточно для подготовки данных...

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 4:20 pm
dvk
VitGo писал(а): Ср мар 25, 2026 2:41 pm пример какой ?
пример.png
пример.png (2.25 КБ) 54 просмотра
Нормальный там аппаратный SPI2. Виталий , вы посмотрите потом немного внимательнее на скрин моего кода. Там цикл ( отмечен кружком ), в нём ожидание TXE , отправка байта и декремент счётчика отправленных байтиков. Для полного счастья не хватает пару тактов SPI (иногда). Я вот и подумал , может есть какой-нибудь "грязный хак" для уменьшения этого цикла :shock:

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 6:18 pm
VitGo
dvk писал(а): Ср мар 25, 2026 4:20 pm пример.png Нормальный там аппаратный SPI2. Виталий , вы посмотрите потом немного внимательнее на скрин моего кода. Там цикл ( отмечен кружком ), в нём ожидание TXE , отправка байта и декремент счётчика отправленных байтиков. Для полного счастья не хватает пару тактов SPI (иногда). Я вот и подумал , может есть какой-нибудь "грязный хак" для уменьшения этого цикла :shock:
Да, я уже посмотрел.. ну возможно что мку банально не успевает данные готовить....все таки вы задали очень высокую частоту SPI относительно SysCLK...
посчитайте такты процессора на подготовку данных... любое чтение памяти 2 такта, любой переход 2 такта, остальные можно посчитать по 1 такту..

если у вас передача 8 бит - то получается что 16 тактов у вас на подготовку нового значения... проверку флагов, и так далее...
скорее всего вы уже на пределе (вернее за ним) - поэтому и возникают паузы...

В примере у меня порядка 16 тактов только исполнения подпрограммы отправки байта !! без вызова (прибавьте еще 2)
1.jpg
при отношении sysclk к spi_clk как 4 к 1 - это не страшно, но если поменять на ваши 2 к 1 - то конечно подготовка будет запаздывать !

так что ничего особо удивительного, если надо не отвлекаясь то только dma вас спасет... либо оптимизировать подготовку данных для отправки и сам цикл на максимальное быстродействие

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 6:28 pm
VitGo
вопрос скорее для темы про STM32F4 SPI чем про SPI FLASH

Модулем работы с SPI FLASH в итоге поделитесь ?

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 7:07 pm
dvk
VitGo писал(а): Ср мар 25, 2026 6:28 pm
Модулем работы с SPI FLASH в итоге поделитесь ?
:lol: :lol: :lol: . Прежде чем кусок моего кода станет модулем, должны пройти годы, а может и столетия ))) Если можете перенести это в другую ветку , то я не против))))

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 7:11 pm
dvk
VitGo писал(а): Ср мар 25, 2026 6:18 pm
если у вас передача 8 бит - то получается что 16 тактов у вас на подготовку нового значения...
Как вариант можно на 16-бит SPI переключиться , но там тоже есть неудобства, нужно команды и адреса перекручивать :shock:

Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)

Добавлено: Ср мар 25, 2026 7:13 pm
VitGo
dvk писал(а): Ср мар 25, 2026 7:07 pm Прежде чем кусок моего кода станет модулем, должны пройти годы, а может и столетия ))) Если можете перенести это в другую ветку , то я не против))))
ну по большому счету опишите интерфейс, а там выложим, хоть даже сюда - и коллективный разум вполне может дать какую нить интересную и конструктивную мысль... вспомните как писался новый алгоритм undo\redo в телеге, и как перебирали варианты...
а если в плане обучения - так тем более - взгляд со стороны очень много дает, а кто будет стебаться без конструктива - мы и в бан можем закинуть (для флуда дан телеграм)