Новая библиотека SDFAT (с DMA и без него)

victor_pv
Пн 27 апреля 2015 г., 19:11
*** Последнее обновление 04/10/2017 ***
Кодекс в официальном репо от Билла Греймана в настоящее время поддерживает ядро ​​либмапл (STM32Duino), интегрированное в него. Так что больше не нужно скачать его из моего репо.

Официальное хранилище библиотеки SD-FAT:
https: // github.com/greiman/sdfat

============================================================================= =============

Обновить это предупреждение. Должно быть решено в последнем репо. Если у вас есть проблемы с использованием PIN 7 для CS, убедитесь, что вы синхронизированы с Master Roger STM32Duino Repo.
ПРЕДУПРЕЖДЕНИЕ!!
Я просто тестировал SD -карту с одним из эскизов, и заметил, что вы не можете использовать PIN 7 в Maple Mini (Native SS PIN SS STM32F103 для SPI1) для CS. Я не смотрел на то, как библиотека управляет CS и как этот PIN -код настроен в библиотеке SPI, но я думаю, что в режиме PIN есть конфликт. Итак, работа на данный момент состоит в том, чтобы использовать другой пин для CS.
- Обновлено 04/04/2015-

- Новое обновление на 07.07.2015 - небольшие изменения кода в библиотеку и специально в библиотеку SPI, которая скоро должна перейти в Master Repo Роджера.

Поэтому, как я писал ранее на форуме, я изменил последнюю библиотеку SDFAT от Greiman.
Я отправил ему изменения для предыдущей версии, но у меня были проблемы. Теперь все проблемы, кажется, исправлены в моей последней версии.
Он доступен здесь:
https: // github.com/Victorpv/sdfat

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

DMA был бы выгоден для больших переводов, но вообще не поможет, и может даже иметь штраф, если вы просто читаете несколько байтов в журнале и тому подобное. Теперь, если вы передаете изображения или файлы MP3 из SDCARD, DMA может значительно повысить производительность, все, что связано с большими блоками одновременно.

DMA может быть включен или отключить редактирование SDSPISTM32F1.CPP, есть одна линия #Define:
/** Используйте STM32 DMAC, если ненулевой*/
#define use_stm32f1_dmac 1

Прокомментируйте, что строка или изменение 1 на 0, и передачи DMA не будут использоваться.

Рекомендации для скорости:
Используйте режим DMA.
Установите больший буфер, в идеале 4 кб

Скорость чтения без DMA, буфера 4 КБ:
Читать скорость и задержка speed,max,min,avg KB/Sec,usec,usec,usec 676.29,8189,5927,6056 676.38,7467,5927,6054 676.38,7468,5927,6054 676.38,7469,5926,6054 676.38,7472,5926,6054

Мадиас
Пн 27 апреля 2015 г. 20:16
Дорогой Виктор,
Имеет ли значение, если вы опубликуете несколько примеров, написанных вами? Нам было бы легче...
Спасибо!

victor_pv
Вт 28 апреля 2015 г., 2:35
Мадиас, я не написал ни одного примера для этой библиотеки, в основном потому, что я не использовал для нее в данный момент.
Я перенес это в основном, чтобы проверить разъем SDCARD в задней части моего дисплея, на случай, если мне это понадобится в будущем.

Из примеров, включенных в библиотеку, которую я протестировал:
Readwritesdfat
Лавка
Sdinfo
Printbenchmark

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

Skyng22003
Чт 30 апреля 2015 г., 19:10
Привет, Виктор,

Я обновил библиотеку SPI (с DMA OFF) до той, которую вы разместили, и новую библиотеку SDFAT, которую вы разместили, не может обнаружить мою карту?

Говорит, что инициализация SD -карты не удалась с примером быстрого начала, хотя я пробовал разные значения PIN -контактов CS.

Тем не менее, он отлично работает с библиотекой SD -карт, связанной с Arduino IDE, я вижу текстовый файл, записанный на карту, любые идеи?

Использование STM32F103 RET6

Спасибо,
Небо

Мадиас
Чт 30 апреля 2015 г., 19:32
Skyng/Victor: Div Spi Clock Div ​​все еще в 128? Это была моя проблема с библиотекой, и ничего не сработало.

Skyng22003
Чт 30 апреля 2015 г., 19:44
Мадиас: Это в библиотеке SPI или в библиотеке SDFAT?

victor_pv
Пт, 01 мая 2015 г. 15:35
Skyng я думал, что исправил проблемы с ценностями Div в последней версии в моем репо, но, возможно, с этим все еще есть проблема.
В примере быстрого начала скорость SPI установлена ​​на этой линии:
const uint8_t spispeed = spi_half_speed;

Изменить это на:
const uint8_t spispeed = spi_clock_div4;

Убедитесь, что вы установите SPI на Div2 Div8, они работают довольно хорошо для большинства SDCARD.
У некоторых более медленных карт могут возникнуть проблемы с самой быстрой скоростью, но Div4 Pr Div8 должен для большинства.

Дайте мне знать, если у вас все еще есть проблемы.

Фоно
Пт, 8 мая 2015 г., 16:21
Я протестировал библиотеку из репозитория, что ссылка находится в более раннем сообщении.
Я потерпел неудачу в SPI.Н отсутствовал.
Я включил SPI, а затем я получаю следующую ошибку компиляции:

В файле, включенном из Sketch_may08a.Ино: 11: 0:
C: \ users \ jean-marc \ documents \ arduino \ библиотеки \ sdfat/sdvolume.H: 25: 2: ошибка: #error sdvolume деперирован. Удалить эту линию, чтобы продолжить использование этого класса.
#Error Sdvolume деперирован. Удалить эту линию, чтобы продолжить использование этого класса.

Что я должен делать?

Mrburnette
Сб 09 мая 2015 г., 17:57
Фоно написал:Я протестировал библиотеку из репозитория, что ссылка находится в более раннем сообщении.
Я потерпел неудачу в SPI.Н отсутствовал.
Я включил SPI, а затем я получаю следующую ошибку компиляции:

В файле, включенном из Sketch_may08a.Ино: 11: 0:
C: \ users \ jean-marc \ documents \ arduino \ библиотеки \ sdfat/sdvolume.H: 25: 2: ошибка: #error sdvolume деперирован. Удалить эту линию, чтобы продолжить использование этого класса.
#Error Sdvolume деперирован. Удалить эту линию, чтобы продолжить использование этого класса.

Что я должен делать?

Фоно
Пн 11 мая 2015 г., 21:01
ОК, но это пришло по умолчанию. Как я могу сделать по умолчанию компилятор ищите библиотеки в разделе оборудования?

Mrburnette
Вторник 12 мая 2015 г. 11:34
Фоно написал:ОК, но это пришло по умолчанию. Как я могу сделать по умолчанию компилятор ищите библиотеки в разделе оборудования?

Мадиас
Чт 25 июня 2015 г., 20:57
Любой, кому повезло в этой библиотеке (Maple Mini)?
Я дал ему еще одну попытку, и нет шансов заставить его работать, равные, какие настройки я использую (другой PIN -код SS (1,9,8, а не 7..), разные скорости SPI, DMA включение/выключение.....) Я всегда попадал в самый быстрый пример SD initialization failed. Do not reformat the card! Is the card correctly inserted? Is chipSelect set to the correct value? Does another SPI device need to be disabled? Is there a wiring/soldering problem? errorCode: 0x1, errorData: 0x0

Rogerclark
Чт 25 июня 2015 г. 9:15 вечера
Матиас

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

Я думаю, что Виктор отправил запрос на привлечение автору, который работал только с измененным кодом, который есть Виктор на своей машине.

