Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
Модератор: VitGo
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
День добрый. Задумал я читать данные с флешки быстро-быстро. Настроил SPI фул-дуплекс и частоту в два раза ниже системной. Записал на флешку "очень" важную информацию и пытаюсь читать. Получается не очень быстро. Если ждать флаг RXNE , то пауза между принятыми байтами, примерно равна времени приёма самого байта. Потом прикрутил DMA к каналу RX , стало намного всё красивее , но не идеально Пауз стало меньше и они короче , но мне они не нравятся. Не хватает немного скорости)))) Поэтому возник вопрос , можно ли как-то оптимизировать мой код ??? Если убрать цикл и отправлять байт за байтом , то получается идеально. Но это для 10 байт , а если 100 или 1000 или ..... Ещё и на TX прикручивать DMA не охота пока
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
да, ваш код отправки не использует всех возможностей блока spi stm32dvk писал(а): Вт мар 24, 2026 4:39 pm Поэтому возник вопрос , можно ли как-то оптимизировать мой код ???kod.png Если убрать цикл и отправлять байт за байтом , то получается идеально.
сейчас уже ухожу на работу, но могу предложить почитать мою же статью на Хабре STM32: SPI: LCD — Вы всё делаете не так [восклицательный знак] https://habr.com/ru/articles/276605/
смотрите как делается отправка (исп флага TXE)
посмотрите как реализована отправка в исходниках драйверов LCD в папке examples по вашему микроконтроллеру или схожему
вечером если не забуду еще отпишусь
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
В примерах в папке examples LCD для F401 используется SPI2 , и этот spi там работает на скорости 21Мгц , что в четыре раза ниже системной частоты, которая у вас там 84 Мгц. И на таких частотах всё идеально. А если частоту SPI настроить в два раза ниже системной то у вас там всё ещё хуже чем у меня ))) Это идёт заливка экрана . Системная частота 16 Мгц а SPI 8 МгцVitGo писал(а): Ср мар 25, 2026 7:48 am
посмотрите как реализована отправка в исходниках драйверов LCD в папке examples по вашему микроконтроллеру или схожему
вечером если не забуду еще отпишусь
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
пример какой ?dvk писал(а): Ср мар 25, 2026 10:37 am В примерах в папке examples LCD для F401 используется SPI2 , и этот spi там работает на скорости 21Мгц , что в четыре раза ниже системной частоты, которая у вас там 84 Мгц. И на таких частотах всё идеально. А если частоту SPI настроить в два раза ниже системной то у вас там всё ещё хуже чем у меня ))) spi_exampl.png Это идёт заливка экрана . Системная частота 16 Мгц а SPI 8 Мгц![]()
точно не софт спи ? а то у нас был какой то на тех же пинах что и spi2 но софт spi
хуже быть не может, потому что spi + txe - это конвейер передачи.. если данные уже готовы - то все будет максимально быстро
а при системной частоте 16 мгц и спи 8 мгц - надо смотреть как данные подготавливаются, может быть как раз имеет место быть долгой подготовки данных, опять таки не всегда 16 тактов cpu достаточно для подготовки данных...
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
Нормальный там аппаратный SPI2. Виталий , вы посмотрите потом немного внимательнее на скрин моего кода. Там цикл ( отмечен кружком ), в нём ожидание TXE , отправка байта и декремент счётчика отправленных байтиков. Для полного счастья не хватает пару тактов SPI (иногда). Я вот и подумал , может есть какой-нибудь "грязный хак" для уменьшения этого цикла
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
Да, я уже посмотрел.. ну возможно что мку банально не успевает данные готовить....все таки вы задали очень высокую частоту SPI относительно SysCLK...dvk писал(а): Ср мар 25, 2026 4:20 pm пример.png Нормальный там аппаратный SPI2. Виталий , вы посмотрите потом немного внимательнее на скрин моего кода. Там цикл ( отмечен кружком ), в нём ожидание TXE , отправка байта и декремент счётчика отправленных байтиков. Для полного счастья не хватает пару тактов SPI (иногда). Я вот и подумал , может есть какой-нибудь "грязный хак" для уменьшения этого цикла![]()
посчитайте такты процессора на подготовку данных... любое чтение памяти 2 такта, любой переход 2 такта, остальные можно посчитать по 1 такту..
если у вас передача 8 бит - то получается что 16 тактов у вас на подготовку нового значения... проверку флагов, и так далее...
скорее всего вы уже на пределе (вернее за ним) - поэтому и возникают паузы...
В примере у меня порядка 16 тактов только исполнения подпрограммы отправки байта !! без вызова (прибавьте еще 2) при отношении sysclk к spi_clk как 4 к 1 - это не страшно, но если поменять на ваши 2 к 1 - то конечно подготовка будет запаздывать !
так что ничего особо удивительного, если надо не отвлекаясь то только dma вас спасет... либо оптимизировать подготовку данных для отправки и сам цикл на максимальное быстродействие
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
вопрос скорее для темы про STM32F4 SPI чем про SPI FLASH
Модулем работы с SPI FLASH в итоге поделитесь ?
Модулем работы с SPI FLASH в итоге поделитесь ?
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
Как вариант можно на 16-бит SPI переключиться , но там тоже есть неудобства, нужно команды и адреса перекручиватьVitGo писал(а): Ср мар 25, 2026 6:18 pm
если у вас передача 8 бит - то получается что 16 тактов у вас на подготовку нового значения...
Двойной буфер на передачу. Скорость передачи данных по SPI (перенесенная)
ну по большому счету опишите интерфейс, а там выложим, хоть даже сюда - и коллективный разум вполне может дать какую нить интересную и конструктивную мысль... вспомните как писался новый алгоритм undo\redo в телеге, и как перебирали варианты...dvk писал(а): Ср мар 25, 2026 7:07 pm Прежде чем кусок моего кода станет модулем, должны пройти годы, а может и столетия ))) Если можете перенести это в другую ветку , то я не против))))
а если в плане обучения - так тем более - взгляд со стороны очень много дает, а кто будет стебаться без конструктива - мы и в бан можем закинуть (для флуда дан телеграм)