SPI DMA

victor_pv
Сб 29 апреля 2017 г., 19:52
Я добавляю SPI.dmasend и spi.Dmatransfer, как обсуждалось в другой ветке.
Теперь для этого мне нужно добавить несколько определений, и эти определения будут разными в зависимости от серии (такие вещи, как контроллер SPI1 DMA и канал для использования, IRQ, то же самое для SPI2, SPI3...SPI6).

Должен ли я поместить все эти определения в SPI.H файл, или, скорее, добавьте другой .H файл и включите его из SPI.час?

РЕДАКТИРОВАТЬ:
Я получил отличный Dmatransfer в режиме опроса (блокировки), аналогично ядрости Libmaple F1, по крайней мере для SPI1.
Протестировано с помощью SPI1 и SPI2.
Протестировано PITO с SDFAT для F1 (F1 File требует изменения #IFDEF для компиляции для этого ядра.)
Ему нужно работать, чтобы сделать его совместимым с большим количеством MCU и добавить неблокирующий режим с обратными вызовами.

Edit2:
Я добавил определения почти для всех серий и протестированного компиляции, но у меня не было возможности проверить функциональность, кроме F4.
У меня есть F1, так что я могу проверить это. Если у кого -то есть серия L0, L1, L4 или F3 и протестируйте его, дайте мне знать, если это работает.

РЕДАКТИРОВАТЬ3:
Новые исправления для серии L0 и L4, которые нуждались в дополнительных настройках.
Последняя рабочая версия в этом филиале:
https: // github.com/Victorpv/STM32Generic/Tree/Spi-DMA

Пито
Солнце 30 апреля 2017 г. 12:06
Это измерение F407 Sdbench (168 МГц, Блэкз) для записи - SPI1 FREQ VS. RDWR Speed ​​(Sammy Evo 8gb, Cl10), Sdfatex, Buff Size 512b:
Spi no dma rdwr speed.jpg
Spi no dma rdwr Speed.JPG (18.55 киб) просмотрено 1723 раз

victor_pv
Солнце 30 апреля 2017 г., 3:21
Первая рабочая версия в этом филиале:
https: // github.com/Victorpv/STM32Generic/Tree/Spi-DMA

Отправил пиар Дэниелу на случай, если он захочет добавить его, чтобы больше людей могли начать тестирование/использовать его.

Я проверил это очень в основном, просто отправляя и получая данные в том же порту и сравнивая, что я получаю, когда я отправил. До сих пор тестирование только SPI1. Мне нужно найти булавки для SPI2 и SPI3 и повторить тесты.
Буду признателен за любые отзывы.

Основные изменения:
Добавление структур HDMA для каналов TX и RX.
Включение DMA1 и 2 периферийных часов во время .начинать
Ряд определений в .H Файл перечисляет, что применяется к комбинации контроллера DMA/потока к каждому порту.
Если в серии F4 есть несколько возможных потоков для каждого периферийного устройства, я просто выбрал то же самое, что HAL MX выбирает по умолчанию.

Нужный:
Поддержка других серий в определении
В функциях DMASEND и TRANSER FUNCTIONS FIFO и других настройках должны быть необязательными, поскольку они не применяются к F1 и F3, например, например,. Не уверен в лучшем способе реализации, мне действительно не нравится иметь кучу определений, брошенных в середине кода, поэтому может просто перенести настройки HDMA на отдельную функцию и, возможно, иметь все условные компиляции в этой единственной функции.
Поддержка обратного вызова. Мне нужно сначала добавить ISRS, которые могут управлять любым периферийным устройством и выяснить, какой из них нуждается в обслуживании (SPI1 до 6 в некоторых сериях).
Решить, должен ли все определения DMA быть в отдельном файле или сохранить их в SPI.час

victor_pv
Солнце 30 апреля 2017 г. 3:24
Пито написал:Это измерение F407 (168 МГц, Blackze) для записи - SPI1 FREQ VS. RDWR Speed ​​(Sammy Evo 8gb, Cl10), Sdfatex, Buff Size 512b:
Spi no dma rdwr Speed.JPG
Дважды проверили часы SPI с Лос-Анджелесом.

PS: я думаю это в SPI.CPP if (settings.clock > apb_freq / 2) { spiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; } else if (settings.clock > apb_freq / 4) { spiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;

Даниэфф
Солнце 30 апреля 2017 г., 4:26 утра
Спасибо, я исправим настройки.часы.

Hal_dma_irqhandler () предназначен для обработки IRQ, проверьте сгенерированный куб STM32F4XX_IT.C: `extern" c "void dma2_stream3_irqhandler (void) () {hal_dma_irqhandler (&hdma_spi1_tx);} `(это также вызовет hdma_spi_rx->Xfercpltcallback (который устанавливается на слабый SPI_DMatransmitReceiveCplt () by hal_spi_transmitreceive_dma (что не идеально, кстати, я хочу пользовательские обратные вызовы))))))))

Мне было интересно, как вы справляетесь с запросами - потоки - каналы для каждой проблемы чипа :)

victor_pv
Солнце 30 апреля 2017 г. 5:56 утра
Даниэфф написал:Спасибо, я исправим настройки.часы.

Hal_dma_irqhandler () предназначен для обработки IRQ, проверьте сгенерированный куб STM32F4XX_IT.C: `extern" c "void dma2_stream3_irqhandler (void) () {hal_dma_irqhandler (&hdma_spi1_tx);} `(это также вызовет hdma_spi_rx->Xfercpltcallback (который устанавливается на слабый SPI_DMatransmitReceiveCplt () by hal_spi_transmitreceive_dma (что не идеально, кстати, я хочу пользовательские обратные вызовы))))))))

Мне было интересно, как вы справляетесь с запросами - потоки - каналы для каждой проблемы чипа :)

victor_pv
Солнце 30 апреля 2017 г. 6:43
Я запускаю некоторые скоростные тесты с SPI2, чтобы сравнить DMA с не DMMA Speeds.
Я запускаю только тесты на обоих с большим буфером 8 КБ.

8 КБ буфер
Скорость / Нет DMA / DMA
21 МБ / 8977.136US / 3127.777us
5.25 МБ / 17560.336US / 12490.117US

РЕДАКТИРОВАТЬ: Функция таблицы в PHPBB ужасна...
Использовал код, размещенный в другой ветке для меры США:
elapsed = CpuGetTicks(); // Measure the 1ms delay spi2.dmaTransfer(array_out, array_in, 8192); //spi2.transfer(array_out, 8192); elapsed = CpuGetTicks()- elapsed; // How many CPUTicks? nanos = 5.9524 * elapsed; // Convert to nanoseconds

Даниэфф
Солнце 30 апреля 2017 г. 6:56 утра
ОК на прерываниях.

К вашему сведению ваш код работает на моем F7.

Я думаю, что F2/F4/F7 одинаково (Stream+Channel), F0/F1/F3/L1 - это то же самое (канал), L0/L4 одинаково (канал+запрос).
Кроме того, если инженеры STM32 были хороши, нам повезло, и они всегда на одном (SPI1_TX всегда на DMA2_Stream3 или DMA3_Stream5 на F2/F4/F7...)

victor_pv
Солнце 30 апреля 2017 г. 7:04
Я получаю начинку, они в значительной степени копируют/вставьте аппаратные блоки между сериями, так что, надеюсь, они одинаковы, но если нет, я не думаю, что это слишком много проблем с добавлением, так как в справочных руководствах есть хороший таблица для каналов DMA.
Рад узнать, работает ли на F7. У меня есть один, который я получил в прошлом году, чтобы бесплатно получить пыль на полке, теперь могу использовать его для некоторого использования :)

Пито
Солнце 30 апреля 2017 г. 11:05
21 МБ / 8977.136US / 3127.777us Теоретическое время передачи DMA для большого буфера на 8192 байтов при скорости SPI 21 МГц составляет 3120.762US :)