Я попытался загрузить версию победителей с GitHub, но это тоже не сработало ;-(

Итак, я сейчас использую старую либера. Старая LIB кажется в основном в порядке, но я иногда получаю сбой, пытаясь воспроизводить файлы MP3 от SD до VS1053.
Но у меня не было времени, чтобы найти причину, потому что иногда она может бежать в течение многих часов без проблем

victor_pv
Чт 25 июня 2015 г., 21:33
Rogerclark написал:Матиас

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

Я думаю, что Виктор отправил запрос на привлечение автору, который работал только с измененным кодом, который есть Виктор на своей машине.

Я попытался загрузить версию победителей с GitHub, но это тоже не сработало ;-(

Итак, я сейчас использую старую либера. Старая LIB кажется в основном в порядке, но я иногда получаю сбой, пытаясь воспроизводить файлы MP3 от SD до VS1053.
Но у меня не было времени, чтобы найти причину, потому что иногда она может бежать в течение многих часов без проблем

Rogerclark
Чт 25 июня 2015 г., 21:44
Привет, Виктор,

Я снова буду клонировать ваше репо и посмотрю, работает ли это.

Это могло бы быть проблемой PA4 SS, но я не могу помнить, как это было некоторое время назад (но я думал, что одна из моих испытательных буровых установок использовала PB5 для SS)

Мадиас
Чт 25 июня 2015 г., 21:55
Виктор: Я помню, я заработал твою библиотеку несколько месяцев назад... Может быть, LIB не любит каждый адаптер SD-карты и/или SD-карта. Я собираюсь искать все свои модули и карты и попробую комбинации...

Мадиас
Чт 25 июня 2015 г. 22:09
Бинго!
Работающий:
Старый адаптер LC-Soft (большой) работает http: // img.dxcdn.com/productimages/sku_142121_1.JPG

Не работает (но с SD-библиотекой)
Micro One для UNO (с чипом Multi-Converter 5V) http: // img.Алибаба.com/img/pb/659/697/9 ... 59_679.JPG

SD -карты протестированы: Transcend 4GB MicroSD: не работает, 2 ГБ Micro SD (без бренда) Работа. Может быть, проблема форматирования?

Редактировать С успешной комбинацией (мягкий адаптер LC + 2 ГБ) пример QuickStart работает даже с SPI_CLOCK_DIV2 и DMA включенным.
Скорость скамьи похожа на черепаху: 88 кб/с даже с включенной DMA (больше вещей, чтобы попробовать....)

Rogerclark
Чт 25 июня 2015 г., 22:36
Матиас,

Какую репо вы используете для SDFAT ? Победители один ?

Martinayotte
Пт 26 июня 2015 г., 2:29
Старый адаптер LC-Soft (большой) работает http: // img.dxcdn.com/productimages/sku_142121_1.JPG Это адаптер, который я тоже использую, но со старым SD. (Я не отступил SDFAT от Victor с тех пор, как я попробовал его на NetDuino2plus, он не работал в то время несколько недель назад)

На Maplemini LC-Soft хорошо работает с Plain Spi, но я изо всех сил пытался запустить его со SPI (2). Желаю SPI.SelectDev () скоро станет удобным ... ;)

Мадиас
Пт 26 июня 2015 г., 6:34
Какую репо вы используете для SDFAT ? Победители один ? Да, прямой из учетной записи Victor's GitHub.

Rogerclark
Пт 26 июня 2015 г., 6:43
Спасибо

Я попробую еще раз в эти выходные

Тиаго
Sun 28 июня 2015 г., 8:17 вечера
Чтобы включить DMA в мини -клене генерирует эту ошибку:
/home//Arduino/libraries/SdFat/SdSpiSTM32F1.cpp: In member function 'uint8_t SdSpi::receive(uint8_t*, size_t)': /home//Arduino/libraries/SdFat/SdSpiSTM32F1.cpp:172:7: error: 'class SPIClass' has no member named 'dmaTransfer' SPI.dmaTransfer(0, const_cast(buf), n); ^ /home//Arduino/libraries/SdFat/SdSpiSTM32F1.cpp: In member function 'void SdSpi::send(const uint8_t*, size_t)': /home//Arduino/libraries/SdFat/SdSpiSTM32F1.cpp:208:7: error: 'class SPIClass' has no member named 'dmaSend' SPI.dmaSend(const_cast(buf), n); ^

Мадиас
Пн 29 июня 2015 г. 9:06 утра
Ваше репо не в курсе.
Смотрите SPI.час ----> https: // github.com/rogerclarkmelbourne/ ... Матрансфер
По крайней мере, вы должны обновить библиотеку SPI, но лучше обновить все, потому что многие инновации связаны вместе.

Весь материал DMA (например, «dmatransfer») в течение нескольких недель в SPI.час/.Сам CPP, а не в отдельных библиотеках.

tj_style
Ср. 1 июля 2015 г. 13:08
Я думаю, что некоторая проблема связана с преобразователем уровня на модуле/щите SDCARD.
У меня есть тест с использованием модуля SDCARD без использования конвертера Leevel, и он работает нормально.
Но это не работает при использовании модуля SD -карты, которые имеют конвертер уровня.

Mrburnette
Чт, 02 июля 2015 12:39
tj_style написал:Я думаю, что некоторая проблема связана с преобразователем уровня на модуле/щите SDCARD.
У меня есть тест с использованием модуля SDCARD без использования конвертера Leevel, и он работает нормально.
Но это не работает при использовании модуля SD -карты, которые имеют конвертер уровня.

victor_pv
Чт, 2 июля 2015 г., 13:33
Mrburnette написал:tj_style написал:Я думаю, что некоторая проблема связана с преобразователем уровня на модуле/щите SDCARD.
У меня есть тест с использованием модуля SDCARD без использования конвертера Leevel, и он работает нормально.
Но это не работает при использовании модуля SD -карты, которые имеют конвертер уровня.

Mrburnette
Чт, 02 июля 2015 г., 13:51
victor_pv написал: Я не использовал дополнительный конденсатор для SDCards, но это имеет большой смысл, я начну использовать его с этого момента в любое время, когда вижу какую -либо проблему.

Ахулл
Чт, 2 июля 2015 г., 21:26
victor_pv написал: РЕДАКТИРОВАТЬ: Просто чтобы добавить это лично, я использовал слот SDCARD в задней части доски ILI9341, которая, кажется, работает в основном », а также адаптер Madias, связанный ранее: http: // img.dxcdn.com/productimages/sku_142121_1.JPG
Это отлично работает все время.

victor_pv
Чт, 2 июля 2015 г., 23:15
Я использовал их все отдельно, но никогда не пробовал все 3 одновременно.
Я также использовал экран+Touch одновременно, но никогда не сочетание 3 из них.

tj_style
Сб, 04 июля 2015 г., 22:24
Странный результат,
Я попытался использовать PIN -код CS в другой штифте.
Использование PIN 8 и 9 не работает, но когда я использую PIN 1 и OIN 2 работает
Используя пример эскиза.

Micro SD Sandisk 2GB, некоторые тесты с использованием DMA: write speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1052.47,106079,2898,3888 1071.19,19437,2900,3820 1073.50,22139,2901,3813 1068.67,33005,2902,3829 1067.76,34606,2901,3833 1063.90,36557,2902,3845 1070.51,38904,2901,3823 1070.28,42891,2899,3824 1065.94,59471,2900,3838 1061.64,44357,2900,3855 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1562.09,4049,2607,2621 1563.07,3180,2606,2619 1562.58,3183,2606,2620 1562.58,3183,2605,2619 1562.58,3183,2607,2619

victor_pv
Пт 10 июля 2015 г. 13:17
tj_style написал:Странный результат,
Я попытался использовать PIN -код CS в другой штифте.
Использование PIN 8 и 9 не работает, но когда я использую PIN 1 и OIN 2 работает

victor_pv
Солнце 26 июля 2015 г., 16:28
Быстрое обновление. Я заметил, что если я «начну» SDCARD без скорости, просто выберите чип, он сбой в несколько раз, например:
сд.begin (sd_chipselectpin);

Но если я добавлю параметр для скорости, он работает нормально:
сд.begin (sd_chipselectpin, spi_clock_div2)

Может быть, карта может быть скоростью по умолчанию, у меня нет времени, чтобы проверить ее прямо сейчас, просто хотел опубликовать ее на случай, если это поможет кому -то.

E-Dredon
Солнце 30 августа 2015 г. 9:13
Привет
Я получаю ошибку во время составления любого из экземпляров
'SPI_DMAC_TX_CH' 'не был объявлен в этой области

Я работаю с платой Bluepill STM32F103C8T6.

Я попробовал как с стабильной ветвью на GitHub, так и с бета -репозиторием.

Я быстро посмотрел на SDSPISTM31F1.CPP и я нашел определение для SPI1_DMAC_TX_CH, но не для SPI_DMAC_TX_CH

#define spi1_dmac_rx_ch dma_ch2
/** канал передачи DMAC*/
#define spi1_dmac_tx_ch dma_ch3


Можно ли это исправить ?

С уважением,

\%user%\Documents\Arduino\libraries\SdFat\src\SdSpiCard\SdSpiSTM32F1.cpp: In function 'void SPI_DMA_TX_Event()': \%user%\Documents\Arduino\libraries\SdFat\src\SdSpiCard\SdSpiSTM32F1.cpp:40:21: error: 'SPI_DMAC_TX_CH' was not declared in this scope dma_disable(DMA1, SPI_DMAC_TX_CH); ^ \%user%\Documents\Arduino\libraries\SdFat\src\SdSpiCard\SdSpiSTM32F1.cpp: In member function 'uint8_t SdSpi::receive(uint8_t*, size_t)': \%user%\Documents\Arduino\libraries\SdFat\src\SdSpiCard\SdSpiSTM32F1.cpp:148:28: error: 'SPI_DMAC_RX_CH' was not declared in this scope dmac_channel_disable(SPI_DMAC_RX_CH); ^ \%user%\Documents\Arduino\libraries\SdFat\src\SdSpiCard\SdSpiSTM32F1.cpp:149:28: error: 'SPI_DMAC_TX_CH' was not declared in this scope dmac_channel_disable(SPI_DMAC_TX_CH);

Rogerclark
Солнце 30 августа 2015 10:30 утра
Какая версия SD lib вы используете?

E-Dredon
Sun 30 августа 2015 г. 14:24
Если я не ошибаюсь, я использую официальный релиз от Greiman
https: // github.com/greiman/sdfat

С уважением,

victor_pv
Sun 30 августа 2015 г. 14:28
E-Dredon написал:Если я не ошибаюсь, я использую официальный релиз от Greiman
https: // github.com/greiman/sdfat

С уважением,

E-Dredon
Солнце 30 августа 2015 14:37
Упс... Я только что видел первый пост в то же время, когда вы ответили. Я думал, что Greiman Repo был в курсе. Спасибо за очень быстрый ответ. 2 переменные определены в вашей версии. Очевидно, теперь он хорошо компилируется. Теперь я могу сосредоточиться на том, чтобы сделать демонстрацию для дисплея ILI9341 TFT, с Picojpeg и вашей Lib. Спасибо. Я использую SPI1 для ILI9341. Нужно ли мне установить выделенный SPI (MISO/MOSI) для читателя SDCARD, или я просто использую выделенный PIN -код CS ?

victor_pv
Солнце 30 августа 2015 г., 17:32
E-Dredon написал:Упс... Я только что видел первый пост в то же время, когда вы ответили. Я думал, что Greiman Repo был в курсе. Спасибо за очень быстрый ответ. 2 переменные определены в вашей версии. Очевидно, теперь он хорошо компилируется. Теперь я могу сосредоточиться на том, чтобы сделать демонстрацию для дисплея ILI9341 TFT, с Picojpeg и вашей Lib. Спасибо. Я использую SPI1 для ILI9341. Нужно ли мне установить выделенный SPI (MISO/MOSI) для читателя SDCARD, или я просто использую выделенный PIN -код CS ?

E-Dredon
Сб 05 сентября 2015 г., 6:15 утра
Спасибо за ответ.

Сейчас у меня проблемы, чтобы заставить модуль SDReader работать. Даже я подключаю его в одиночку на любой из 3 SPI, SDFAT не найдет его. Моя плата ILI9341 поставляется с 5 -контактным разъемом для SDCARD (F_CS, SD_SCK, SD_MISO, SD_MOSI, SD_CS). Если я не ошибаюсь, F_CS следует оставить без подключения, так как у меня нет заполненной вспышки SPI U3. Я попробовал с модулем MicroSD, созданным для VCC 5 В (просто обход 3.3 регулятора напряжения) и работает. Что ж, я на данный момент приостановлюсь, так как у меня есть другие проблемы, которые нужно сначала решить с загрузчиком.

С наилучшими пожеланиями,

Бубулиндо
Ср. 16 сентября 2015 г. 10:10
Привет,

У меня есть доска Olimexino с прикрепленной SD -картой, и я обнаружил, что библиотеки SD предполагают, что есть только один периферийный характер SPI, когда на самом деле у нас есть два (на Olimexino, на SPI2, что SD -карта подключена).

Как вы думаете, это можно изменить в библиотеке?

Martinayotte
Ср. 16 сентября 2015 г. 14:46
SDFAT можно настроить в различные вкусы в библиотеках/SDFAT/SDFATCONFIG.час.
Sd_spi_configuration - это определение, которое позволяет вам выбирать, если вы полагаетесь на аппаратный или программный SPI, или даже на пользовательский.
В моем случае, для NetDuino2plus, F405, SDCARD подключен на SPI3 и работает чудесно. ;)

Бубулиндо
Пт 18 сентября 2015 г., 7:55 утра
UPS... Нашел это.

Хотя это немного неуклюже, необходимо копать в файлах библиотеки, чтобы найти, какой SPI был настроен. Поскольку PIN -контакт CS возможно для настройки, имело бы смысл иметь возможность настроить, какую периферийную поверхность SPI использовать для использования. Но... это только мое мнение.

victor_pv
Пт 18 сентября 2015 г. 11:42
Бубулиндо написал:UPS... Нашел это.

Хотя это немного неуклюже, необходимо копать в файлах библиотеки, чтобы найти, какой SPI был настроен. Поскольку PIN -контакт CS возможно для настройки, имело бы смысл иметь возможность настроить, какую периферийную поверхность SPI использовать для использования. Но... это только мое мнение.

Бубулиндо
Пт 18 сентября 2015 г., 17:13
Привет,

В моем случае мне нужно перейти на SPI2, так как у моей доски SD -карта подключена к SPI2 (я ничего не могу с этим поделать)... Учитывая, что у другого пользователя есть это на SPI3, это уже два человека, которые должны были изменить библиотеку, потому что это не «возможно» использовать SPI1.

Я помню, как тестировал библиотеку SDFAT около двух лет назад, и мы передали объект SPI, чтобы она запустила функции SD на. Это было немного более прозрачно, я думаю.

Тем не менее, спасибо. Я проверил один из примеров, и он распознал карту.

Если бы я хотел записать значения рекламы в SD, что будет моей максимальной достижимой частотой? Любые цифры с верхней части головы?

Стевех
Пт 18 сентября 2015 г., 18:21
Открытый исходный код PJRC «транзакции SPI» позволяют скоординировать обмен портом SPI среди нескольких рабов.
Это не позволяет получить устройство в реальном времени, например, всегда на телеметрическом радио с использованием SPI - потому что он должен иметь RX все время, и это может создать прерывание в любое время, а ISR использует SPI.

Для SD -карт и т. Д. Транзакции SPI в порядке

E-Dredon
Пн 28 сентября 2015 г. 10:51 утра
Добрый день все.

У меня еще не было успеха с модулем SD моего ЖК -дисплея ILI9341 и оптимизированной библиотеки SDFAT.

