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

Модератор: VitGo

Аватара пользователя
dvk
Сообщения: 27
Зарегистрирован: Вс мар 22, 2026 8:04 pm

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

Сообщение dvk »

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

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

Сообщение VitGo »

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

смотрите как делается отправка (исп флага TXE)
посмотрите как реализована отправка в исходниках драйверов LCD в папке examples по вашему микроконтроллеру или схожему
вечером если не забуду еще отпишусь
Аватара пользователя
dvk
Сообщения: 27
Зарегистрирован: Вс мар 22, 2026 8:04 pm

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

Сообщение dvk »

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

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

Сообщение 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 достаточно для подготовки данных...
Аватара пользователя
dvk
Сообщения: 27
Зарегистрирован: Вс мар 22, 2026 8:04 pm

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

Сообщение dvk »

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

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

Сообщение 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 вас спасет... либо оптимизировать подготовку данных для отправки и сам цикл на максимальное быстродействие
VitGo
Сообщения: 30
Зарегистрирован: Вс мар 22, 2026 6:59 pm
Откуда: Оренбург

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

Сообщение VitGo »

вопрос скорее для темы про STM32F4 SPI чем про SPI FLASH

Модулем работы с SPI FLASH в итоге поделитесь ?
Аватара пользователя
dvk
Сообщения: 27
Зарегистрирован: Вс мар 22, 2026 8:04 pm

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

Сообщение dvk »

VitGo писал(а): Ср мар 25, 2026 6:28 pm
Модулем работы с SPI FLASH в итоге поделитесь ?
:lol: :lol: :lol: . Прежде чем кусок моего кода станет модулем, должны пройти годы, а может и столетия ))) Если можете перенести это в другую ветку , то я не против))))
Аватара пользователя
dvk
Сообщения: 27
Зарегистрирован: Вс мар 22, 2026 8:04 pm

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

Сообщение dvk »

VitGo писал(а): Ср мар 25, 2026 6:18 pm
если у вас передача 8 бит - то получается что 16 тактов у вас на подготовку нового значения...
Как вариант можно на 16-бит SPI переключиться , но там тоже есть неудобства, нужно команды и адреса перекручивать :shock:
VitGo
Сообщения: 30
Зарегистрирован: Вс мар 22, 2026 6:59 pm
Откуда: Оренбург

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

Сообщение VitGo »

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

Вернуться в «SPI»