Хм, я хочу в качестве теста, чтобы заменить получение в SDFAT SDSpidriver.H с Dmatransfer uint8_t receive(uint8_t* buf, size_t n) { SPI.dmaTransfer( buf, buf, n); // SPI.dmaTransfer( 0, buf, n); // for (size_t i = 0; i < n; i++) { // buf[i] = SPI.transfer(0XFF); // } return 0; }

michael_l
Солнце 30 апреля 2017 г. 12:45
Victor_pv: Хорошая работа, я могу проверить, когда у меня есть больше свободного времени. Я постараюсь сначала работать на бортовой вспышке, работая.

Есть ли смысл в создании небольшого тестового набора для SPI и SPI DMA между SPI1 и SPI2, чтобы проверить, как он работает ?

victor_pv
Солнце 30 апреля 2017 г. 13:29
Пито написал: SPI.dmaTransfer( buf, buf, n); // SPI.dmaTransfer( 0, buf, n);

Пито
Солнце 30 апреля 2017 г. 13:31
Я обновил результаты.. Примерно в 2 раза быстрее WR/Rd.
Да, нам нужен нулевый буфер :)

Это измерение F407 Sdbench (168 МГц, Блэкз) для записи - SPI1 FREQ VS. RDWR Speed ​​(Sammy Evo 8gb, CL10), Sdfatex, размер буфера 512bytes:
SPI против rdwr speed.jpg
SPI против RDWR Speed.JPG (26.6 киб) просмотрено 469 раз

victor_pv
Солнце 30 апреля 2017 г. 13:32
michael_l написал:Victor_pv: Хорошая работа, я могу проверить, когда у меня есть больше свободного времени. Я постараюсь сначала работать на бортовой вспышке, работая.

Есть ли смысл в создании небольшого тестового набора для SPI и SPI DMA между SPI1 и SPI2, чтобы проверить, как он работает ?

Пито
Солнце 30 апреля 2017 г. 14:13
@victor, ОК, изменилось здесь, и это работает. Обновлено выше диаграммы, так как скорость чтения сейчас намного выше :) +20%
Кстати, что такое MINC = 1 в SPI.dmasend (const_cast<uint8_t*>(buf), n, 1); Приращение памяти??

Пито
Солнце 30 апреля 2017 г. 14:40
Если библиотека SDFAT была изменена для переключения потока для MS при ожидании задержки, я предполагаю, что это могло бы дать еще одну хорошую часть времени процессора обратно на эскизы, которые пишут. Мой игрок WAV только читает, я не думаю, что в чтениях много задержки, верно? Вам нужно проверить Sdbench на F1? Я могу сделать..

victor_pv
Солнце 30 апреля 2017 г. 14:54
Пито написал:@victor, ОК, изменилось здесь, и это работает. Обновлено выше диаграммы, так как скорость чтения сейчас намного выше :) +20%
Кстати, что такое MINC = 1 в SPI.dmasend (const_cast<uint8_t*>(buf), n, 1); Приращение памяти??

Пито
Солнце 30 апреля 2017 г. 15:54
Мой игрок WAV только читает, я не думаю, что в чтениях много задержки, верно? Задержки записи с помощью SDCARDS огромные, 5-250 мс, обычно 3-50 мс все время, случайное явление..

С моими вышеупомянутыми экспериментами я не трогал файл драйвера SDFAT SDFATM32F1 (даже я провел несколько часов с ним..).
Я просто заменил функции приема и отправки (см. Выше) в SDSpidriver.
Это большой Q, нужен ли нам файл драйвера F1 или нет. Когда вы устанавливаете ex mode и режим DMA Hardwired, вам не нужна то, что SDSpistm32f1, я думаю.
Так что просто в шписдривере из строки 231+ 73+ ifdefs вокруг eCeat () и send ()..
По причинам совместимости я попытался переименовать SDSPISTM32F1 в SDSPISTM32F4, установил __STM2F4__ внутри (нам нужен этот флаг в флагах) и испортился с внутренними..Поскольку проблема с нулевым указателем), поэтому я остановился и лучше вошел прямо в драйвер sdspidriver.
Когда будет sdspistm32f4 с __stm32f4__ внутри, теперь он может работать сейчас. Вы также должны играть с __stm32f4__ в SDFATCONFIG.H тоже (может быть, 2-3x). Внутри много беспорядка из -за AVR и различных моди.
Но есть только 1 режим, который работает с F1/4 - это расширенный режим с DMA.

Racemaniac
Солнце 30 апреля 2017 г. 16:26
Пито написал:Мой игрок WAV только читает, я не думаю, что в чтениях много задержки, верно? Задержки записи с помощью SDCARDS огромные, 5-250 мс, обычно 3-50 мс все время, случайное явление..

victor_pv
Солнце 30 апреля 2017 г. 16:53
Реданьяк написал:Пито написал:Мой игрок WAV только читает, я не думаю, что в чтениях много задержки, верно? Задержки записи с помощью SDCARDS огромные, 5-250 мс, обычно 3-50 мс все время, случайное явление..

Racemaniac
Солнце 30 апреля 2017 г., 17:01
victor_pv написал:Если ваш выходной драйвер тоже не использует DMA, вы должны изучить его, особенно вы используете для него драйверы.
Какую жирную библиотеку вы используете с F411?

Chismicro
Солнце 30 апреля 2017 г., 17:34
Может ли кто -нибудь из вас добавить простой набросок рабочих примеров?
Я сделал что -то для I2s без DMA.

Пито
Солнце 30 апреля 2017 г., 17:40
Задержки SDCARD - вы можете проверить задержки с помощью SDBench. По мере того, как Micros () хорошо работает сегодня, вы увидите цифры - максимальности, мин, средний, в то время как вы пишете/читаете. Больший файл, который вы пишете самые длинные задержки, с которыми вы можете столкнуться.
Задержки записи огромны, так как SDCARD делает свою домашнюю работу (то есть и т. Д.). Задержки читать минимальны, около 1.5 мс обычно. Таким образом, критическое написание - т.е. для 1 МБ/с. Устойчивые написать вам необходимость, как правило, ~ 100 КБ большого буфера FIFO (сдача на 100 мс). Существует тема «Loggard с FIFO», которая подробно рассказывает об этом подробно.
Здесь, например: write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 4381.84,16924,108,115 4508.28,8079,108,112 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3816.55,2083,133,133 3819.47,1322,133,133

Даниэфф
Солнце 30 апреля 2017 г. 18:20
victor_pv написал:@Daniel, в ваших определениях для MOSI, MISO и т. Д., Вы используете порты PB4 и PB5, один из них тот же используется для SWO. Я узнал, потому что я должен использовать SWO из -за отсутствия USB в этой доске.
Есть ли причина по умолчанию, а не в другой набор булавок? Если нет причин или выгоды, я бы посоветовал изменить его, чтобы SWO можно было использовать одновременно с SPI1. Не очень важно для большинства людей, но большое раздражение для моей доски 407.

victor_pv
Солнце 30 апреля 2017 г. 18:28
Да, это на доске F407VET, не черное, но синее, но я не думаю, что стоит сделать вариант для него в одиночку, и, возможно, в моей вспышке SPI тоже связана с этими булавками.
Тогда я просто обойду его.

victor_pv
Солнце 30 апреля 2017 г. 18:29
Реданьяк написал:victor_pv написал:Если ваш выходной драйвер тоже не использует DMA, вы должны изучить его, особенно вы используете для него драйверы.
Какую жирную библиотеку вы используете с F411?

Racemaniac
Солнце 30 апреля 2017 г. 18:31
victor_pv написал:Реданьяк написал:victor_pv написал:Если ваш выходной драйвер тоже не использует DMA, вы должны изучить его, особенно вы используете для него драйверы.
Какую жирную библиотеку вы используете с F411?

Даниэфф
Солнце 30 апреля 2017 г. 18:43
Re: Null Send Buffer в dmatransfer (): разве это не будет просто получать? Как в (в настоящее время отсутствует) `uint8_t spiclass :: dmareceive (uint8_t *receatbuf, uint16_t длина)`?, и используйте hal_spi_receive_dma