Чтобы убедиться, что это не проблема с оборудованием для моего ILI9341, я попробовал с Teensy 3.1.
Пол Полстоффереген потратил некоторое время на то, чтобы сделать аналогичные улучшения с Teensy 3.XX SD Библиотека.
Я могу получить чтение/запись, работающую только тогда, когда я отключаю флаг оптимизации в файле конфигурации библиотеки (флаг оптимизации не работает ни с одним из моих MicroSD (512 МБ, 2 ГБ класса 4, 8 ГБ класса 4, 16 ГБ класса 12), или он должен Будьте потому, что у модуля нет масштабируемого RAM на плате.
Вот ссылка на нашем выступлении на форуме PJRC:
https: // форум.PJRC.com/threads/29331-tf ... #post81454

Теперь с моим STM32F103C8T6 (BluePill)
Я пробовал все цифровые контакты для линии SD_CS.
Я отключил оптимизацию DMA для начальных тестов в файле конфигурации SDSPISTM32F1.CPP
#define use_stm32f1_dmac 0

Я пытался использовать SPI1 как для дисплея ILI9341, так и для SD -модуля с выделенным CS PIN -код для SD_CS.
Я попробовал последнюю библиотеку SPI с новым SPI.SetModule (2); В разделе «Настройка моего кода. В этом случае я подключил SD Miso/Mosi/SCK на SPI2 и указал SD_CS (я попробовал SS SPI2 и другие булавки, такие как 0, 1, потому что я видел, как некоторые пользователи добились успеха с Mapple Mini с этим конфигурация)
И последнее, но не менее важное: я пробовал различные настройки div_clock (2, 4, 8) без успеха тоже.
const uint8_t spispeed = spi_clock_div8;

Если я определяю вывод со схемой именования STM32F103C8 (Paxx/PBXX/PCXX и т. Д...), дисплей работает, но, если я скомпилирую эскиз для тестирования SDINFO, у меня есть другая нумерация в серийном мониторинге. Для Exemple, мой PB13 имеет PIN № 33, показанный на серийном мониторе.

Я не знаю, что еще делать сейчас...

Вот код, который я использую:
#include #include #include #include #include #include #include // CS and DC for the LCD #define LCD_DC PA1 #define LCD_CS PA4 #define LCD_RST PA0 #define SD_CS PB12 // Chip Select for SD card #define BUFFPIXELCOUNT 320 // size of the buffer in pixels #define SD_SPI_SPEED SPI_HALF_SPEED // SD card SPI speed, try SPI_FULL_SPEED const uint8_t spiSpeed = SPI_CLOCK_DIV8; SdFat sd; // set filesystem SdFile bmpFile; // set filesystem //ArduinoOutStream cout(Serial); ILI9341_due tft(LCD_CS, LCD_DC, LCD_RST); // store error strings in flash to save RAM #define error(s) sd.errorHalt_P(PSTR(s)) void setup() { Serial.begin(9600); SPI.setModule(2); tft.begin(); tft.setRotation(iliRotation270); // landscape progmemPrint(PSTR("Initializing SD card...")); if (!sd.begin(SD_CS, SD_SPI_SPEED)){ progmemPrintln(PSTR("failed!")); return; } progmemPrintln(PSTR("OK!")); }

Стивестронг
Пн 19 октября 2015 г., 20:43
Всем здравствуйте,
У меня проблема с моей SD -картой, подключенной к клону Maple Mini.
Я запускаю эскиз SDINFO в сочетании с эскизом RawWrite, и кажется, что данные не могут быть записаны на SD -карту.
Установили последние версии от Victorpv/Sdfat и от rogerclarkmelbourne/arduino_stm32 GitHub.
Я использую SPI 2 со SPI_CLOCK_DIV8.
Чтение с SD -карты работает. Карта была отформатирована с помощью SDFormatter.
Похоже на серийный журнал: SdFat version: 20150321 Assuming the SD is the only SPI device. Edit DISABLE_CHIP_SELECT to disable another device. Assuming the SD chip select pin is: 31 Edit SD_CHIP_SELECT to change the SD chip select pin. type any character to start init time: 1 ms Card type: SD2 Manufacturer ID: 2 OEM ID: TM Product: SA02G Version: 0.3 Serial number: A07C6B9C Manufacturing date: 12/2008 cardSize: 1973.42 MB (MB = 1,000,000 bytes) flashEraseSize: 128 blocks eraseSingleBlock: true OCR: 80FF8000 SD Partition Table part,boot,type,start,length 1,0,6,135,3854201 2,0,0,0,0 3,0,0,0,0 4,0,0,0,0 Volume is FAT16 blocksPerCluster: 64 clusterCount: 60214 freeClusters: 60212 freeSpace: 1973.03 MB (MB = 1,000,000 bytes) fatStartBlock: 136 fatCount: 2 blocksPerFat: 236 rootDirStart: 608 dataStartBlock: 640 Starting RawWrite... removing RAW.TXT... creating contiguous... createContiguous failed SD errorCode: 13 SD errorData: FF

Rogerclark
Пн 19 октября 2015 г., 21:04
Добро пожаловать, Стив...

Вы пробовали SPI1

SPI.SetModule () - довольно новая функция, и я не могу вспомнить, если кто -нибудь полностью протестировал его с помощью SD -карт

Стивестронг
Пн 19 октября 2015 г., 21:28
Я только что закончил попробовать со SPI 1, сначала со SPI.SetModule (1); и во -вторых, с этой строкой прокомментирована, в обоих случаях сохраняя одну и ту же линию SS (31).
В обоих случаях я получаю ошибку карты 0x02 0xff.
Что я делаю не так?

Мадиас
Пн 19 октября 2015 г., 21:42
Я получил только новую библиотеку SDFAT с конкретным держателем карты (без преобразователей напряжения, даже бесполезно для наших 3.3 В доски...) и конкретные SD-карты, работает ли это с «стандартной» библиотекой SD?

Стивестронг
Пн 19 октября 2015 г., 21:58
Ну, я не пробовал со стандартной либером.
Но у меня есть несколько новостей.
Я попытался визуализировать сигнал SPI CLK на моем осциллографе и - вуаля - он начал работать над SPI 1!
Но не на SPI 2.
Кажется, что импеданс на линии SCK имеет решающее значение.

Может ли кто -нибудь из вас признать это?

Rogerclark
Пн 19 октября 2015 г., 22:18
Стив

Вам не нужно вызывать SetModule (1) для SPI 1, это требуется только в том случае, если вам нужно переместить класс SPI, чтобы использовать SPI2 или на некоторых досках SPI3

Re: SCLK

Я не пробовал это на Maple Mini

Я построил простой аудиоплеер, который читал Wav's с SD -карты на SPI1 и разыгрывал их аудио -интерфейс SPI на SPI2, и это работало достаточно хорошо, но я случайно получил удар по чтению SD -карты.

Но оригинальный SD Card Lib, который использует Arduino, не был настолько хорош, и я помню, что недавно была проделана некоторая работа, чтобы улучшить ее.

Я думаю, что @victorpv может быть человеком, который больше всего знает об этом, поскольку он написал поддержку DMA для SPI и в какой -то момент работал с картами SD.

Стивестронг
Пн 19 октября 2015 г., 22:26
Роджер, спасибо, я собираюсь потратить больше времени на анализ сигналов с масштабами и сравнить SPI 1 с сигналами SPI 2.
Для SPI 1 это правда, SetModule (1) не имеет влияния.
Я опубликую позже некоторые результаты.

victor_pv
Пн 19 октября 2015 г., 22:52
Стивестронг написал:Всем здравствуйте,
У меня проблема с моей SD -картой, подключенной к клону Maple Mini.
Я запускаю эскиз SDINFO в сочетании с эскизом RawWrite, и кажется, что данные не могут быть записаны на SD -карту.
Установили последние версии от Victorpv/Sdfat и от rogerclarkmelbourne/arduino_stm32 GitHub.
Я использую SPI 2 со SPI_CLOCK_DIV8.
Чтение с SD -карты работает. Карта была отформатирована с помощью SDFormatter.
Похоже на серийный журнал: SdFat version: 20150321 Assuming the SD is the only SPI device. Edit DISABLE_CHIP_SELECT to disable another device. Assuming the SD chip select pin is: 31 Edit SD_CHIP_SELECT to change the SD chip select pin. type any character to start init time: 1 ms Card type: SD2 Manufacturer ID: 2 OEM ID: TM Product: SA02G Version: 0.3 Serial number: A07C6B9C Manufacturing date: 12/2008 cardSize: 1973.42 MB (MB = 1,000,000 bytes) flashEraseSize: 128 blocks eraseSingleBlock: true OCR: 80FF8000 SD Partition Table part,boot,type,start,length 1,0,6,135,3854201 2,0,0,0,0 3,0,0,0,0 4,0,0,0,0 Volume is FAT16 blocksPerCluster: 64 clusterCount: 60214 freeClusters: 60212 freeSpace: 1973.03 MB (MB = 1,000,000 bytes) fatStartBlock: 136 fatCount: 2 blocksPerFat: 236 rootDirStart: 608 dataStartBlock: 640 Starting RawWrite... removing RAW.TXT... creating contiguous... createContiguous failed SD errorCode: 13 SD errorData: FF

Rogerclark
Пн, 19 октября 2015 г., 23:24
Оно будет кормить 5V, так что все в порядке, но вы можете кормить 3.3V образуйте мини -регулятор на борту модуля SDCARD... На Maple Mini, я думаю, вы можете получить входящее 5 В от USB -ввода через PIN -код VIN. Но я не могу вспомнить, если через диод из USB Power, и когда я тестировал на одном из моих кленовых мини -.8 В

Просто проверьте, с чем вы подаете свой модуль SD -карты, что он, кажется, дает 3.3V на SD -карту, как я заметил, что некоторые USB -выходы всего 4.75V, а иногда регуляторы не будут работать, если вы не поставляете около 5 В

Стивестронг
Вт 20 октября 2015 г. 11:12
Maple Mini Clone (Baite) подается из USB 5V и имеет свои собственные 3.Регулятор 3V (LM1117-3.3v) на борту. Все компоненты питаются этим 3.3В.
Модуль SD -карты не имеет регулятора и получает 3.3 В от мини -доски. Так что конвертеры уровня не участвуют.
У карты есть 10 класс.
Но я нахожу странным, что для работы линия SCK (SPI 1) должна была быть связана с зондом.
Что это на самом деле значит? Неправильный импеданс?
Слишком долго ли провода от Maple Mini Board до SD -карты? Или слишком коротко?
Конечно, чем короче, что можно сказать, можно сказать. Но та же длина не повлияла на Pro Mini с часами SPI 8 МГц, питался с 3.3V, поставляемый платой конвертеров USB-сериала.
Maple Mini Spi Clock составляет 12 МГц в соответствии с прицелом (Div4). Это 4 МГц больше, чем Pro Mini, создавая такие огромные проблемы? Или скорее форма сигнала?
Или проблема CPOL и/или CPHA? Или, может быть, NSS PIN -управление связано?
Это направление, в котором я хочу сделать больше записей о возможностях, я думаю, что это дало бы ответ некоторым пользователям здесь, на форуме.
Что вы думаете?
Имеет ли это смысл?
Тем временем я постараюсь поставить дополнительный конденсатор фильтрации 10 UF на 3.3V линия и проверьте, имеет ли это значение или нет.

Ах, да, я хотел бы наконец, чтобы SD -карта работала над SPI 2, так как мне нужны аналоговые контакты 0 0...9 для моего проекта.

Ахулл
Вт 20 октября 2015 г. 15:11
Стивестронг написал:Maple Mini Clone (Baite) подается из USB 5V и имеет свои собственные 3.Регулятор 3V (LM1117-3.3v) на борту. Все компоненты питаются этим 3.3В.
Модуль SD -карты не имеет регулятора и получает 3.3 В от мини -доски. Так что конвертеры уровня не участвуют.
У карты есть 10 класс.
Но я нахожу странным, что для работы линия SCK (SPI 1) должна была быть связана с зондом.
Что это на самом деле значит? Неправильный импеданс?
Слишком долго ли провода от Maple Mini Board до SD -карты? Или слишком коротко?
Конечно, чем короче, что можно сказать, можно сказать. Но та же длина не повлияла на Pro Mini с часами SPI 8 МГц, питался с 3.3V, поставляемый платой конвертеров USB-сериала.
Maple Mini Spi Clock составляет 12 МГц в соответствии с прицелом (Div4). Это 4 МГц больше, чем Pro Mini, создавая такие огромные проблемы? Или скорее форма сигнала?
Или проблема CPOL и/или CPHA? Или, может быть, NSS PIN -управление связано?
Это направление, в котором я хочу сделать больше записей о возможностях, я думаю, что это дало бы ответ некоторым пользователям здесь, на форуме.
Что вы думаете?
Имеет ли это смысл?
Тем временем я постараюсь поставить дополнительный конденсатор фильтрации 10 UF на 3.3V линия и проверьте, имеет ли это значение или нет.

Ах, да, я хотел бы наконец, чтобы SD -карта работала над SPI 2, так как мне нужны аналоговые контакты 0 0...9 для моего проекта.

Стивестронг
Вт 20 октября 2015 г. 15:21
Энди, я попробую резистор, а затем конденсатор в качестве нагрузки параллельно.
Я скорее думаю, что зонд на самом деле вводит плоскостность (фильтрация вместо того, чтобы индуцировать шум) и/или сдвиг фазы к сигналу.
Сигнал SCK на дисплее прицела был вполне в порядке, без шипов, синусоидальная форма.
Я опубликую еще несколько результатов позже.

ZMEMW16
Вт 20 октября 2015 г. 15:35
Разве зонд применения не замедляет время роста?
Стивен

Rogerclark
Вт 20 октября 2015 г., 8:01 вечера
Какую длину провода вы используете между Maple Mini и модулем SD.

Меня всегда поражало, что работают часы и данные на 10 с мегахерца, вниз по битам или кабелю с нормальным проводом или лентой, вообще работает ;-)

Такие частоты были бы считались «высокочастотными» RF около 30 лет назад.

Чтобы получить острые края на квадратных волнах, на самом деле требуются полосы пропускания многих сотен МГц.

В любом случае.. У меня были проблемы с перекрестными помещениями на ленточных кабелях на SPI, в прошлом,

Поэтому я подозреваю, что вы испытываете что -то подобное, или звонит часы SPI или линии данных.

Стивестронг
Вт 20 октября 2015 г., 22:25
Вот мои первые записи.

Эскиз запускается, и запись запускается самым первым восходящим краем SPI 1 SCK SCK.
Желтый - это SPI 1 SCK (PIN 6), Blue - это CS Chip Select (PIN 31 в моем случае, который принадлежит CS SPI 2).

Успешное начало - только первая миллисекунд - я полагаю, это введенная часть с «SD.cardbegin () ":

Изображение

Красный - это первое зум в:

Изображение

Да, часы активируются до Выбор активного чипа!
И да, первые 4 (а также следуя последовательной группе 3) растущие края медленные.
И здесь второй зум в (зеленый прямоугольный образует первое изображение):

Изображение

Существует 2 вида импульсных поездов: меньше (левая сторона CS High Peries) и больше (правая сторона CS High Peries).
Меньшие являются (назовем их) «высокочастотные» импульсы (27 МГц), здесь последний поезд, сгенерированный после CS, выходит на «высокий» !!!

Изображение

и большие являются низкочастотными (9 МГц) импульсами:

Изображение

Я думаю, это правильные импульсы, как они всегда должны быть. Но они не вначале не в начале, где генерируются импульсы 27 МГц.
Затем, после некоторого условия, CS генерируется правильно перед SCK (второй падающий CS Edge), а импульсы SCK также в порядке, частота снижается до 9 МГц, что было фактически выбрано эскизом со SPI_CLOCK_DIV8:

Изображение

Лучшее масштаб в:

Изображение

И в конце, после Второе восходящее CS Edge, опять же, есть некоторые дополнительные часовые импульсы:

Изображение

Ну, я не знаю, что именно здесь происходит, но это определенно странно.
Может кто -нибудь объяснить это?

РЕДАКТИРОВАТЬ:
Похоже, мне удалось решить проблему зонда, я припаял конденсатор 10UF непосредственно на модуль SD-карты (VCC-GND).
Теперь эскиз работает на SPI 1 без контакта зонда на SCK.
Вероятно, перекрестный разговор был уменьшен.
Но записанные сигналы по -прежнему остались такими же, как опубликовано выше.
TODO: сигналы записи на SPI 2.

victor_pv
Ср 21 октября 2015 г. 12:10
Я не помню всех деталей, но SD -карты используют некоторые трюки в инициализации с контрольными сигналами, которые могут объяснить активацию CS до часов, может быть полностью намеренным. Вы можете проверить код библиотеки и посмотреть, что он делает. Я действительно не смотрел ни на что, кроме функций SPI, чтобы отправить данные, которые являются частью, которую я адаптирована к Mini, но я не дал представить весь протокол SDCAR.

Стивестронг
Ср 21 октября 2015 г. 8:58 утра
Хорошо, импульсный поезд, сгенерированный, в то время как CS неактивен («1»), похожий на хорошо известную технику, нанесенную на I2C-бабу, чтобы избежать повесы.
Но как насчет частотных импульсов 27 МГц на SCK? Они также сознательно сгенерированы? Для этого я не могу найти никаких значимых объяснений.
Для меня кажется, что SW пытается получить доступ к шине SPI до того, как была настроена правильная частота.
А как насчет смешного поведения SCK до прихода импульсов 27 МГц? Сигнал переходит на «0», а через некоторое время медленно обратно в «1» кажется, что толчок не активируется. Что стоит за?
Я должен более глубоко взглянуть на часть драйвера SPI, используемая SDFAT LIB.

Rogerclark
Ср 21 октября 2015 г. 9:40
Какой вывод вы используете для SS / Chip Select ?

Если вы используете тот, который на Maple Mini, помеченный как SS, (я думаю, его вывод 7) попробуйте использовать другой.

Есть известная проблема с SS PIN -код, не ведя себя. Это ошибка / особенность самостоятельной самости STM32, и мы не могли многое сделать с этим.

Я помню, что мы попытались установить работу для этой булавки.

Я уверен, что кто -то, один, форум запомнит детали ;-)

Mrburnette
Ср 21 октября 2015 г. 12:01
Rogerclark написал:<...>
Я уверен, что кто -то, один, форум запомнит детали ;-)

Стивестронг
Ср 21 октября 2015 г. 14:22
Как указано выше, я использую порт NSS SPI 2, PIN 31 или PB12.
Ведут ли этот штифт то же самое или имеет такую ​​же ошибку, что и PA4?

Mrburnette
Ср 21 октября 2015 г. 15:21
Стивестронг написал:Как указано выше, я использую порт NSS SPI 2, PIN 31 или PB12.
Ведут ли этот штифт то же самое или имеет такую ​​же ошибку, что и PA4?

victor_pv
Чт 22 октября 2015 г., 4:47
Это то, что я помню, не искал ветку:
1.- Мы обнаружили, что часть ядра, в которой штифт NSS устанавливается на AF (для контроллера по самим периферийным устройствам SPI)
2.- Мы удалили эту линию, поэтому NSS остается как GPIO.
3.- С этого момента ядра позволяет продолжать использовать штифт NSS в качестве GPIO после начала порта SPI. Он не находится под прямым контролем периферийного аппарата SPI, когда вы запускаете порт SPI.

Вышеуказанное относится к любому порту SPI, от 1 до 3 (в устройствах с 3 портами). Таким образом, любой код, использующий контроль PIN -контакта CS в качестве любого обычного вывода GPIO, может использовать PIN -код NSS для CS или что -либо еще в этом отношении. Это больше не NSS в нашем ядре, если Роджер не вернул это изменение в какой -то момент, что я не помню, чтобы читать.

РЕДАКТИРОВАТЬ:
Что касается импульсов SCK, когда CS остается низким, я почти уверен, что это часть нормального способа общения с SD -картой. Сделайте поиск в Google для SD -карты в режиме SPI, и вы должны найти все детали, но я помню, как читал о куче выполненных трюков, будут все линии управления на SD -карте, чтобы настроить их. Я просто не помню точных вещей, которые были сделаны, но Google - ваш друг ;)
Там все объяснено об этих импульсах:
http: // elm-chan.org/docs/mmc/mmc_e.HTML

Стивестронг
Чт 22 октября 2015 г. 8:26 утра
Спасибо вам всем за ответы.

Я также нашел место, где 74 или более импульсов SCK (необходимые для SD Card Init), в то время как SS высок (неактивно). Тем не менее, эти импульсы генерируются с часами 27 МГц (линия 132 SDSpicard.CPP, используя SPI_SCK_INIT_DIVISOR). Здесь уже не должен быть использован входной параметр "sckdivisor"? По крайней мере, в случае, когда SD -карта не поддерживает 27 МГц.

Другая проблема - 3 медленных и широких импульсов SCK перед обычными импульсами передачи данных. Правильно ли я понял: это ошибка в кремнии и будет сгенерирована HW, когда записан регистр SPI CR (e.глин. Режим данных, битовой порядок и разделитель часов)?
Кто -нибудь может подтвердить это?

Третья тема (низкий PRIO) заключается в том, что кажется, что spi_init () излишне называется в строке 133 SDSpicard.CPP. В любом случае, инициатор будет вызвана в Chipselectlow () (строка 207), в начале каждой команды карты. Кстати, не более быстрая вариант установить/очистить SS PIN -код, кроме DigitalWrite () - строки 296 и 279?

[Вне по теме: как можно создать график вызова функции самым простым способом?
Может быть, автоматически сгенерировано и зарегистрировано один раз после каждого изменения кода?]

Rogerclark
Чт 22 октября 2015 г. 9:00 утра
Я бы попробовал написать некоторые базовые кодовые вызовы передачи SPI и т. Д. И посмотреть, получили ли вы те же результаты.

Проблема с SD Card Lib, заключается в том, что из того, что я видел, его код, который развивался в течение нескольких лет, и я подозреваю, что есть много устаревших звонков, которые в конечном итоге делают ту же настройку более одного раза.

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

Re: более быстрые методы, чем Digitalwrite

Да, много более быстрых способов.

В Libmaple есть внутренние вызовы GPIO, которые можно было бы назвать напрямую

Или регистры аппаратного обеспечения можно напрямую манипулировать, и вы можете кэшировать порт CS и детали маски.


Однако в целом это также не большая проблема, если код не настраивает и снимает CS каждый раз, когда байт передается.

Но на самом деле это проблема с кодом более высокого уровня, т.е. библиотека, которая использует SPI

Стивестронг
Чт 22 октября 2015 г. 9:46 утра
Роджер, я согласен с вами, надежность может быть более важной, чем оптимизация кода.
В любом случае, как я уже говорил, не является большой проблемой, и это место, кажется, действительно не очень критично, так как одноразовое действие для передачи нескольких байтов.

Тем не менее, другая проблема с этими 3 широкими импульсами на линии SCK до того, как обычные импульсы передачи данных действительно беспокоят меня, их не должно быть там. И я не уверен, вызывают ли они какие -либо проблемы при доступе к SD -карте, особенно когда они происходят, пока SS активен.
Я думаю, важно узнать, почему они там. Мне нужно копать глубже...

Rogerclark
Чт 22 октября 2015 г. 9:58 утра
Спасибо, Стив

Я согласен, у нас не должно быть дополнительных импульсов.

Я думаю, что несколько человек смотрели на SPI, с логическими анализаторами и областями, за последние 6 месяцев или более, и я не помню, чтобы кто -то видел какие -либо дополнительные импульсы, поэтому эта проблема может быть специфична для SD Lib

В любом случае. Спасибо за исследование этого странного явления

Mrburnette
Чт 22 октября 2015 г. 12:11
Стивестронг написал:<...>
Я думаю, важно узнать, почему они там. Мне нужно копать глубже...

Стивестронг
Чт 22 октября 2015 г., 21:26
Итак, здесь у вас есть сюжет с помощью SPI_CLOCK_DIV4. Это то, что я называю чистым сигналом :).

Изображение

Скорость SPI не имеет большого влияния на производительность времени выполнения, Div4 или Div8 дает почти те же результаты, поэтому я бы предложил использовать Div8, чтобы сохранить безопасную сторону. Div2 (полная скорость), не пробовал еще не пробовал.

Изменения:
Sdspicard:
- :: begin () - Последовательность вызовов между Spibegin () и spiinit (). Я думаю, это нормально, что инициализация должна быть сделана до Интерфейс запускается (начало).
- chip_select_low () - Удалить линию с помощью spiinit (), который уже был вызван в Begin (), нет необходимости вызывать ее снова и снова.
SPI.CPP
- Удалить звонок этого.begin () из функций setclockdivider (), setbitorder () и setDatamode (). Такие же рассуждения, Spi :: Begin уже выполнен ранее.

После этих изменений смешные широкие импульсы исчезли, больше не пульсов с 27 МГц, карта ведет себя очень надежно, больше нет проблем с зоном масштаба вообще!

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

Прикрепил мою локальную копию этих файлов.

Настройка состоит только из одного модуля SD -карты на SPI 1, SS - Maple Mini PIN 31 или PB12.
Тот же набросок, что и в моем первом посте.