Пито
Солнце 30 апреля 2017 г. 22:37
SPI всегда отправляет и получает параллельно.

victor_pv
Солнце 30 апреля 2017 г. 22:50
Даниэфф написал:Re: Null Send Buffer в dmatransfer (): разве это не будет просто получать? Как в (в настоящее время отсутствует) `uint8_t spiclass :: dmareceive (uint8_t *receatbuf, uint16_t длина)`?, и используйте hal_spi_receive_dma

Пито
Пн, 1 мая 2017 г., 11:31
Пытаясь построить Sdbench для Maplemini, я получаю SPI\src\SPI.cpp:15:2: error: 'DMA_Stream_TypeDef' was not declared in this scope DMA_Stream_TypeDef *_StreamTX;

victor_pv
Пн, 1 мая 2017 г. 14:02
Пито написал:Пытаясь построить Sdbench для Maplemini, я получаю SPI\src\SPI.cpp:15:2: error: 'DMA_Stream_TypeDef' was not declared in this scope DMA_Stream_TypeDef *_StreamTX;

victor_pv
Пн, 1 мая 2017 г. 16:36
Даниэфф написал:ОК на прерываниях.

К вашему сведению ваш код работает на моем F7.

Я думаю, что F2/F4/F7 одинаково (Stream+Channel), F0/F1/F3/L1 - это то же самое (канал), L0/L4 одинаково (канал+запрос).
Кроме того, если инженеры STM32 были хороши, нам повезло, и они всегда на одном (SPI1_TX всегда на DMA2_Stream3 или DMA3_Stream5 на F2/F4/F7...)

Даниэфф
Вторник 2 мая 2017 г. 15:36
Я думаю, что #define spi1_streamtx 1_channel3... вещи должны быть в центральном STM32_DMA.час.
Таким образом, будет проще увидеть, что использует SPI/SDIO/I2S, и проверить конфликты.

victor_pv
Вторник 2 мая 2017 г. 16:44
Даниэфф написал:Я думаю, что #define spi1_streamtx 1_channel3... вещи должны быть в центральном STM32_DMA.час.
Таким образом, будет проще увидеть, что использует SPI/SDIO/I2S, и проверить конфликты.

Пито
Вторник 02 мая 2017 г., 17:45
Тестирование SPI F1 с SDFAT на Maple Mini.
Это с STM32F1 (SDFATEX, DMA, 36 МГц SPI) Libmaple Core File size 6 MB Buffer size 512 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3533.34,25083,136,143 3594.74,15522,136,141 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3257.12,1548,155,156 3258.89,1359,155,156 Done Type any character to start

Пито
Вторник 2 мая 2017 г., 18:20
С более медленными часами write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1946.03,26753,252,261 1976.16,12442,252,257 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 774.14,2547,658,659 774.04,2546,658,659 Done

victor_pv
Вторник 2 мая 2017 г., 19:06
Пито написал:С более медленными часами write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1946.03,26753,252,261 1976.16,12442,252,257 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 774.14,2547,658,659 774.04,2546,658,659 Done

Пито
Вторник 2 мая 2017 г., 19:20
Задержка MIN - это в основном время перенести блок (512bytes). Соотношение 2.6, это умножено на 774 - 2000.

victor_pv
Вторник 02 мая 2017 г. 8:03 вечера
Пито написал:Задержка MIN - это в основном время перенести блок (512bytes). Соотношение 2.6, это умножено на 774 - 2000.

Пито
Вторник 2 мая 2017 г. 11:06 вечера
:зло:
Приведенные выше значения чтения были с buf[i] = SPI.transfer(0XFF);

victor_pv
Ср. 3 мая 2017 г. 12:05
Пито написал::зло:
Приведенные выше значения чтения были с buf[i] = SPI.transfer(0XFF);

Пито
Ср. 3 мая 2017 г. 12:18
Для Maple Mini. Редактор Eclipse показывает это.. Так что, может быть, ложный положительный :)

victor_pv
Ср. 3 мая 2017 г. 12:25
Пито написал:Для Maple Mini. Редактор Eclipse показывает это.. Так что, может быть, ложный положительный :)

Пито
Ср. 3 мая 2017 г. 8:06 утра
Нет изменений с новейшим SPI и F1 на MM..
Читать не работает здесь с F1..
С F4 это работает.

AG123
Ср. 3 мая 2017 г. 8:28
OT: Казалось, у меня были некоторые «проблемы с проводами», играя с Sdfatex на оригинальном ядре F1 Libmaple, я не уверен, что иногда сама провода может быть в конце концов, чтобы все это было :ржу не могу:
http: // www.STM32duino.com/viewtopic.PHP ... 420#P27420

victor_pv
Ср. 3 мая 2017 г. 13:49
Пито написал:Нет изменений с новейшим SPI и F1 на MM..
Читать не работает здесь с F1..
С F4 это работает.

Пито
Ср. 3 мая 2017 г. 16:59
Правильный. Я не могу читать файл, работающий в Sdbench с F1 с DMA (Maplemini).

victor_pv
Ср. 3 мая 2017 г., 18:24
Пито написал:Правильный. Я не могу читать файл, работающий в Sdbench с F1 с DMA (Maplemini).

victor_pv
Чт, 04 мая 2017 2:29
Я не вижу ничего плохого с кодом F1.
Мне придется подключить доску в SDCard и Jlink и посмотреть, что я могу найти.

Пито
Чт, 04 мая 2017 12:56
Должно быть что -то не так с версией F1 SPI DMA.
Это Sdbench с F1 DMA Libmaple: write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1972.26,21385,251,258 1996.68,8447,251,255 1987.15,11002,251,256 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 2044.86,1767,248,249 2046.53,1766,248,249 2046.53,1765,248,249

victor_pv
Чт, 04 мая 2017 13:48
Пито написал:Должно быть что -то не так с версией F1 SPI DMA.
Это Sdbench с F1 DMA Libmaple: write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1972.26,21385,251,258 1996.68,8447,251,255 1987.15,11002,251,256 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 2044.86,1767,248,249 2046.53,1766,248,249 2046.53,1765,248,249

Пито
Чт, 04 мая 2017 г. 16:18
Это ядро ​​Дэниела, а не DMA: write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 368.38,90734,1302,1365 375.24,90747,1302,1352 377.19,366597,1302,1354 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec error: data check

Даниэфф
Чт, 04 мая 2017 г., 17:39
Здесь: http: // www.STM32duino.com/viewtopic.PHP ... 038#P27339

У этого нет возврата: `uint8_t sdspialtdriver :: checte () {`

И изменить это: SPI.transfer(const_cast(buf), n);

Пито
Чт, 04 мая 2017 г., 17:57
С изменениями (все ниже с Сандиск) - Даниэль F1 NO ​​DMA, Sandisk Fresh Formatted write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 781.69,22685,640,651 790.46,12851,640,645 792.59,11424,640,643 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 774.18,1916,658,659 774.18,1917,658,659 774.18,1917,658,659

Даниэфф
Чт, 04 мая 2017 г., 19:26
С DMA он, кажется, работает, если в конце `uint8_t spiclass :: dmasend (uint8_t *anpermitbuf, uint16_t length, bool minc) {` Я положил `hal_dma_deinit (bool minc) {` `hal_dma_deinit (&hdma_spi_tx); `.
Странный.

Пито
Чт, 04 мая 2017 г., 19:51
Я пытался, но негативно..

victor_pv
Пт 5 мая 2017 г. 13:28
Пито написал:Я пытался, но негативно..

Пито
Пт, 5 мая 2017 г. 14:25
Будьте осторожны с DANIEL's F1 DMA OFF - она ​​пишет, но файловая система стала поврежденной - выходной файл SDBench содержит «ABCD.."Строки, так что это легко проверить. Всегда старайтесь открыть файл на SDCARD после SDBench под Win/Lin.