РЕДАКТИРОВАТЬ:
Вот серийный выход: SdFat version: ******* the version number for some reason will not be displayed ****** init time: 0 ms Card type: SD2 Manufacturer ID: 2 OEM ID: TM Product: SA02G Version: 0.3 Serial number: A07C6B9C Manufacturing date: 12/2008 cardSize: 1973.42 MB (MB = 1,000,000 bytes) flashEraseSize: 128 blocks eraseSingleBlock: true OCR: 80FF8000 SD Partition Table part,boot,type,start,length 1,0,6,135,3854201 2,0,0,0,0 3,0,0,0,0 4,0,0,0,0 Volume is FAT16 blocksPerCluster: 64 clusterCount: 60214 freeClusters: 60207 freeSpace: 1972.86 MB (MB = 1,000,000 bytes) fatStartBlock: 136 fatCount: 2 blocksPerFat: 236 rootDirStart: 608 dataStartBlock: 640 Starting RawWrite... removing RAW.TXT... creating contiguous file... getting contiguous range... Start raw write of 51200 bytes at 51200 bytes per second Please wait 1 seconds RawWrite done Elapsed time: 1.00 seconds Max write time: 557 micros Overruns: 0 type any character to start

Rogerclark
Чт 22 октября 2015 г., 22:36
SPI.CPP
- Удалить звонок этого.begin () из функций setclockdivider (), setbitorder () и setDatamode ().
Я удивлен, это работает.

Если вы посмотрите в SetClockDivider, все, что он делает, это устанавливает свойство под названием _currentSetting->ClockDivider, это на самом деле не меняет оборудование

Причина, по которой он вызывает, начинается (), заключается в том, что начинают вызовы

spi_master_enable (_currentsetting->spi_d, (spi_baud_rate) _currentsetting->clockdivider, (spi_mode) _currentsetting->DataMode, Flags);

Который на самом деле устанавливает аппаратное обеспечение, и для этого он должен отключить аппаратное обеспечение SPI, а затем внести эти изменения, а затем повторно установите аппаратное обеспечение SPI

Это должно сделать это, потому что некоторые изменения (я думаю, что порядок бит является одним из них), нельзя изменить, если интерфейс SPI активен.


Вы можете попробовать написать петлю, чтобы позвонить
spi_peripheral_disable(dev); spi_peripheral_enable(dev);

Стивестронг
Чт 22 октября 2015 г., 22:54
Роджер, функция spi_master_enable () фактически уже называется Spibegin () с начала sdspicard :: start (), после spiinit () - в моей версии.
Spibegin () вызывает SPI.begin (), который вызывает spi_master_enable () после выполнения spi_init () и configure_gpios ().
Поэтому я думаю, что HW будет правильно инициализирован и начал... Вот почему работает... Наверное...

Rogerclark
Чт 22 октября 2015 г., 23:06
Стив

Я ожидаю конфигурации SPI по умолчанию для некоторых вещей, таких как байт -заказ, подходит для SD -карты, поэтому она работает.

Но если вы удалите вызовы для начала () из SetbyteOrder и т. Д., Некоторые другие устройства не будут работать.

Можете ли вы проверить, является ли это актом отключения и повторного оборудования оборудования SPI, которое вызывает сбой

Также может случиться так, что код возвращает контакты SPI в режим GPIO (вероятно, входы), которые вызывают глюки

Стивестронг
Пт 23 октября 2015 г. 8:33
Но если вы удалите вызовы для начала () из SetbyteOrder и т. Д., Некоторые другие устройства не будут работать. Я понимаю, что вы имеете в виду, у меня также были некоторые мысли об этом.

Я проверил всю репо STM32, есть довольно мало мест (только 7 файлов!) где эти функции называются.
В этих случаях SPI.begin () всегда вызывается раньше.
Я думаю, что это вообще не совсем нормально. На мой взгляд, begin () не является init (), а init () должен на первом месте.
Я предполагаю, что SetByteOrder () и аналогичные функции принадлежат к части, справа?
Это означает, что рабочие параметры должны быть настройки сначала, а только после этого вызов Begin ().

С другой стороны, функция SPI.begin () также вызывает функцию spi_init (), которая выполняет RCC включить и сбросить. Следовательно, каждый раз, когда начинается (), помимо вызова spi_master_enable (), RCC сбрасывается. Я думаю, что повторный RCC Reset and Master включен не имеет смысла и поэтому следует избегать. Может быть, это причина, почему я избавился от глюков, применив свои изменения.

Я знаю, одна попытка избежать изменений, которые могут повлиять на другие либера. Но я думаю, что с этими изменениями мы могли бы действительно улучшить либера.
В качестве альтернативы удалить строки, которые Begin () Begin (), возможно, введем семифорную переменную, чтобы отслеживать, был ли начало (), и не называл ее снова, если это так.

Как вы думаете?

РЕДАКТИРОВАТЬ: Причина, по которой он вызывает, начинается (), заключается в том, что начинают вызовы

spi_master_enable (_currentsetting->spi_d, (spi_baud_rate) _currentsetting->clockdivider, (spi_mode) _currentsetting->DataMode, Flags);

Который на самом деле устанавливает аппаратное обеспечение, и для этого он должен отключить аппаратное обеспечение SPI, а затем внести эти изменения, а затем повторно установите аппаратное обеспечение SPI
Из -за этого, без изменения вызова порядок init () и begin (), идея с переменной семафора не будет работать.

Rogerclark
Пт 23 октября 2015 г. 10:03
Привет, Стив,

Код для Spi Lib был унаследован от оригинальных библиотек Leaflabs Libmaple. Мы внесли в это некоторые изменения, но я не помню, чтобы меняли начало ();

Я не знаю, почему Leaflabs нужно было назвать RCC_CLK_ENABL рассказывать).)

Но я предполагаю, что вам нужно настроить rcc_clk и сбросить устройство SPI, прежде чем вы сможете его вообще использовать.

Если некоторые Libs Call начнутся несколько раз, мы, вероятно, могли бы поместить флаги в spi_init (), чтобы он не повторно введите, если они уже были связаны, но я подозреваю, что причина, по которой это сделано при каждом вызове (), на всякий Кто -то решает установить Pinmode on the Pins Spi, между вызовом One Begin () на одном передаче и другой Begin () на другой передаче

Re: SetbitOder называется ??

Я не уверен, что ты имеешь в виду. Насколько я вижу, SetbitOder называется только в SPI.CPP от Begin Transaction

Если это называет другой либера

setbitOder можно вызвать в любое время, до или после SPI.begin (), поэтому я не вижу, как код может сделать что-либо, кроме как отключить аппаратное обеспечение SPI, изменить настройку и повторно установить оборудование

Хотя это делает это, позвонив в SPI.begin () но даже если я скопировал код из SPI.Begin () в SetbitOder, это был бы тот же код.

Мы, вероятно, можем сделать некоторое улучшение, изменив
void SPIClass::setBitOrder(BitOrder bitOrder) { #ifdef SPI_DEBUG Serial.print("Bit order set to "); Serial.println(bitOrder); #endif _currentSetting->bitOrder = bitOrder; this->begin(); }

Стивестронг
Пт 23 октября 2015 г., 11:27
Я не уверен, что ты имеешь в виду. Насколько я вижу, SetbitOder называется только в SPI.CPP от Begin Transaction

Если это называет другой либера
Вы можете проверить это здесь: https: // github.com/rogerclarkmelbourne/ ... etbitorder
Обычно SetbitOder, SetClockDivider и SetDatMode называются последовательно через друг друга.
Например: https: // github.com/rogerclarkmelbourne/ ... _ports.Ино. void setup() { // Setup SPI 1 SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 SPI.setClockDivider(SPI_CLOCK_DIV16); // Slow speed (72 / 16 = 4.5 MHz SPI_1 speed) pinMode(SPI1_NSS_PIN, OUTPUT); // Setup SPI 2 SPI_2.begin(); //Initialize the SPI_2 port. SPI_2.setBitOrder(MSBFIRST); // Set the SPI_2 bit order SPI_2.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 SPI_2.setClockDivider(SPI_CLOCK_DIV16); // Use a different speed to SPI 1 pinMode(SPI2_NSS_PIN, OUTPUT); }

Mrburnette
Пт 23 октября 2015 г. 12:13
Я думаю, что до того, как слишком много циклов было затрачено в init () и begin () нужно вернуться к ядру Arduino и обратить внимание на то, как эти функции используются (или teensy3 в этом отношении.) Диаграмма состояний призванных функций может пролить свет на этот вопрос, так как я не знаю, используются ли «инициализировать» и «начало», фактически используются как предполагает определение имени.

Нужно также признать, что ядро ​​Leaflabs было написано до Arduino 1.0, что было огромным архитектурным и структурным изменением для библиотек Arduino.


Луча

Стивестронг
Пт 23 октября 2015 г. 12:46
Простой анализ:
SPI.CPP
исходная функция:
void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) { #ifdef SPI_DEBUG Serial.println("SPIClass::beginTransaction"); #endif //_SSPin=pin; //pinMode(_SSPin,OUTPUT); //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); setClockDivider(determine_baud_rate(spi_d, settings.clock)); begin(); #if 0 // code from SAM core uint8_t mode = interruptMode; if (mode > 0) { if (mode < 16) { if (mode & 1) PIOA->PIO_IDR = interruptMask[0]; if (mode & 2) PIOB->PIO_IDR = interruptMask[1]; if (mode & 4) PIOC->PIO_IDR = interruptMask[2]; if (mode & 8) PIOD->PIO_IDR = interruptMask[3]; } else { interruptSave = interruptsStatus(); noInterrupts(); } } uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(pin); bitOrder[ch] = settings.border; SPI_ConfigureNPCS(spi, ch, settings.config); //setBitOrder(pin, settings.border); //setDataMode(pin, settings.datamode); //setClockDivider(pin, settings.clockdiv); #endif }

victor_pv
Пт 23 октября 2015 г. 13:00
Стив кажется, что поведение их в этом порядке имеет смысл.
Я не думаю, что кто -то приложил много усилий в переписывании примеров, за исключением случаев, когда они не работали. Есть множество кода, которое действительно старое и трудно отслеживать, кто что сделал и почему.

Я бы предположил, что в примерах, которые вы исправили и проверили, откройте новую ветку для комментариев, если другие люди смогут проверить их, чтобы получить больше уверенности, а затем отправить запрос на привлечение в Роджер.
У нас Роджер всегда занят внесением изменений, в то время как ему все еще нужно склонить его реальные обязательства, поэтому все, что мы можем сделать, чтобы сэкономить его время, хорошо.
Отправка запроса о привлечении спасает его от необходимости перейти в эти файлы и переписывает их лично.

Что касается библиотеки SDFAT, Greyman рассматривает это как работа в GitHub, и прокомментировал, что существует множество старого кода, которое ему нужно, чтобы пройти через. Для изменений, которые улучшают стабильность его библиотеки, я бы посоветовал вам сказать ему, чтобы он знал, и он даже может добавить их в библиотеку, если увидит выгоду.

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

Теперь о удалении Begin () из этих 3 функций, вопрос: начинается ли официальный звонок библиотеки Arduino?
Если это произойдет, вполне вероятно, что удаление его в нашем ядре сломает совместимость с другими библиотеками, которые могут не вызвать начало в порядок, который вы предлагаете, потому что они полагаются на эти функции, которые вызывают это.
Как прокомментировал Роджер, эти функции в нашем ядро ​​устанавливают параметр, но не применяют его к аппаратному обеспечению, поэтому, если начало не вызвано ни функцией, ни с использованием кода, настройка не будет эффективно применяться.
Если вы хотите удалить из них begin (), я бы посоветовал проверить, какая часть begin () применяет каждое из этих настроек к аппаратному обеспечению и изменить эти функции, чтобы они фактически применяли настройки, кроме сохранения параметра.

Стивестронг
Пт 23 октября 2015 г., 18:35
Итак, теперь выглядит, что вещи не так просты, как я думал.
Я хотел соответствовать и, следовательно, прочитать о ссылке на SPI по домашней странице Arduino Homepage. Полный беспорядок...
Есть написано: SetclockDivider ()
Описание
Эта функция не должна использоваться в новых проектах. Используйте Spisettings со SPI.BeginTransaction () для настройки параметров SPI.
Теперь, если мы сохраняем обратную совместимость с более старыми либералами с этими тремя небольшими дополнительными функциями или нет?

По моему мнению, мы должны адаптировать новый интерфейс к Spi Lib, через BeginTransaction () и Spisettings.
Пользователи всегда могли легко адаптировать свои наброски, чтобы соответствовать последним изменениям SPI, но не пользовательские либера.
Тем не менее, я думаю, что большинство пользовательских LIBS уже перешли на API на основе транзакций, поэтому кажется нормальным следовать таким образом.

Но шаг вперед, сайт https: // www.Ардуино.cc/en/reference/dueextendedspi Предложите специальную форму использования, без begintransaction (), просто используя номер PIN -кода в качестве параметра для передачи данных. Хм.
На вершине пример begintransaction () () () пример (https: // www.Ардуино.CC/EN/Учебное пособие/Spitransaction) снова использует другой подход, предлагая пользователю управлять настройками самостоятельно.

Теперь, какой пример должен принять в качестве ссылки? Все они должны быть поддержаны?
Это важно решить, потому что развитие зависит от этого решения.

Rogerclark
Пт 23 октября 2015 г., 22:14
Теперь, если мы сохраняем обратную совместимость с более старыми либералами с этими тремя небольшими дополнительными функциями или нет? Есть так много устаревших библиотек и так много кода, которые используют старые функции, мы не можем просто не поддерживать их.

Re: срок расширенной функциональности

Я думаю, что это очень специфично, где они могут переместить аппаратные контакты CS в альтернативные.

Мы даже не можем использовать аппаратный CS из -за проблем с тем, как ST считает, что это должно работать, я.E, как было опубликовано в этой теме, у большинства людей есть проблема с тем, как у аппаратного CS на STMF103 и т. Д., И в конечном итоге просто используют GPIO для CS

Таким образом, нет смысла пытаться имитировать определенные вещи..

ИМХО, должное никогда не завоевало популярность. У меня есть 2 из них, и я никогда не использовал. Насколько я могу сказать, не многие люди используют должное.
Новый Arduino Zero (который также использует MCU типа SAM) может быть другой историей, только время покажет
Но я не уверен, поддерживает ли он также расширенный SPI.. Как это чип Samd, поэтому может не иметь таких же возможностей, как у.


Re: Transactional SPI

Я сделал удар по добавлению транзакционного SPI -кода (поскольку он не был в исходном коде Leaflabs)
Но я никогда не тщательно проверял это, потому что не многие либера.

Я только что сделал поиск в Google, чтобы увидеть, как может помещать SPI.начало транзакции (происходит e.глин.

Поиск Google для
"SPI.beginTransaction("

Mrburnette
Пт 23 октября 2015 г., 23:42
... с точки зрения того, чего люди, вероятно, захотят. Старый стиль намного перевешивает транзакцию. Весь транзакционный подход был реализован Полом для Teensy 3.x Теперь мы разыграли это однажды в отношении STM32Duino несколько месяцев назад, и хотя многие либера.x) были обновлены, большинство некоммерчески распределенных не были. Итак, у нас есть законная обеспокоенность. Если мы изменим основной подход ... Все сломается. «Работать против правильного, но сломанного», мало используется для Noobies. Я думаю, что это одна из тех ситуаций, когда «улучшения» кусают кого -то в задницу.

Я не смотрел на вещи Пола...
http: // www.PJRC.com/teensy/td_libs_spi.HTML


Луча

Стивестронг
Сб 24 октября 2015 г. 9:05
Итак, давайте пойдем консервативным способом, по крайней мере, в отношении SPI LIB, который используется во многих пользовательских либерациях.
После идеи Роджера переключить SPI_MASTER_ENABLE/отключить, кажется, что это работает. Глючи все еще там, но в очень уменьшенной форме, поэтому кажется, что они больше не беспокоят.

Что касается SPI 2, я уже сообщал, что чтение данных работает, но не написано. Ну, это кажется ошибкой в ​​sdspismt32f1.CPP.
https: // github.com/Victorpv/sdfat/blob/ ... TM32F1.CPP
В функции "void sdspi :: send (const uint8_t* buf, size_t n)", строки 92-94, есть устройство SPI 1, используемое в качестве фиксированного параметра, поэтому SPI 2 не может работать. :) if (spi_is_rx_nonempty(SPI1)) { uint8_t b = spi_rx_reg(SPI1); }

ZMEMW16
Сб 24 октября 2015 г. 12:39
Я полагаю, классическим способом было бы разбросить его, или, как в заголовке Newspi и Newsd* или добавить _stm согласно Adafruit_gfx

Я не вижу много библиотек, перенесенных обратно в AVR, но если требуется в качестве многоплатформы, мы уже тестируют
для _stm32f1_ и т.д.

Стивен

victor_pv
Сб 24 октября 2015 г. 13:16
Что касается этих 3 строк, я больше не помню.
Они были в версии для Сэма и, возможно, в версии для Ардуино. Я уверен, что я тестировал с ними и без них, но оставил их просто, чтобы не отклоняться от версии SAM.

Все, что он делает, просто опустошен последний байт из буфера RX.
Мне придется пойти и прочитать библиотеку SPI и таблицу данных, чтобы увидеть, как работает фактическая трансферная функция, но у меня нет времени.

Вот что я помню, хотя может быть неправильно. Когда мы делаем передачу, MCU будет читать входящие байты в буфер RX.
После того, как мы пишем последний байт в буфере TX, и периферийное устройство отправляет его, он все еще читает еще один байт в буфере RX.
Если функция записи библиотеки SPI управляет так правильно, чтобы последний входящий байт не стал первым значением чтения в следующий раз, когда вы сделаете передачу, все хорошо. Но если байт вместо этого остается ждать в буфере RX, и функции SPI читают и возвращают его так, как если бы он был первым значением чтения, то его нужно отбросить.

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

РЕДАКТИРОВАТЬ:
Тот факт, что те строки, использующие SPI1. Им просто нужно использовать правильную мысль, а не просто читать из SPI1 всегда.

Edit2:
Только что посмотрел на функцию записи в SPI.CPP
Это идет на чтение из буфера RX, если этого что -то ждет.
Я полагаю, что таблица DataShing объясняет, что когда вы отправляете байт, MCU всегда будет читать то, что происходит из линии мисо. В этом случае любое чтение или перенос может оставить байт, ожидающий в буфере RX, который может быть ошибочно поднять следующим прочтением. Я думаю, что было бы лучше изменить функции, которые отправляют данные, чтобы убедиться, что они оставляют пустой буфер RX на выходе.

Я вижу, что сделал это с функциями dmatransfer, но не добавил его к существующим. Я думаю, что это должно быть добавлено к функциям записи и передачи, которые еще не имеют его.

Стивестронг
Сб 24 октября 2015 г. 15:14
Тот факт, что те строки, использующие SPI1. Им просто нужно использовать правильную мысль, а не просто читать из SPI1 всегда. Именно мое мнение.
Виктор, я бы предложил вам обновить SPI.CPP и SPI.H в вашем GitHub Repo.

Стивестронг
Пн 26 октября 2015 г. 12:15 вечера
@ Роджер,
Я сделал два запроса на притяжение относительно SPI.CPP, пожалуйста, игнорируйте первый, это неправильно, изменение должно было быть вставлено в линию 349.
Второй - решить глюки перед настоящими импульсами SCK.

@Victor, я сделал запрос на привлечение, чтобы решить ошибку, касающуюся проблемы написания SPI 2.
И еще один запрос на то, чтобы изменить вызову между init () и begin ().

Rogerclark
Пн 26 октября 2015 г., 17:13
Стив

Хорошо, я закрою первый пиар и проверю второй.

victor_pv
Сб 07 ноября 2015 г. 1:24
Стив, я был вдали от форумов некоторое время из -за отсутствия времени. Я считаю, что вы отправили запрос на привлечение с изменениями в библиотеку SDFAT.
Все ли все протестировано и стабильно, или вам нужно добавить любое другое изменение, прежде чем я слияю?

Стивестронг
Сб 07 ноября 2015 г., 19:58
Привет, Виктор,
Я протестировал его столько, сколько мог, использовал пример RawWrite для записи аналоговых данных, отобранных в двойном канале одновременный режим.
Пока все выглядит нормально.
Конечно, было бы лучше, когда в тестировании могло бы быть вовлечено больше людей, но я все равно применял бы PR.

Робка
Ср 02 декабря 2015 г. 9:14
На этой странице https: // github.com/rogerclarkmelbourne/ ... /Библиотеки
Последняя SDFAT, модифицированная версия из https: // github.com/Victorpv/sdfat Кажется, работает нормально. Если вам нужна лучшая производительность для больших переводов, может использовать режим DMA, но для этого требуется последняя библиотека SPI от https: // github.com/vicopropv/arduino_stm ... Спутники/SPI . Не нуждается в обновленных файлах SPI, если вы не используете режим DMA. DMA может быть включен или отключить редактирование SDSPISTM32F1.CPP, прочитайте файл, чтобы узнать, что изменить. Эта информация все еще верна?

Если я скачиваю https: // github.com/rogerclarkmelbourne/ ... владелец.молния Я вижу, что файлы от 21 ноября. Будет ли это содержать все исправления, обсуждаемые в этой теме?

Rogerclark
Ср 02 декабря 2015 г. 10:31
PM @Stevestrong

Он был последним человеком, который хорошо посмотрел на это.

Я уверен, что он сможет рассказать вам лучшую либера

Стивестронг
Солнце 06 декабря 2015 г. 15:37
Я думаю, часть Не нуждается в обновленных файлах SPI, если вы не используете режим DMA. неправильно.
Новые файлы необходимы для плавной операции SPI, по крайней мере, на SPI 2, посмотрите мой последний PR.
Тем не менее, я тестировал только без DMA. Как сказал Виктор, что между w/ и o dma разница не так огромна, я продолжаю использовать стандартный путь без DMA.

Робка
Солнце 06 декабря 2015 22:01
Привет, Стив, какую версию библиотек и основных файлов вы использовали, чтобы все работало?

Является ли информация, которую я разместил (ниже) правильной?
Последняя SDFAT, модифицированная версия из https: // github.com/Victorpv/sdfat Кажется, работает нормально. Если вам нужна лучшая производительность для больших переводов, может использовать режим DMA, но для этого требуется последняя библиотека SPI от https: // github.com/vicopropv/arduino_stm ... Спутники/SPI . Не нуждается в обновленных файлах SPI, если вы не используете режим DMA. DMA может быть включен или отключить редактирование SDSPISTM32F1.CPP, прочитайте файл, чтобы узнать, что изменить.

Стивестронг
Солнце 06 декабря 2015 22:27
Привет, Роджер, честно говоря, я не совсем уверен в основной версии.
Я использую GitHub для Windows, я синхронизировал, и я мог видеть все PR от вашей разработки и главной ветви, и графический интерфейс GitHub сообщает мне, что это будет мастер -филиал STM32... Таким образом, я могу только надеяться, что это действительно мастер -филиал STM32, поскольку все мои знания «GitHub» сводится к совершению и синхронизации...а иногда, случайно, в настоящий пиар :)
Вы видите, что я изменил? Вовлечены только 2 файла.
Версия SDFAT от Repo + My PR Victor's My PR оттуда.

Что касается информации, как я уже сказал, не проверил DMA. И для того, чтобы «нормальный» SPI2 (без DMA) работал, и чтобы сделать глюки, мои изменения были бы обязательными.

Rogerclark
Пн, 07 декабря 2015 г. 12:35
Я обычно использую оболочку git

Затем CD в папку arduino_stm32 и введите
git checkout development

Мэнни
Ср 09 декабря 2015 г., 17:29
Наконец -то заставил это поработать над моим Olimexino с его интегрированной SD -картой на SPI 2. Библиотека примерно вдвое быстрее, чем старый SDFAT перенесен в Libmaple.
Сделали несколько примеров и не получили никаких ошибок, швы DMA, такие как достойное повышение, специально для чтения с увеличением на 85%.

Пример скамейки с картой на полной скорости DMA на. Free RAM: 11783 Type is FAT32 Card size: 31.91 GB (GB = 1E9 bytes) Manufacturer ID: 0X3 OEM ID: SD Product: SL32G Version: 8.0 Serial number: 0X55BA300 Manufacturing date: 2/2015 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 255.46,75601,1523,2002 262.07,61258,1518,1951 257.48,67833,1524,1986 256.38,72433,1526,1995 257.68,60078,1525,1985 258.06,81216,1510,1982 251.27,69162,1535,2036 257.68,68508,1525,1985 252.89,77578,1525,2022 256.22,73986,1518,1996 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 1060.15,1281,477,482 1059.70,1281,477,482 1059.70,1277,478,482 1060.15,1278,477,481 1059.70,1276,478,482 Done