victor_pv
Пт, 5 мая 2017 г. 18:43
Пито написал:Будьте осторожны с DANIEL's F1 DMA OFF - она ​​пишет, но файловая система стала поврежденной - выходной файл SDBench содержит «ABCD.."Строки, так что это легко проверить. Всегда старайтесь открыть файл на SDCARD после SDBench под Win/Lin.

victor_pv
Сб, 6 мая 2017 г. 18:06
Все еще не выяснил, почему F1 повреждает SDCARD, но до сих пор я обнаружил, что F1 HAL MX имеет то, что мне кажется, как ошибка на этой функции:
Hal_spi_transmitreceive_dma

Во всех остальных сериях есть этот комментарий, за которым следует две строки, которые делают то, что говорится в комментарии, но в F1 есть комментарий, но не код, который действительно делает это: /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing is performed in DMA reception complete callback */ hspi->hdmatx->XferHalfCpltCallback = NULL; hspi->hdmatx->XferCpltCallback = NULL;

Пито
Сб 6 мая 2017 г., 21:27
Я бы начну с DMA, так как это тоже испортилось. Может быть, параметры SPI устанавливаются неправильно?

victor_pv
Сб, 6 мая 2017 г., 21:50
Пито написал:Я бы начну с DMA, так как это тоже испортилось. Может быть, параметры SPI устанавливаются неправильно?

Даниэфф
Солнце 07 мая 2017 г. 13:58
Добавлен тестовый код в примеры/тестирование/Spiselftest платы

Протестировано на Maple Mini. Подключите штифты SPI1 к SPI2 (они установлены как мастер и раб). Он отправляет с помощью SPI.Передача, SPI.dmatransfer (без нулевого sendbuffer), spi.dmasend. Затем он пишет отправленные и полученные байты на Master/Slave SPI в сериал.

Наблюдения: связь, пока DMASEND не работает нормально. чем поврежден.
Если DMASEND прокомментируется, но используется Dmatransfer, Whying работает нормально (почти...).
Фактически внедрение DMA IRQ (с низким приоритетом!!! иначе Spi salve забивается), похоже, решает проблему. Но тогда HAL_DMA_POLLFORTRANSFER не работает, и вам нужно установить пользовательские флаги.

victor_pv
Солнце 07 мая 2017 г. 14:43
Даниэфф написал:Добавлен тестовый код в примеры/тестирование/Spiselftest платы

Протестировано на Maple Mini. Подключите штифты SPI1 к SPI2 (они установлены как мастер и раб). Он отправляет с помощью SPI.Передача, SPI.dmatransfer (без нулевого sendbuffer), spi.dmasend. Затем он пишет отправленные и полученные байты на Master/Slave SPI в сериал.

Наблюдения: связь, пока DMASEND не работает нормально. чем поврежден.
Если DMASEND прокомментируется, но используется Dmatransfer, Whying работает нормально (почти...).
Фактически внедрение DMA IRQ (с низким приоритетом!!! иначе Spi salve забивается), похоже, решает проблему. Но тогда HAL_DMA_POLLFORTRANSFER не работает, и вам нужно установить пользовательские флаги.

victor_pv
Солнце 07 мая 2017 г. 16:38
victor_pv написал:Даниэфф написал:Добавлен тестовый код в примеры/тестирование/Spiselftest платы

Протестировано на Maple Mini. Подключите штифты SPI1 к SPI2 (они установлены как мастер и раб). Он отправляет с помощью SPI.Передача, SPI.dmatransfer (без нулевого sendbuffer), spi.dmasend. Затем он пишет отправленные и полученные байты на Master/Slave SPI в сериал.

Наблюдения: связь, пока DMASEND не работает нормально. чем поврежден.
Если DMASEND прокомментируется, но используется Dmatransfer, Whying работает нормально (почти...).
Фактически внедрение DMA IRQ (с низким приоритетом!!! иначе Spi salve забивается), похоже, решает проблему. Но тогда HAL_DMA_POLLFORTRANSFER не работает, и вам нужно установить пользовательские флаги.

Пито
Солнце 07 мая 2017 г., 17:42
Эти цифры довольно низкие.. Также максимальная задержка высока..
При 36 МГц SPI и SDFATEX и DMA вы должны получить ~ 3.5 МБ/с rd/wr..

Пито
Солнце 07 мая 2017 г., 21:14
Это с твоим новым SPI.H и SPI.CPP, DMA ON, BLUE F103ZE @72MHZ, 36 МГц SPI, SANDISK 16 ГБ CL10: File size 5 MB Buffer size 512 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3576.31,7794,139,141 3566.11,8057,139,141 3563.56,8054,139,141 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3162.35,930,159,160 3164.35,903,159,160 3162.35,903,159,160 Done

victor_pv
Солнце 07 мая 2017 г. 9:17 вечера
Пито написал:Это с твоим новым SPI.H и SPI.CPP (Blue F103ZE @72MHZ, 36 МГц SPI, SANDISK CL10): File size 5 MB Buffer size 512 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3576.31,7794,139,141 3566.11,8057,139,141 3563.56,8054,139,141 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3162.35,930,159,160 3164.35,903,159,160 3162.35,903,159,160 Done

Пито
Солнце 07 мая 2017 г., 21:21
Итак, текущий статус:
1. F1 DMA ON - ошибка в F1 DMA найдена и исправлена,
2. F1 Нет DMA - нуждается в отладке/исправлении Даниэля?
3. F4 DMA в порядке (?),
4. F4 Нет DMA - нуждается в отладении/исправлении Даниэля?
Это правильно?

victor_pv
Солнце 07 мая 2017 г. 22:02
Пито написал:Итак, текущий статус:
1. F1 DMA ON - ошибка в F1 DMA найдена и исправлена,
2. F1 Нет DMA - нуждается в отладке/исправлении Даниэля?
3. F4 DMA в порядке (?),
4. F4 Нет DMA - нуждается в отладении/исправлении Даниэля?
Это правильно?

Даниэфф
Пн, 8 мая 2017 г. 5:05 утра
victor_pv написал:victor_pv написал: ОБНОВЛЯТЬ:
Похоже, что я наконец люблю проблему. DMA CH .Регистр CCR не принимал значение, потому что канал DMA все еще был включен.
Я думал, что канал сам по себе будет отключенным состоянием, когда трансфер будет завершена, но это не так, и, насколько он включен, CCR не будет изменена в бит MINC. Если я сначала очистите бит CCREN в CCR, то это примет изменения.Не уверен, что работает ли он в F4, потому что HAL позаботится о отключении канала при вызове DMA_INIT, или потому что периферийное устройство вносит изменения, даже если включен, придется проверить больше об этом.
Каждая другая серия, которую я проверил, имеет эти 2 строки в HAL_DMA_INIT, чтобы отключить канал, прежде чем вносить изменения в CCR, кроме F1 HAL: /* Disable the peripheral */ __HAL_DMA_DISABLE(hdma);

Пито
Пн, 8 мая 2017 г. 9:49
При компиляции для F407 я получаюC:\Users\pito\MyCode\Arduino\hardware\Arduino_STM32SerBuff\STM32DE\libraries\SPI\src\SPI.cpp:234:25: error: 'struct DMA_Stream_TypeDef' has no member named 'CCR' hdma_spi_tx.Instance->CCR &= ~DMA_CCR_EN;

victor_pv
Пн, 8 мая 2017 г. 13:29
Пито написал:При компиляции для F407 я получаюC:\Users\pito\MyCode\Arduino\hardware\Arduino_STM32SerBuff\STM32DE\libraries\SPI\src\SPI.cpp:234:25: error: 'struct DMA_Stream_TypeDef' has no member named 'CCR' hdma_spi_tx.Instance->CCR &= ~DMA_CCR_EN;

Пито
Пн, 8 мая 2017 г. 15:08
Я прокомментировал материал и собрал для F4, попробовал на 42 МГц, но мой Samsung отказался сотрудничать. Может быть, карта мертва после всех экспериментов.. Вы сделали какие -либо изменения с частью F4, которые могут повлиять на максимальную скорость?
Я еще не пробовал с f1 no dma, я должен покупать новые карты завтра :)