Робка
Солнце 20 декабря 2015 г., 22:35
Мне нужна помощь, выясняя, что я делаю не так.

У меня есть стандартный считыватель SD, который я протестировал с 3.3V Arduino Pro Mini: он работает с тестовой картой Patriot, используя библиотеку Arduino SD и более новую SDFAT One

Я не могу заставить это работать на Maple Mini. В соответствии с ViewTopic.PHP?F = 28&t = 37&начало = 10#P723 Я подключил MOSI к PIN4, мисо с 5, SCK к 6. Я попробовал как 7, так и 10 как CS, без разницы.

Я использую новую загрузку Master Repository (следовательно, у меня есть последние файлы SPI), а также загружен и установлен как библиотечный порт Victor SDFAT (https: // github.com/Victorpv/sdfat). Я использую код ниже:
#define SD_CS_PIN 10 #include #include SdFat SD; File myFile; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); pinMode(7, OUTPUT); pinMode(10, OUTPUT); if (!SD.begin(10)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. myFile = SD.open("test.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // close the file: myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } // re-open the file for reading: myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); // read from the file until there's nothing else in it: while (myFile.available()) { Serial.write(myFile.read()); } // close the file: myFile.close(); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } } void loop() { // nothing happens after setup }

Мэнни
Солнце 20 декабря 2015 г. 11:09
Я бы использовал схему для платы, прикрепленной к выработке, какие булавки идут к тому, какой заголовок.

Стивестронг
Пн 21 декабря 2015 г., 7:56 утра
Я бы использовал SCK -делитель в SD init, потому что по умолчанию можно быть высоким: #define CS PA4 sd.begin(CS, SPI_CLOCK_DIV8)

Робка
Пн 21 декабря 2015 г., 16:16
Спасибо, Стив.

Я попробовал практически все возможные значения делителя, но все еще не инициализируется (это похоже на проблему, о которой сообщается в другой потоке). PA4 против PIN 7, похоже, тоже не имеет значения

Я подключил клон Saleae с протоколом SPI, и я вижу, что плата Arduino использует медленный сигнал. Но даже если я разделяю часы достаточно, чтобы быть в том же диапазоне, что и Arduino, карта все еще не будет инициализироваться. Я вижу, что чип правильно выбирает как с помощью PA4, так и PIN 7

С другой стороны, я могу использовать стандартную библиотеку SD Arduino SD. Что я заметил, так это то, что в подпрограмме инициализации старой карты используются очень медленные часы (~ 250 кГц), в то время как новая библиотека (даже при использовании 128 в качестве разделителя в SdfatConfig.h) использует ~ 500 кГц. Я действительно могу использовать полную скорость SPI с моей картой Class6 при чтении и написании со старой библиотекой (на полном 2.5 МГц)

Наконец, я заметил, что есть sdspistm32f1.Файл CPP в библиотеке, но библиотека всегда использует SDSpicard.CPP и, похоже, не использует версию F1 (я добавил сериал.печатные операторы во всех функциях, и ни одна из них не использовалась). Это ошибка конфигурации на моей стороне?

Вы не против поделиться SDFATCONFIG.H Файл, который вы используете?

Мой опыт похож на предыдущие отчеты, где некоторые люди могут использовать стандартную библиотеку SD -карт, но не новая... Интересно, есть ли где -то ошибка, в реализации SPI (я проверил, кстати, и мой код SPI идентичен тому, который в репозитории Виктора)

В сторону: что люди используют для отладки? У меня есть Stlink, и я бы предпочел отлаживать через это, чем добавлять серийный.Печать везде

Стивестронг
Пн 21 декабря 2015 г., 17:04
@ROBCA,
Я использую файлы по умолчанию SDFAT LIB, не внес никаких изменений.
Я провел много времени, чтобы заставить SPI2 работать, но, честно говоря, я не потратил много времени на работу с SPI1, только вскоре проверил, и это сработало.
Тем не менее, U следует рассмотреть возможность проверить филиал «разработки», поскольку существуют некоторые чувствительные изменения, внесенные в отношении SPI, необходимых SDFAT для работы на SPI2, и это может быть актуально также для SPI1.

Файл sdspistm32f1.CPP должен использоваться, например, функция init (). Остальные функции в основном являются тонкой оберткой для вызова функций SPI.CPP.
Наконец, если больше ничего не поможет, пожалуйста, проверьте выбранную тип доски в Arduino.
Ваша доска-байте-клон или оригинальный?

Rogerclark
Пн 21 декабря 2015 г., 21:17
Попробуйте развитие филиала репо, вместо мастера

В филиале разработчиков есть последние исправления Стива, но у меня не было времени, чтобы объединить разработку в Мастер и проверить ее..

Робка
Пн 21 декабря 2015 г., 21:34
Стивестронг написал:@ROBCA,
Я использую файлы по умолчанию SDFAT LIB, не внес никаких изменений.
Я провел много времени, чтобы заставить SPI2 работать, но, честно говоря, я не потратил много времени на работу с SPI1, только вскоре проверил, и это сработало.
Тем не менее, U следует рассмотреть возможность проверить филиал «разработки», поскольку существуют некоторые чувствительные изменения, внесенные в отношении SPI, необходимых SDFAT для работы на SPI2, и это может быть актуально также для SPI1.

Файл sdspistm32f1.CPP должен использоваться, например, функция init (). Остальные функции в основном являются тонкой оберткой для вызова функций SPI.CPP.
Наконец, если больше ничего не поможет, пожалуйста, проверьте выбранную тип доски в Arduino.
Ваша доска-байте-клон или оригинальный?

ZMEMW16
Вт 22 декабря 2015 г. 2:35
Daft Idea, но может ли это проявить себя как мерцание дисплея на дисплеях TFT ILI9341, которые я пытался добраться до работы?
Я получаю белый экран, с изменением оттенка белых синхронизации с изменением режима тестирования.
Рабочий, теперь один и немного как что -то покачивалось секундой, и он показал кусочки испытательного дисплея с большим мерцанием.
Я начинал думать, что это может быть время в последовательности init для контроллера.

Стивен

Стивестронг
Вт 22 декабря 2015 г. 12:43
не принадлежит эту тему в другую ветку? Возможно, это может быть связано со SPI, но не с SDFAT lib.

ZMEMW16
Вт 22 декабря 2015 г. 12:55
Аполы, я согласен.
Я переоцениваю проблемы с библиотеками.

Это было упоминание о «жестких» времени и сигнале CS, который применялся ранее, разбудил меня.
В любом случае я ухожу, чтобы получить ветвь Devel и попробовать ... ...

Стивен

Racemaniac
Солнце 17 апреля 2016 г. 18:21
Я недавно играл с DMA, чтобы разгрузить свой процессор для интенсивного проекта, над которым я работаю, и до сих пор написал несколько собственных небольших библиотек, поэтому, когда DMA работает, я могу выполнять другую работу, пока она выполняет свою вещь.

Я также играл с этой библиотекой, и мне было интересно, сможем ли мы сделать ее еще более мощным, чем она уже есть, позволяя вам делать другие вещи, пока DMA работает.

Моя самая простая мысль до сих пор: что, если вы сможете передать метод, он должен зацикливаться на вас, пока вы ждете DMA (может быть основным методом цикла вашего проекта Arduino). Вряд ли он вообще приобретает какие -либо изменения в библиотеку (просто позвольте пользователю установить этот метод и поместить вызов в этот метод в циклах, где вы ждете, пока DMA закончится, и все готово). Это может быть не самый эффективный способ сделать это, но вы, вероятно, получите 80% результата за 1% работы :).

В идеале вы начнете звонок, и он сделает свое дело на заднем плане и использовал прерывания, чтобы увидеть изменения состояния & отреагируйте на них, и вы можете периодически опрашивать его, чтобы увидеть, сделано ли это еще, а затем прочитать ваш результат, но это будет большой перепроектирование библиотеки :). И, вероятно, это не получит столько по сравнению с простым решением :).

Рекснанет
Пн 13 июня 2016 г., 10:05
E-Dredon написал:Добрый день все.

У меня еще не было успеха с модулем SD моего ЖК -дисплея ILI9341 и оптимизированной библиотеки SDFAT.

Теперь с моим STM32F103C8T6 (BluePill)
Я пробовал все цифровые контакты для линии SD_CS.
Я отключил оптимизацию DMA для начальных тестов в файле конфигурации SDSPISTM32F1.CPP
#define use_stm32f1_dmac 0

Я пытался использовать SPI1 как для дисплея ILI9341, так и для SD -модуля с выделенным CS PIN -код для SD_CS.
Я попробовал последнюю библиотеку SPI с новым SPI.SetModule (2); В разделе «Настройка моего кода. В этом случае я подключил SD Miso/Mosi/SCK на SPI2 и указал SD_CS (я попробовал SS SPI2 и другие булавки, такие как 0, 1, потому что я видел, как некоторые пользователи добились успеха с Mapple Mini с этим конфигурация)
И последнее, но не менее важное: я пробовал различные настройки div_clock (2, 4, 8) без успеха тоже.
const uint8_t spispeed = spi_clock_div8;

Если я определяю вывод со схемой именования STM32F103C8 (Paxx/PBXX/PCXX и т. Д...), дисплей работает, но, если я скомпилирую эскиз для тестирования SDINFO, у меня есть другая нумерация в серийном мониторинге. Для Exemple, мой PB13 имеет PIN № 33, показанный на серийном мониторе.

Я не знаю, что еще делать сейчас...

Стивестронг
Пн 13 июня 2016 г., 11:18
Похоже, что проблемы наблюдаются с SDFAT вместе с ILI9341 LIB.
Не должен запустить отдельный поток для этого?
Я имею в виду, здесь я бы обсудил проблемы, связанные только с SDFAT. Не будет иметь смысла?

Вадимель
Солнце 21 августа 2016 г., 17:00
Как заменить один Char на позиции ???

У меня есть файл 70 КБ фон.текст, нравиться 1234567890qwertyiopasdfghjkl

Martinayotte
Солнце 21 августа 2016 г. 18:56
file.seekSet(10);

Вадимель
Солнце 21 августа 2016 г. 8:01 вечера
Martinayotte

Хорошо, спасибо, работа, тогда я переключаю на 1 "#define sd_spi_configuration 1"
Я могу написать в файл и поиск

Но светодиодный PB1 - это свет, и все работают нормально....

pinMode(SD_CS, OUTPUT); if (!SD.begin(SD_CS)) { Serial.println("initialization failed!"); pinMode(PB1, OUTPUT); digitalWrite(PB1, HIGH); // turn the LED on (HIGH is the voltage level) return; } Serial.println("initialization done.");

Martinayotte
Пн 22 августа 2016 г., 13:03
Что ты имеешь в виду ?
Вы имеете в виду, что он работал с SD_SPI_CONFIGUTURE, чтобы нулевой и перестать работать, когда 1 ?

Вадимель
Вторник 23 августа 2016 12:02
#включать <Сд.час> не имеет функции поиска и #включать <SDFAT.час> не работал с "#define sd_spi_configuration 1"
Я перехожу к "#define sd_spi_configuration 1" И это работает.

Martinayotte
Ср 24 августа 2016 г. 12:28
Во -первых, библиотека SD и библиотека SDFAT - это не то же самое.
В первом, функция просто называется Seek (), а во втором - Seekset ().

Конечно, для SDFAT вам нужен sd_spi_configuration = 1, поскольку он будет использовать стандартную SPI.

Пито
Ср 14 сентября 2016 г., 11:06
К вашему сведению - последняя SDFAT -бета (Mmini, 36 МГц SPI) и «скамейка» с размером буфера 512Bytes и новым классом SDFATEX: Type any character to start FreeStack: 14444 Type is FAT32 Card size: 8.03 GB (GB = 1E9 bytes) Manufacturer ID: 0X1B OEM ID: SM Product: 00000 Version: 1.0 Serial number: 0X8D172C54 Manufacturing date: 1/2015 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 3528.36,22171,135,143 3654.74,7632,135,138 Starting read test, please wait. read speed and latency speed,max,min,avg KB/Sec,usec,usec,usec 3280.63,1512,154,154 3282.78,1429,154,154 Done Type any character to start

Rogerclark
Ср 14 сентября 2016 г., 8:49 вечера
Re: SDIO

Это может быть возможно с Arduino Core, который разрабатывает STM.

Я попросил их поместить SDIO в свой список TODO, но в Momemt я не знаю, есть ли у них ресурсы для создания SDIO LIB для их ядра.

(См. Мое сообщение о объявлении в разделе объявлений)

Стивестронг
Чт 15 сентября 2016 г., 7:34 утра
В любом случае, SDIO не имеет значения для семейства F103 с промежуткой менее 768 КБ, такими как текущие синие и красные таблетки.
Для любого другого, специально Arch Max, более чем приветствуется :)

Пито
Чт 15 сентября 2016 г. 8:05 утра
Да, SDIO доступен только на больших чипах, я также где -то читал, т.е. 407 SDIO - багги, первая хорошо работающая на 446.
Я провел несколько наивных экспериментов лет назад на 407 и Chibios, я сделал 6 Мбит/с с 32 -километровыми блоками и дешевой SDCard, не уверен, что он был правильно настроен, однако :?
В любом случае, 3.5 Мбит/с/с большим буфером 512bytes на Maplemini SPI - это впечатляющее число, конечно..
Это так близко к теоретическому пределу с 36 МГц часами SPI.. Невероятный : шок:

Стивестронг
Чт 15 сентября 2016 г. 8:52 утра
Хм, скорость записи (3.5) выше скорости чтения (3.2) ? Это действительно нормально?
В любом случае, просто для записи, я нашел Обсуждение ошибок SDIO на форуме ST.
Их эталон: 2.8 написать, 9.4 Читать с использованием FATFS & 4 -битный режим SDIO на дискотеке STM32F4.

Пито
Сб 17 сентября 2016 г. 10:26 утра
Хм, скорость записи (3.5) выше скорости чтения (3.2) ? Это действительно нормально?
В любом случае, просто для записи, я нашел обсуждение ошибок SDIO на ST Forum.
Их эталон: 2.8 написать, 9.4 Читать с использованием FATFS & 4 -битный режим SDIO на дискотеке STM32F4.
Скорость записи выше, так как у современных карт был большой баран.. (Информация: Биллг, автор SDFAT).
На Teensy 3.6 Билл сделал 19/20 МБ/сек с SDIO и последней SDFAT-бета, он утверждает:
https: // форум.PJRC.com/threads/36737-tr ... Post115239

PS: ум, он управляет Teensy 3.6 @240 МГц : шок:
https: // www.Kickstarter.com/projects/pa ... -35 и 36

Rogerclark
Сб 17 сентября 2016 г. 11:03
Пито написал:
PS: ум, он управляет Teensy 3.6 @240 МГц : шок:
https: // www.Kickstarter.com/projects/pa ... -35 и 36

Фоно
Чт 22 сентября 2016 г., 19:31
Итак, позвольте мне прыгнуть в подножку и рассказать мне о статусе SDFAT? Где я могу его найти? Можно ли использовать SPI для использования, чтобы я мог воспользоваться слотом SD на досках Olimex ?

Пито
Пт 23 сентября 2016 г. 10:28 утра
https: // github.com/greiman/sdfat-бета

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

Вадимель
Чт 29 сентября 2016 г., 21:23
Нужен пример, замените Chars в файле.

У меня есть файл как 12345 434 3 fg23r 34f3 2g42h 34 3 h3443 f34 43f

Стивестронг
Пт 30 сентября 2016 г., 7:15 утра
- Откройте файл как O_RD_WR
- файл.rewind ();
while (указатель файла не в конце) {
- Посмотрите на символ (указатель чтения не будет увеличен) - я думаю, что это функция: файл.peek ();
- if (char == '3') затем: файл.написать ('1'); // указатель будет увеличен
- else: Указатель файла приращения
}

Вадимель
Пт 30 сентября 2016 г. 13:38
Стивестронг Спасибо, это работа. while (myFile.available()) { check = myFile.peek(); if (check == '2') { myFile.write('1'); } myFile.read(); } myFile.close();

Стивестронг
Пт 30 сентября 2016 г. 13:43
Добро пожаловать ;)

Мэнни
Пн 10 октября 2016 г., 18:29
Пито написал:https: // github.com/greiman/sdfat-бета
Вы можете назначить то, что вы хотите, я думаю, что это поддерживает два SPI с двумя картами параллельно сейчас..

Rogerclark
Пн 10 октября 2016 г., 8:58 вечера
Мэнни

Какой файл имеет опечатку? И на каком номере строки?

Мэнни
Пн 10 октября 2016 г., 22:54
Rogerclark написал:Мэнни

Какой файл имеет опечатку? И на каком номере строки?

Rogerclark
Вт 11 октября 2016 г. 2:06
Ах ОК

Не в моем коде, тогда ;-)

Стивестронг
Вт 11 октября 2016 г. 9:14
Мэнни написал:Опечатка в SDFAT-бета, линия 29 в Spidriver/SDSPISTM32F1.CPP

Мэнни
Вт 11 октября 2016 г. 16:06
Стивестронг написал:Мэнни написал:Опечатка в SDFAT-бета, линия 29 в Spidriver/SDSPISTM32F1.CPP

Санджупракаш
Солнце 30 октября 2016 г. 8:34
Привет.

Я пытался выполнить большинство кодов, присутствующих на странице Github Victor_PV на моей доске минимальной разработки STM32F103C8T6. Я получил Sdinfo, Bench и Printbenchmark. LowlatencyLogger Компилируется и загружается хорошо, но на серийном мониторе ничего не отображается, но ничего не отображается. Не могли бы вы указать, что может пойти не так?

А также может кто -нибудь сказать мне, какие другие коды SD, которые хорошо работают на STM32F103C8T6, так как я застрял на расшифровке, что делать, чтобы доставить плату для регистрации на SD -карту как можно более быстро.

Стивестронг
Солнце 30 октября 2016 г., 9:40
Я предлагаю использовать в качестве основы пример «Rawwrite», это подходит для быстрого написания карт SD, с или без поддержки или без него.
Последняя SDFAT-бета от Greiman также должна работать, но еще не пробована.
В настоящее время я работаю с модифицированной версией, двойным базовым сбором и хранением на основе DMA (в то время как DMA записывает данные из ADC в один буфер, другой буфер, записанный на SD-карту, я думаю, что я уже разместил пример. ).
Я достигаю ~ 350 Кбит/с (4 аналоговых канала, двойное одновременное преобразование с использованием ADC1 и ADC2 параллельно, 12Bits/Channel, 44.Частота отбора проб 1 кГц, 1 секунда) без потери байта, но без жира.
Теперь изо всех сил пытается добиться быстрого вычитания с карты без DMA...

Санджупракаш
Солнце 30 октября 2016 г. 11:08
Стивестронг написал:Я предлагаю использовать в качестве основы пример «Rawwrite», это подходит для быстрого написания карт SD, с или без поддержки или без него.
Последняя SDFAT-бета от Greiman также должна работать, но еще не пробована.
В настоящее время я работаю с модифицированной версией, двойным облученным аналоговым приобретением и хранением на основе DMA (в то время как DMA записывает данные FRO ADC в один буфер, а другой буфер записывается на SD-карту, я думаю, что я уже где-то разместил пример ).
Я достигаю ~ 350 Кбит/с (4 аналоговых канала, двойное одновременное преобразование с использованием ADC1 и ADC2 параллельно, 12Bits/Channel, 44.Частота отбора проб 1 кГц, 1 секунда) без потери байта, но без жира.
Теперь изо всех сил пытается добиться быстрого вычитания с карты без DMA...

Стивестронг
Пн, 31 октября 2016 г., 9:16
Здесь это старая, но все еще работающая версия, хороша для приспособления к основам.
В (проблема »есть« проблема »старше) Sdfat lib, потому что если вы хотите пройти без жира или какой -либо другой файловой системы, SD.function () функция возвращает ошибку.
Вам просто нужно игнорировать эту ошибку, и она будет хорошо работать только с помощью CacheClear, WriteStart, writedata, функций WriteStop (также см. Справочные документы SDFAT LIB). Таким образом, вы пишете данные непосредственно на блок карт постепенно.
Для блочного инкрементного необработанного чтения (без жира) я использую readstart, readdata, функции Readstop.
Скоро я обновлю файл, когда получаю загрузку (от SD -карты на ПК над USB Serial), работающая как можно быстрее.

Шериннкпотеин
Пт 14 апреля 2017 г. 22:01
Пришли из линейки Arduino, всегда читал о том, как DMA может улучшить некоторые мирские, но необходимые задачи в качестве данных регистрации на SD -карту. Наконец, будучи переданными с модулем SD -карты 3V3 (Gawd, почему они так сложно получить) Я подумал, почему не попробовать.
Теперь, когда вечер был решен.

Ниже приведены результаты из примера файла лавка библиотеки SDFAT Билл Гриман.

SD Card = Sandisk Class 10 32 ГБ (02/2015)
Размер файла, который будет записан = 10 МБ
Протестировано с различными размерами буферов от 512B до 16 КБ (да, я тоже это попробовал) с DMA и без него.

Карта была отформатирована после каждого прогона с использованием утилиты SD Formatter, разработанной SD Association и SPI Speed, установленной на полную скорость.
Цифры усреднены по двум пробегам для каждого теста

Как видно, что DMA ускоряет процесс для буфера достаточного размера, достигающего скорости до 3.2 Мбит / с. Даже реализация без DMA для буфера 8 КБ дала 3X производительность, за исключением которой закон снижения возврата Наступил.
sped_wr.png
sped_wr.PNG (21.18 киб) просмотрено 1119 раз

Шериннкпотеин
Пт 14 апреля 2017 г. 22:17
dma_dist.png
dma_dist.PNG (22.2 киб) просмотрено 1118 раз

Пито
Пт 14 апреля 2017 г. 22:58
Я сделал 3.5 МБ/с @36 МГц SPI с большим буфером всего 512 баллов. Сообщили где -нибудь в этой теме..
ViewTopic.PHP?f = 13&t = 20&начало = 120#p17911

Шериннкпотеин
Пт 14 апреля 2017 г. 11:06 вечера
Пито написал:Я сделал 3.5 МБ/с @36 МГц SPI с большим буфером всего 512 баллов. Сообщили где -нибудь в этой теме..

Пито
SAT 15 апреля 2017 г. 8:11
Вам нужна новейшая SDFAT-бета, а также умом, чтобы включить EX-режим в SDFATCONFIG.час..

Стивестронг
SAT 15 апреля 2017 г. 8:13
Что бывшее приносит больше, чем «нормальная» бета?

Пито
SAT 15 апреля 2017 г. 8:17 утра
Xtimes быстрее wr/rd speed.. Шериннкпотеин проверит это :)

nicolas_soundforce
Солнце 06 августа 2017 г., 17:35
Я хочу прочитать 2 файла одновременно. Могу ли я просто подать.open () 2 файлы параллельно ? У меня сейчас проблемы, и это не работает, как и ожидалось.

Стивестронг
Солнце 06 августа 2017 18:31
Сможете ли вы помочь, если прочитаете то, что написали? Я не должен никого волшебного мяча...

victor_pv
Пн, 07 августа 2017 2:04
[nicolas_soundforce - Солнце 06 августа 2017 17:35] - Я хочу прочитать 2 файла одновременно. Могу ли я просто подать.open () 2 файлы параллельно ? У меня сейчас проблемы, и это не работает, как и ожидалось.
Вам необходимо объявить 2 -й «файловые» объекты, например, File1 и File2, затем вы можете работать над каждым отдельно: file1.open() file2.open() file2.read...

nicolas_soundforce
Вторник 8 августа 2017 г., 21:02
Спасибо, Виктор, это сработало без каких -либо проблем.

Стивестронг
Пн 18 сентября 2017 г. 20:12
Просто к вашему сведению, я добавил поддержку F4 (SPI и SDIO) в библиотеку SDFAT от Greiman: https: // github.com/stevstrong/sdfat
PR продолжается: https: // github.com/greiman/sdfat/pull/69