victor_pv
Пн, 8 мая 2017 г., 17:26
Пито написал:Я прокомментировал материал и собрал для F4, попробовал на 42 МГц, но мой Samsung отказался сотрудничать. Может быть, карта мертва после всех экспериментов.. Вы сделали какие -либо изменения с частью F4, которые могут повлиять на максимальную скорость?
Я еще не пробовал с f1 no dma, я должен покупать новые карты завтра :)

victor_pv
Вторник 09 мая 2017 г. 4:13
Я проводил некоторые тесты по сравнению с Libmaple, и 512bytes Buffer и 16 КБ буфер. Скорости очень похожи.
При температуре 16 КБ буфера Libmaple, кажется, имеет небольшое преимущество в чтениях, и это ядро, похоже, имеет его в записи, но ничего действительно значимого.
Также использование вспышки и оперативной памяти очень похожа, с меньшей вспышкой, используемой в Libmaple и меньшей оперативной памяти, используемой в этом ядре.

Это все с той же SD -картой класса 6.
Использование памяти: libmaple: section size addr .text 28048 134217728 .ARM.exidx 8 134245776 .data 2632 536870912 .rodata 3056 134248416 .bss 18952 536873544

Стивестронг
Вторник 09 мая 2017 г. 5:12 утра
Виктор, я предполагаю, что этот тест был проведен для F4, верно? В противном случае барана (.данные и .BSS) преодолел предел 20K чипа F1.
И вы использовали «стандартный» SDFAT LIB, а не SDFATБЫВШИЙ, верно? Можете ли вы также проверить с бывшей версией?

Кстати, соотношение флэш/ОЗУ для Libmaple F1/F4 может быть улучшено, если вы поместите PIN_MAP в Flash, как я сделал это в своей черной ветке F4.

AG123
Вторник 09 мая 2017 г. 7:47 утра
Пито написал:Я прокомментировал материал и собрал для F4, попробовал на 42 МГц, но мой Samsung отказался сотрудничать. Может быть, карта мертва после всех экспериментов.. Вы сделали какие -либо изменения с частью F4, которые могут повлиять на максимальную скорость?
Я еще не пробовал с f1 no dma, я должен покупать новые карты завтра :)

Пито
Вторник 09 мая 2017 г. 8:23 утра
Рекомендуется форматировать SDCARD с «форматиром SD -карты» -
https: // www.SDCARD.org/загрузки/formatter_4/
Вместо этого форматировать их с помощью форматеров «Стандартная ОС»..

AG123
Вторник 09 мая 2017 г. 9:05 утра
ОТ: Строго говоря, если мы представляем SD -карту в качестве USB -массового хранилища для хоста, эта приличная форма SD -карта S/W может справиться с ней, к сожалению, это будет еще один проект, следовательно, самый быстрый способ на данный момент на данный момент просто получить 1 из этих ключей & запустить S/W

& Для авантюрных может быть возможно скорбят его в Linux
https: // форум.XDA-разработчики.com/showth ... п?T = 502095

Некоторые другие забавные вещи о SD -карте, SD -карты - MCUS
https: // www.Bunniestudios.com/blog/?P = 3554 Суть заключается в том, что механизм загрузки и обновления прошивки является практически обязательным, особенно для сторонних контроллеров. Конечные пользователи редко подвергаются воздействию этого процесса, поскольку все это происходит на фабрике, но это не’t не сделайте механизм менее реальным. В моих исследованиях на рынках электроники в Китае я’Видел, что хранители магазинов сжигают прошивку на картах, которые “расширять” Емкость карты - другими словами, они загружают прошивку, которая сообщает, что емкость карты намного больше, чем фактическое доступное хранилище. Тот факт, что это возможно в точке продажи, означает, что, скорее всего, механизм обновления не защищен.

В нашем выступлении по адресу 30C3 мы сообщаем о наших выводах, изучающих конкретный бренд микроконтроллера, а именно, Appotech и его предложения AX211 и AX215. Мы обнаруживаем просто “поступить” последовательность, передаваемая по командам, задержанным производителем (а именно, cmd63, за которым следует ‘А’,’П’,’П’,’О’) Это бросает контроллер в режим загрузки прошивки. На этом этапе карта примет следующие 512 байтов и запустить ее в качестве кода.
http: // s2.Q4CDN.com/000096926/files/doc ... Энтер.PDF 11.3. CSD Регистр
Специфичный для карты данные предоставляет информацию о доступе к содержимому карт.Формат данных, тип коррекции ошибок, максимальное время доступа к данным, можно ли использовать регистр DSR и т. Д.

C_size
Это поле расширено до 22 бит и может указывать до 2 т байта (оно такое же, как максимальное пространство памяти, указанное 32-разрядным блок-адресом.)
Этот параметр используется для вычисления емкости области пользовательских данных на карте памяти SD (не включающая защищенную область). Емкость области пользовательских данных рассчитывается из C_SIZE следующим образом емкость памяти = (C_SIZE+1) * 512K BYTE. В качестве максимальной емкости спецификации физического слоя версии 2.00 составляет 32 ГБ, верхние 6 бит этого поля должны быть установлены на 0.
C_SIZE, кажется, подразумевает, что супер секретная «защищенная зона» - это * скрытое разделение * I.эн. Не видно даже с помощью обычного доступа к оборудованию регистрации.
Если это правда, мы могли бы просто просто форматировать * эту карту (с любыми инструментами) и попробуйте еще раз, так как она не затронет эту «защищенную область» в любом случае
:ржу не могу:

Не форматируйте SD -карты с утилитами ОС - на форуме Arduino:
https: // форум.Ардуино.CC/INDEX.PHP?Тема = 228201.0

michael_l
Вторник 09 мая 2017 г. 10:32 утра
Можно ли создать тестовую программу для одной платы, используя SPI1 (MASTER) и SPI2 (SLAVE), чтобы проверить функциональность SPI и DMA. Тестовые примеры могут быть просто отправлять байты и читать их из SPI2.

Даниэфф
Вторник 09 мая 2017 г. 10:45
michael_l написал:Можно ли создать тестовую программу для одной платы, используя SPI1 (MASTER) и SPI2 (SLAVE), чтобы проверить функциональность SPI и DMA. Тестовые примеры могут быть просто отправлять байты и читать их из SPI2.

AG123
Вторник 09 мая 2017 г. 10:49
Я не слишком уверен, что довольно «веселый» способ проверить его, чтобы подключить мисо с Моси, если я правильно понимаю SPI, SPI.Передача (0xaa) будет отражена в качестве возврата, это, вероятно, не очень хороший тест :ржу не могу:

victor_pv
Вторник 09 мая 2017 12:38
Стивестронг написал:Виктор, я предполагаю, что этот тест был проведен для F4, верно? В противном случае барана (.данные и .BSS) преодолел предел 20K чипа F1.
И вы использовали «стандартный» SDFAT LIB, а не SDFATБЫВШИЙ, верно? Можете ли вы также проверить с бывшей версией?

Кстати, соотношение флэш/ОЗУ для Libmaple F1/F4 может быть улучшено, если вы поместите PIN_MAP в Flash, как я сделал это в своей черной ветке F4.

Стивестронг
Вторник 09 мая 2017 12:43
victor_pv написал:На ядре Libmaple для F1 мы уже размещаем PIN_MAP во Flash.

michael_l
Вторник 09 мая 2017 12:45
Даниэфф написал:michael_l написал:Можно ли создать тестовую программу для одной платы, используя SPI1 (MASTER) и SPI2 (SLAVE), чтобы проверить функциональность SPI и DMA. Тестовые примеры могут быть просто отправлять байты и читать их из SPI2.

victor_pv
Вторник 09 мая 2017 г. 13:09
Стивестронг написал:victor_pv написал:На ядре Libmaple для F1 мы уже размещаем PIN_MAP во Flash.

Стивестронг
Вторник 09 мая 2017 г. 14:36
Виктор, я не могу идентифицировать соответствующий коммит, чтобы поместить PIN_MAP в Flash из списка для главной ветви: https: // github.com/rogerclarkmelbourne/ ... его/Мастер
Вы, скорее всего, используете либо "PIN_MAP_IN_FLASH", либо ветвь "PIN_MAP_IN_FLASH_TAKE_2".

Да, как вы, наверное, заметили, я не отказываюсь от ядра Libmaple, моя «первая любовь» : P
Я уже адаптировал каналы DMA от F1 к потокам для F4, это было не очень сложно, 2 часа работы.
DMA еще не работает с SPI, я должен отлаживать его. Но я уверен, что это сработает.
Тем временем я оптимизирую рутину многократного (не-DMA) для SPI, чтобы получить (в основном) непрерывные часы при чтении байтов, аналогично процедуре записи. У меня была аналогичная попытка пару месяцев назад, это не работало, но теперь я нашел способ заставить его правильно работать.
Производительность WR версии Non-DMA, что я проверил, кажется, очень близко к версии DMA Generic Core @21 МГц, согласно измерениям Пито.

victor_pv
Вторник 09 мая 2017 г. 16:58
Стивестронг написал:Виктор, я не могу идентифицировать соответствующий коммит, чтобы поместить PIN_MAP в Flash из списка для главной ветви: https: // github.com/rogerclarkmelbourne/ ... его/Мастер
Вы, скорее всего, используете либо "PIN_MAP_IN_FLASH", либо ветвь "PIN_MAP_IN_FLASH_TAKE_2".

Да, как вы, наверное, заметили, я не отказываюсь от ядра Libmaple, моя «первая любовь» : P
Я уже адаптировал каналы DMA от F1 к потокам для F4, это было не очень сложно, 2 часа работы.
DMA еще не работает с SPI, я должен отлаживать его. Но я уверен, что это сработает.
Тем временем я оптимизирую рутину многократного (не-DMA) для SPI, чтобы получить (в основном) непрерывные часы при чтении байтов, аналогично процедуре записи. У меня была аналогичная попытка пару месяцев назад, это не работало, но теперь я нашел способ заставить его правильно работать.
Производительность WR версии Non-DMA, что я проверил, кажется, очень близко к версии DMA Generic Core @21 МГц, согласно измерениям Пито.

Стивестронг
Вторник 09 мая 2017 г., 17:24
Виктор, ваш анализ был правильным, по крайней мере, идентичен моим.
Наиболее важной частью является чтение данных RX (N) до написания TX (N+1).
И решение действительно заключается в том, чтобы отключить прерывания между письменным байтом (n) и байтом для чтения (N-1). Тогда прерывания снова могут быть включены.
Максимальное зарезервированное время составляет до 8 периодов SPI.
Вот как это выглядит в код C: void SPIClass::read(uint8 *buf, uint32 len) { if ( len == 0 ) return; spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. spi_reg_map * regs = _currentSetting->spi_d->regs; // start sequence: write byte 0 regs->DR = 0x00FF; // write the first byte // main loop while ( (--len) ) { while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. interrupts(); // let systick do its job } // read remaining last byte while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register *buf = (uint8)(regs->DR); // read and store the last received byte }

victor_pv
Вторник 09 мая 2017 г., 17:33
Стивестронг написал:Виктор, я не могу идентифицировать соответствующий коммит, чтобы поместить PIN_MAP в Flash из списка для главной ветви: https: // github.com/rogerclarkmelbourne/ ... его/Мастер
Вы, скорее всего, используете либо "PIN_MAP_IN_FLASH", либо ветвь "PIN_MAP_IN_FLASH_TAKE_2".

Стивестронг
Вторник 09 мая 2017 г., 17:38
Да, действительно, вы правы, теперь я понимаю, что вместо этого проверяю старый файл карты F4.
В любом случае, я тоже добавил ту же функцию в мою черную ветвь F4.

victor_pv
Вторник 09 мая 2017 г., 17:50
Стив, великие умы думают одинаково : D
Но я подозреваю, что этого может быть недостаточно.
Что произойдет, если между этой строкой запускается прерывание
регс->Dr = 0x00ff; // Написать первый балл
и
noEverseRrupts (); // go по атомному уровню - избегайте прерываний, чтобы наверняка получить ранее полученные данные

ISR будет вызван, подсчитайте 13 циклов мин, первый байт полностью сдвинут, вход байта переходит к доктору. Затем ISR возвращается, прерывания отключено, вы пишете новый байт DR, который начинает быстро перемещаться с тех пор, как предыдущий завершен (я думаю, что для перехода от DR FIFO требуется 1 цикл в регистр SPI Shift), вам нужно выполнить Все это до того, как он завершит, смещается с этим вторым байтом:
пока ( !(Регс->Старший & Spi_sr_rxne)); // подождать, пока данные не доступны в реестре DR
*buf ++ = (uint8) (regs->DR);

Если эти 2 строки не могут завершить за 8 циклов, мы потеряли байт. (Но не скорее будет ближе к 16 циклам максимум, так как SPI работает на 36 МГц макс?).
Если это 16 циклов, то может быть достаточно, если я ошибаюсь, и это 8, то вам может потребоваться проверить сгенерированный код, чтобы убедиться, что он не сдает слишком много инструкций, и это может быть даже вне нашего контроля Если люди меняют флаги оптимизации...

Кстати, я говорю о циклах процессоров, а не о циклах SPI.

РЕДАКТИРОВАТЬ: Я вижу, вы говорили 8 циклов SPI, поэтому мы говорим в то же время на максимальной скорости. 8 SPI или 16 циклов процессора в F1. С этим я не вижу проблем, если компилятор не сделает что -то сумасшедшее с этими двумя линиями.
F1 должен извлечь выгоду из тех же изменений, что был ваш тест выше в F1 или F4?
В трансферной функции вы сможете сделать то же самое, чтобы оптимизировать скорость, если мы отправляем более 1 байта. Вы тестировали оптимизацию этого?

Стивестронг
Вторник 09 мая 2017 г. 18:02
Виктор, у меня была такая же беспокойство.
Но здесь я предположил, что процессор способен выполнить эти пару инструкций, так как часы процессора всегда равен кратным часами SPI.
Я исследую количество необходимых инструкций с отладчиком, скоро вернусь к этому.

victor_pv
Вторник 09 мая 2017 г. 18:13
Стивестронг написал:Виктор, у меня была такая же беспокойство.
Но здесь я предположил, что процессор способен выполнить эти пару инструкций, так как часы процессора всегда равен кратным часами SPI.
Я исследую количество необходимых инструкций с отладчиком, скоро вернусь к этому.

Пито
Вторник 09 мая 2017 г. 18:16
Вы также можете выполнить 16 -битные передачи с помощью SPI (не уверен с 32 -битным, PIC32MX может сделать).
Кстати, лучший чек на SPI с SDFAT будет под Freertos :)

Стивестронг
Вторник 09 мая 2017 г. 18:52
Это код сборки новой функции чтения блока. SPIClass::read(unsigned char*, unsigned int): 080068be: 0x000030b5 push {r4, r5, lr} 336 if ( len == 0 ) return; 080068c0: 0x0000f2b1 cbz r2, 0x8006900 337 spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. 080068c2: 0x0000036e ldr r3, [r0, #96] ; 0x60 080068c4: 0x0000db68 ldr r3, [r3, #12] 080068c6: 0x00001b68 ldr r3, [r3, #0] 080068c8: 0x0000d868 ldr r0, [r3, #12] 341 regs->DR = 0x00FF; // write the first byte 080068ca: 0x0000ff20 movs r0, #255 ; 0xff 080068cc: 0x0000d860 str r0, [r3, #12] 080068ce: 0x00008c18 adds r4, r1, r2 080068d0: 0x0000481c adds r0, r1, #1 343 while ( (--len) ) { 080068d2: 0x0000a042 cmp r0, r4 080068d4: 0x00000ed0 beq.n 0x80068f4 344 while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag 080068d6: 0x00009d68 ldr r5, [r3, #8] 080068d8: 0x0000ad07 lsls r5, r5, #30 080068da: 0x0000fcd5 bpl.n 0x80068d6 080068dc: 0x000072b6 cpsid i 346 regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. 080068de: 0x0000ff25 movs r5, #255 ; 0xff 080068e0: 0x0000dd60 str r5, [r3, #12] 347 while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register 080068e2: 0x00009d68 ldr r5, [r3, #8] 080068e4: 0x0000ed07 lsls r5, r5, #31 080068e6: 0x0000fcd5 bpl.n 0x80068e2 348 *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. 080068e8: 0x0000dd68 ldr r5, [r3, #12] 080068ea: 0x00f8015c strb.w r5, [r0, #-1] 080068ee: 0x000062b6 cpsie i 080068f0: 0x00000130 adds r0, #1 080068f2: 0x0000eee7 b.n 0x80068d2 080068f4: 0x0000013a subs r2, #1 352 while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register 080068f6: 0x00009868 ldr r0, [r3, #8] 080068f8: 0x0000c007 lsls r0, r0, #31 080068fa: 0x0000fcd5 bpl.n 0x80068f6 353 *buf++ = (uint8)(regs->DR); // read and store the received byte 080068fc: 0x0000db68 ldr r3, [r3, #12] 080068fe: 0x00008b54 strb r3, [r1, r2] 08006900: 0x000030bd pop {r4, r5, pc}

victor_pv
Вторник 09 мая 2017 г., 19:48
Стивестронг написал:Это код сборки новой функции чтения блока. SPIClass::read(unsigned char*, unsigned int): 080068be: 0x000030b5 push {r4, r5, lr} 336 if ( len == 0 ) return; 080068c0: 0x0000f2b1 cbz r2, 0x8006900 337 spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. 080068c2: 0x0000036e ldr r3, [r0, #96] ; 0x60 080068c4: 0x0000db68 ldr r3, [r3, #12] 080068c6: 0x00001b68 ldr r3, [r3, #0] 080068c8: 0x0000d868 ldr r0, [r3, #12] 341 regs->DR = 0x00FF; // write the first byte 080068ca: 0x0000ff20 movs r0, #255 ; 0xff 080068cc: 0x0000d860 str r0, [r3, #12] 080068ce: 0x00008c18 adds r4, r1, r2 080068d0: 0x0000481c adds r0, r1, #1 343 while ( (--len) ) { 080068d2: 0x0000a042 cmp r0, r4 080068d4: 0x00000ed0 beq.n 0x80068f4 344 while( !(regs->SR & SPI_SR_TXE) ); // wait for TXE flag 080068d6: 0x00009d68 ldr r5, [r3, #8] 080068d8: 0x0000ad07 lsls r5, r5, #30 080068da: 0x0000fcd5 bpl.n 0x80068d6 080068dc: 0x000072b6 cpsid i 346 regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. 080068de: 0x0000ff25 movs r5, #255 ; 0xff 080068e0: 0x0000dd60 str r5, [r3, #12] 347 while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the DR register 080068e2: 0x00009d68 ldr r5, [r3, #8] 080068e4: 0x0000ed07 lsls r5, r5, #31 080068e6: 0x0000fcd5 bpl.n 0x80068e2 348 *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. 080068e8: 0x0000dd68 ldr r5, [r3, #12] 080068ea: 0x00f8015c strb.w r5, [r0, #-1] 080068ee: 0x000062b6 cpsie i 080068f0: 0x00000130 adds r0, #1 080068f2: 0x0000eee7 b.n 0x80068d2 080068f4: 0x0000013a subs r2, #1 352 while ( !(regs->SR & SPI_SR_RXNE) ); // wait till data is available in the Rx register 080068f6: 0x00009868 ldr r0, [r3, #8] 080068f8: 0x0000c007 lsls r0, r0, #31 080068fa: 0x0000fcd5 bpl.n 0x80068f6 353 *buf++ = (uint8)(regs->DR); // read and store the received byte 080068fc: 0x0000db68 ldr r3, [r3, #12] 080068fe: 0x00008b54 strb r3, [r1, r2] 08006900: 0x000030bd pop {r4, r5, pc}

AG123
Вторник 09 мая 2017 г. 8:44 вечера
Вау, эти вещи довольно сложны, в то время как я пытаюсь выяснить их на часовых диаграммах в RM, но я выясню 1 маленькую вещь, поскольку прерывания отключены, ожидая следующего входящего байта, как только это прибудет чтение, которое включает прерывания , Проверьте доступность записи, ОК, чтобы написать, отключить прерывания, написать байт, подождать, пока мы снова получаем байты. Самое забавное, казалось, что вряд ли будет шанс, что прерывание произойдет, пока записывает, подождите, читает петля

Я предполагаю, что невозможно иметь торт & Ешьте это, но это показывает, что вмешается с обнаженным металлом, нелегко с большим количеством компромиссов, E.глин. ЦП занят, клавишные, USB -серийные поднусания не будут посещать, пока это не будет сделано :ржу не могу:

В любом случае 4 МБ (32 Мбит/ с) за секунды отлично подходят для передачи SPI на одном выводе, многозадачные задания все еще могут быть достигнуты на более высоком уровне, давая, скажем, каждые 4 -километровые байты, так что другие задачи имели возможность выполнять, на этих скоростях чтение/ чтение/ Напишите 4K байтов. Возьмите всего 1 мс! Ether Way на F1, он должен был бы дать на 512 байт из -за отсутствия ОЗУ : mrgreen:

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

victor_pv
Вторник 09 мая 2017 г. 9:35 вечера
AG123 написал:Вау, эти вещи довольно сложны, в то время как я пытаюсь выяснить их на часовых диаграммах в RM, но я выясню 1 маленькую вещь, поскольку прерывания отключены, ожидая следующего входящего байта, как только это прибудет чтение, которое включает прерывания , Проверьте доступность записи, ОК, чтобы написать, отключить прерывания, написать байт, подождать, пока мы снова получаем байты. Самое забавное, казалось, что вряд ли будет шанс, что прерывание произойдет, пока записывает, подождите, читает петля

Я предполагаю, что невозможно иметь торт & Ешьте это, но это показывает, что вмешается с обнаженным металлом, нелегко с большим количеством компромиссов, E.глин. ЦП занят, клавишные, USB -серийные поднусания не будут посещать, пока это не будет сделано :ржу не могу:

В любом случае 4 МБ (32 Мбит/ с) за секунды отлично подходят для передачи SPI на одном выводе, многозадачные задания все еще могут быть достигнуты на более высоком уровне, давая, скажем, каждые 4 -километровые байты, так что другие задачи имели возможность выполнять, на этих скоростях чтение/ чтение/ Напишите 4K байтов. Возьмите всего 1 мс! Ether Way на F1, он должен был бы дать на 512 байт из -за отсутствия ОЗУ : mrgreen:

victor_pv
Ср 10 мая 2017 г. 2:40
Вау, не могу поверить в ночную разницу при использовании sdfatex!!
Такая же карта класса 6 с 512 буфером получает 3 МБ/с, и использование буфера 16 КБ едва ли улучшает его, так что, похоже, это предел для этой карты.
STM32GENERIERIERE CORE, F103RFT MCU, 72 МГц, DMA, DIV/2, SDFATEX, 512 байт буфер: FreeStack: 92664 Type is FAT32 Card size: 4.08 GB (GB = 1E9 bytes) Manufacturer ID: 0X3 OEM ID: SD Product: SD04G Version: 8.0 Serial number: 0X5700E101 Manufacturing date: 8/2008 File size 5 MB Buffer size 512 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3071.06,154124,141,164 3391.91,24856,141,148 3056.04,153749,141,165 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3054.17,1200,165,166 3054.17,1201,165,166 3054.17,1202,165,166 Done Type any character to start

AG123
Ср 10 мая 2017 г., 7:22
Это, вероятно, * намного * быстрее, чем те дешевые USB -читатели карт & Кстати, USB Полная скорость - это всего лишь 12 Мбит / с. В нашем случае на самом SPI мы делаем 24 миль на пса (3 кбит : mrgreen:

victor_pv
Ср 10 мая 2017 г. 20:56
После короткого обсуждения здесь со Стивом о том, как оптимизировать цикл переноса, чтобы сохранить FLE -SPI без потери данных, я пошел проверить, насколько оптимальным является HAL.
Помимо кучи накладных расходов, запуская передачу, остальная часть петли точно такая же, отправьте 2 байта, затем прочитайте и отправьте 1 за один, и прочитайте последний.
Но с 1 основным отличием. Он не отключает прерывания в любое время! По крайней мере, не в Hals F1 и F4.

Я думаю, что это может объяснить, что коррупция получала, когда проходила тесты без DMA. Поскольку прерывания включены и продолжаются для Systick, USB...

Стивестронг
Ср 10 мая 2017 г., 21:47
Я также думаю, что прерывание отключения/включения последовательности имеет решающее значение, в противном случае данные могут быть повреждены.

РЕДАКТИРОВАТЬ
Для сравнения, скамейка Libmaple Core SD на синей таблетках для моей карты Sandisk Ultra Cl10 (красный/серый), F103 @ 72mhz, SPI1 @ 36 МГц, с DMA: File size 5 MB Buffer size 512 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3700.73,9752,131,136 3703.47,16335,131,136 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3382.73,989,149,150 3385.02,847,149,150

Даниэфф
Чт 11 мая 2017 г., 6:35 утра
Я смотрел на API SPI.
Вот компиляция реализаций в различных ядрах: https: // Gist.GitHub.com/danieleff/64e51 ... 6AB1167AD7
(Текущее обсуждение форумов Arduino Dev: https: // группы.Google.com/a/bcmi-labs.в ... 12i7sb_elk )

Libmaple выглядит просто... странный?

victor_pv
Чт 11 мая 2017 г. 13:35
Даниэфф написал:Я смотрел на API SPI.
Вот компиляция реализаций в различных ядрах: https: // Gist.GitHub.com/danieleff/64e51 ... 6AB1167AD7
(Текущее обсуждение форумов Arduino Dev: https: // группы.Google.com/a/bcmi-labs.в ... 12i7sb_elk )

Libmaple выглядит просто... странный?

AG123
Чт 11 мая 2017 г. 14:19
о, я невежественно просто использую SPI.Передача (0xAA) и SPI.Transfer16 (0xaaaa), они, казалось, просто работали «из коробки» : mrgreen:
не понял, что есть довольно много SPI «История» с различными интерфейсами

Пито
Сб 13 мая 2017 г. 10:17
С последним SPI Victor's STM32GENERIER, я не могу получить более 800 КБ/с с любыми настройками скорости на скамейке с F407..

victor_pv
Сб 13 мая 2017 г. 14:26
Пито написал:С последним SPI Victor's STM32GENERIER, я не могу получить более 800 КБ/с с любыми настройками скорости на скамейке с F407..

Пито
Сб 13 мая 2017 г. 14:39
Да, я сделал все возможное сегодня с F407, но макс был ~ 800 КБ/с для скоростей SPI с 10-51 на скамейке, с 3 картами, SPI, SDFATEX, DMA :?
Я дважды проверяю с той же SPI (последний) с F1 сейчас..
Blue F103Zet, New Samsung Evo 16 ГБ CL10, 36 МГц SPI Speed, Sdfatex, DMA: File size 5 MB Buffer size 512 bytes Starting write test, please wait. write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3431.49,16295,140,146 3472.00,8603,140,145 3438.57,20800,140,147 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3176.42,1878,158,159 3180.46,1414,158,159 3180.46,1417,158,159

AG123
Сб 13 мая 2017 г. 15:39
Может быть, агрессивный * no_Enterrupts () * предотвратил коррупцию данных, но оставляет большую очередь от SD FAT, ожидая, чтобы «выполнить свою работу» :ржу не могу:

victor_pv
Сб 13 мая 2017 г. 18:29
Мы не отключаем прерывания в версии STM322ERIER, только на ядрах Libmaple, и только Стив реализовал ее до сих пор, пока еще не в ядре, так что это не будет связано.

Я несколько раз поймал его с отладчиком, ожидающим ожидания TXE на съемочную площадку, и останусь на 0. У меня до сих пор нет объяснения этого. И я видел это в F1 только настолько, насколько я помню.
До тех пор, пока включено периферийное устройство SPI, после нескольких циклов TXE должно стать 1, когда текущие данные полностью сдвинуты, но несколько раз это не происходит. Это может быть связано с тем, что отладчик подключился и застрял вокруг данных и регистров, не уверен, но просто не может понять, почему это произойдет.

Кроме этого, 20 -сантиметровые провода могут быть только на пределе его работы или нет, вы получаете немного больше шума в линии при 42 МГц, а порт SPI или SDCARD пропускает края...
Я сделал несколько косметических исправлений, но ничего серьезного, и просто подтолкнул эти обновления в мою репо. Я не отправил новый пиар в Даниэль, пока мы не подтвердим, что сама библиотека будет надежна. Я должен подключить гнездо SDCARD на плату F4 и провести несколько тестов.

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

Пито
Сб 13 мая 2017 г., 19:14
У меня есть Jlink, постоянно подключенная к F407 - я делаю вспышку через Jlink.. Может, это как -то вмешалось сегодня утром.. Я тоже должен сократить провода..
В любом случае, нам нужно больше тестеров для SPI и SDIO, чтобы участвовать :)

Даниэфф
Солнце 14 мая 2017 г., 4:24
victor_pv написал:Даниэфф написал:Я смотрел на API SPI.
Вот компиляция реализаций в различных ядрах: https: // Gist.GitHub.com/danieleff/64e51 ... 6AB1167AD7
(Текущее обсуждение форумов Arduino Dev: https: // группы.Google.com/a/bcmi-labs.в ... 12i7sb_elk )

Libmaple выглядит просто... странный?

Стивестронг
Солнце 14 мая 2017 г. 8:44
Даниэфф написал:Вуаля, теперь вы можете отправлять те же времена байта (заполните экран ILI9341).

Даниэфф
Солнце 14 мая 2017 г. 10:50 утра
Да, я включил его на страницу сравнения. В основном я говорил о том, что API Thomas L4 SPI может быть расширен для него, просто позвонив с NULL, NULL, чтобы отправить тот же байт, без введения новых методов. Что не так, потому что ему нужны новые методы, поэтому давайте оставим это на данный момент.

victor_pv
Солнце 14 мая 2017 г. 16:18
Даниэфф написал:Да, я включил его на страницу сравнения. В основном я говорил о том, что API Thomas L4 SPI может быть расширен для него, просто позвонив с NULL, NULL, чтобы отправить тот же байт, без введения новых методов. Что не так, потому что ему нужны новые методы, поэтому давайте оставим это на данный момент.

Даниэфф
Пт 16 июня 2017 г., 4:58
Добавлена ​​передача [16] (out, in, count [, обратный вызов]). Out может быть Uint [8 | 16] _t / *Buffer / null; В может быть *буфер / нулевой; обратный вызов не может быть ничего/null/funcptr. Это должно покрывать все варианты использования.

Добавил пример видео+аудиоплеер. Играет со скоростью 27 кадров в секунду на F407, ILI9341, SPI+I2S Nonblocking DMA, SDIO, блокирующее DMA. Пример вывода без звука, потому что мой дерьмовый телефон не может записать звук: http: // danieleff.com/stm32/test/output_no_sound.MP4

(Виктор, я интегрировал большинство ваших изменений, но DMA теперь централизован, пожалуйста, используйте Master для дальнейшего развития)

Пито
Пт 16 июня 2017 г., 6:40
Существует библиотека под названием ADAFRIT_ILI9341_STM_SPI2, я использовал для использования с MM/BP.
Эта библиотека была изменена для поддержки DMA в Maple Mini Victor в 2015 году.
Будет ли эта LIB работать с общим? (Еще не тестируется).

[STM32Generic] SDIO DMA