Намекает на библиотеку MMC/SD -карт от Roland Riegel

STM32
Ср 29 марта 2017 г. 20:06
Hy, ребята.
Большое спасибо за этот замечательный форум!
Я здесь новый пользователь.
У меня есть проект Arduino, который я хотел бы надеть на «синюю таблетку» STM32.
Моя цель - использовать «синюю таблетку» вместо Arduino, чтобы запустить это:
https: // github.com/krisztian1997/3dsunbricker
Следуя этой инструкции

http: // www.STM32duino.com/viewtopic.PHP ... = синяя+таблетка

Я добавил библиотеку и эскиз в моей среде Arduino IDE.
с текущим релизом 1.8.1 из Arduino IDE во время компиляции я получаю эти сообщения об ошибках:

C: \ users \ ferrario \ documents \ arduino \ библиотеки \ sdrawroland \ sd_raw_roland.CPP: 6: 24: фатальная ошибка: AVR/IO.H: нет такого файла или каталога

#включать <avr/io.час>


Установив знак замечания перед #include <avr/io.час> в SD_RAW_ROLAND.CPP, тогда я получаю эти сообщения об ошибках:

...\ Arduino \ библиотеки \ sdrawroland/sd_raw_config_roland.H: 114: 6: Ошибка: #Error "Нет SD/MMC -картирование PIN!"

#error "Нет SD/MMC -картирование доступно!"


Используя Arduino IDE 1.6.9 I GT только последние сообщения об ошибках:

...\ Arduino \ библиотеки \ sdrawroland/sd_raw_config_roland.H: 114: 6: Ошибка: #Error "Нет SD/MMC -картирование PIN!"

#error "Нет SD/MMC -картирование доступно!"


Поэтому я решил использовать Arduino IDE 1.6.9 за мои попытки.
Среда STM32, которую я сделал, в порядке, потому что я могу собрать простые примеры, но когда я пытаюсь скомпилировать проект 3dsunbricer, он не удается.
Может быть, библиотека Роланда Ригеля не работает из коробки с STM32 или более простым, необходимо указать в нем выводы SPI для платы STM32F103C8.
Действительно, составляя Arduino IDE 1.6.9 говорит:

...\ Arduino \ библиотеки \ sdrawroland/sd_raw_config_roland.H: 114: 6: Ошибка: #Error "Нет SD/MMC -картирование PIN!"

#error "Нет SD/MMC -картирование доступно!"


Поиск я обнаружил, что правильные булавки должны быть этими:

STM32 SD/MMC
PA4 SD_SS
PA5 SD_SCK
Pa6 sd_do (= мисо)
Pa7 sd_di (= mosi)


Я почти уверен, что они правы, потому что я их отсюда получил:

http: // www.STM32duino.com/viewtopic.PHP?T = 117#P950
http: // reblag.dk/wordpress/wp-content/u ... Яграмма.PDF

В любом случае что -то странное в диаграмме из -за того, что SPI провода на контактах A4, A5, A5 и A7 предназначены для SPI -канала 1, точно так же, как и на контактах A15, B3, B4 и B5.
Я думаю, это опечатка.

Но в SD_RAW_CONFIG_ROLAND.H он использовал другой формат для настройки доступа к порту SD/MMC, что -то подобное:

/ * Определяет для настройки доступа к порту SD/MMC */
#F определено (__ avr_atmega8__) || \
Определено (__ avr_atmega48__) || \

(Строки с 69 и далее в SD_RAW_CONFIG_ROLAND.час)


Интересно, как я могу добавить правильные для "синей таблетки"?

На самом деле я подозреваю, что этот вопрос сложнее справиться, поэтому в конце.
Мне нужно инициализировать любое SD, чем MMC, и библиотека MMC/SD -карт от Roland Riegel - единственное, что я знаю, что изначально допускает обе виды карты.
На Arduino я попробовал модифицированную стандартную библиотеку SD и модифицированную Libray SDFAT, но, к сожалению, я не мог заставить их работать с «синей таблеткой».
Однако библиотека карт Roland Riegel MMC/SD гораздо лучше в этом сценарии.
Любой намек?
заранее спасибо.

STM32

Рик Кимбалл
Ср 29 марта 2017 г. 11:27
Зачем беспокоиться? Я имею в виду, почему бы просто не купить клон Arduino Atmega и просто использовать его.

Zoomx
Чт 30 марта 2017 г. 9:10
Вы можете использовать также адаптер SD для ПК и написать свое резервное изображение NAND, используя некоторые утилиты, такие как Win32diskimager. Вам все еще нужно припаять.

STM32
Чт 30 марта 2017 г. 18:55
Привет, Рик,
У меня уже есть Arduino, это Mega 2560.
Конечно, библиотека и эскиз функционируют, но Mega 2560 слишком громоздкий для моих целей.
Мне нужно что -то маленькое, что -то вроде нано.
Пока я выбирал, я думал, что «синяя таблетка» может быть разумным выбором.
В любом случае, в конце концов, я думаю, что библиотека карт MMC/SD от Roland Riegel может быть полезна, потому что SDFAT был перенесен на STM32, но не позволяет MMC.
Для Mega я изменил SD и SDFAT, чтобы поддержать карты MMC, для среды STM32 я не в состоянии добиться успеха.
Для меня еще один важный момент - понять, можно ли и как использовать один и тот же синтаксис

/ * Определяет для настройки доступа к порту SD/MMC */
#F определено (__ avr_atmega8__) || \
Определено (__ avr_atmega48__) || \

для STM32, хотя.
Я хотел бы сделать портативное устройство для обслуживания и ремонта, это моя цель.

STM32

STM32
Чт 30 марта 2017 г. 18:56
Привет Zoomx,
паянка для меня не совсем проблема.
Честно говоря, я не понимаю, что ты имеешь в виду.
Тогда все это не так просто, как вы описали.
Чтобы сделать то, что вы написали, нужен компьютер, как некоторые ноутбуки, на которых считывает MMC/SD, непосредственно подключенный к шине PCI.
Я знаю, что в последнее время Ubuntu может делать такие вещи, но ему нужен какой -то аппаратный аппарат, который слишком громоздкий для моих целей, и это не автономно.
Дело совершенно отличается с использованием «синей таблетки», которая маленькая и автономная.

STM32

victor_pv
Чт 30 марта 2017 г., 21:46
STM32 написал:Привет, Рик,
У меня уже есть Arduino, это Mega 2560.
Конечно, библиотека и эскиз функционируют, но Mega 2560 слишком громоздкий для моих целей.
Мне нужно что -то маленькое, что -то вроде нано.
Пока я выбирал, я думал, что «синяя таблетка» может быть разумным выбором.
В любом случае, в конце концов, я думаю, что библиотека карт MMC/SD от Roland Riegel может быть полезна, потому что SDFAT был перенесен на STM32, но не позволяет MMC.
Для Mega я изменил SD и SDFAT, чтобы поддержать карты MMC, для среды STM32 я не в состоянии добиться успеха.
Для меня еще один важный момент - понять, можно ли и как использовать один и тот же синтаксис

/ * Определяет для настройки доступа к порту SD/MMC */
#F определено (__ avr_atmega8__) || \
Определено (__ avr_atmega48__) || \

для STM32, хотя.
Я хотел бы сделать портативное устройство для обслуживания и ремонта, это моя цель.

STM32

Рик Кимбалл
Чт 30 марта 2017 г. 11:20
STM32 написал:Привет, Рик,
У меня уже есть Arduino, это Mega 2560.
Конечно, библиотека и эскиз функционируют, но Mega 2560 слишком громоздкий для моих целей.
Мне нужно что -то маленькое, что -то вроде нано.

Стивестронг
Пт 31 марта 2017 г. 7:32 утра
Рик Кимбалл написал:Моя точка зрения была стоимость нано, как 3 доллара. Время, которое потребуется, чтобы сделать функцию кода на чертеже, кажется нетривиальным. Мой вопрос: почему бы просто не купить нано за 3 доллара и покончить с этим? Если ваша конечная цель состоит в том, чтобы использовать BluePill, то хорошо. Если ваша конечная цель - просто играть в игры, то это кажется пустой тратой времени, переносив все.

Zoomx
Пт 31 марта 2017 г. 9:02 утра
STM32 написал:Привет Zoomx,
паянка для меня не совсем проблема.
Честно говоря, я не понимаю, что ты имеешь в виду.
Тогда все это не так просто, как вы описали.
Чтобы сделать то, что вы написали, нужен компьютер, как некоторые ноутбуки, на которых считывает MMC/SD, непосредственно подключенный к шине PCI.
Я знаю, что в последнее время Ubuntu может делать такие вещи, но ему нужен какой -то аппаратный аппарат, который слишком громоздкий для моих целей, и это не автономно.
Дело совершенно отличается с использованием «синей таблетки», которая маленькая и автономная.

STM32

STM32
Пт 31 марта 2017 г., 19:31
Спасибо, ребята, вы открываете мой разум.

@victor_pv

Я согласен, но изначально SDFAT не поддерживает MMC, поэтому я не могу его использовать.
Что я хотел знать, так это то, что можно было бы реализовать на STM32 такую ​​вещь, не столько лидерство этой библиотеки в STM32.
Я имею в виду управление MMC/MMC+/EMMC на «синей таблетке», как и ту же Arduino.
Теперь я понимаю, что это не так просто.
Больше шансов будет изменить бета -версию SDFAT, чтобы разблокировать MMC.
Я знаю, что это работает на стороне Arduino (я сам проверил это на Uno и Mega), поэтому я приложу больше усилий на это.
Мое начальное сомнение было относительно синтаксиса, который я написал, и если бы была такая вещь даже для STM32.
Поскольку никто не писал об этом, я понимаю, что это не существует в стороне STM32.

@Rick

Как я уже писал со своей стороны - это не вопрос затрат, а в том, чтобы иметь возможность делать это с другим оборудованием, чем Arduino, лучше, если новые не громоздкие.
Я хотел посмотреть, есть ли какой -нибудь известный способ управлять MMC с «синей таблеткой».
Я думал, было бы полезно добавить эту возможность.
Я знаю, что Ардуино может выполнять работу, а STM32 - нет (до сих пор), у меня есть один путь, чтобы пойти.

@stevestrong

+1
Я тоже сейчас, когда у меня есть ваши ответы.

@zoomx

Я понимаю сейчас.
На самом деле мой был таким же примером, я не собирался повторять проект на «синей таблетке», а скорее, чтобы иметь способ изначально управлять картами MMC на нем.
Я показал эскиз, чтобы иметь смысл во всем контексте библиотеки Роланд Ригеля, которая находится в состоянии управлять как MMC, так и SD -картами.
В любом случае, мне кажется, что в последнее время Ubuntu может выполнять задание при запуске на аппаратном обеспечении, которое позволяет прямо подключаться к шине PCI для читателя.
Raspberry Pi тоже делает это точно.
В таком сценарии было бы достаточно простого адаптера, который позволяет вывести за пределы необходимых сигналов, чтобы подключить их к устройству, где вы хотите работать.

STM32

Стивестронг
Пт 31 марта 2017 г., 8:02 вечера
Позвольте мне сказать так:
Работа может быть выполнена любым из тех, кто прокомментировал в течение часа (адаптируйте процедуры SPI и настройку)
Но тогда вы ничего не узнали.
И ты аппаратный парень...Если вы хотите изучать SW и действительно научиться работать с «синей таблеткой», то вы должны сделать это самостоятельно или, по крайней мере, попробуйте.
Итак, если вы просматриваете уже портированные библиотеки, то вы можете увидеть, как иметь дело с #ifdefs, есть даже примеры, как заменить регистры AVR DDR.
Просто покажи нам, что вы попробовали, и тогда мы скажем вам, как сделать это правильно.

Zoomx
Пт 31 марта 2017 г., 8:19 вечера
В чем разница в библиотеке Arduino между чтением SD и чтением MMC?

Martinayotte
Пт 31 марта 2017 г., 20:24
STM32 написал: Я согласен, но изначально SDFAT не поддерживает MMC, поэтому я не могу его использовать.

STM32
Пт 31 марта 2017 г., 21:31
Привет, Стивестронг,
Я полностью согласен с тобой.
Но подождите минуту, на самом деле я никому не просил что -нибудь сделать.
Я только спросил о синтаксисе, который я написал, потому что он странно на моих глазах, и, думая, что это может быть связано с возможностью достичь моей цели.
Вы и другие ребята указали на меня и их мнение, поэтому я узнал, что это лучше для меня, иди еще один путь.
Действительно, теперь я пытаюсь изменить SD и SDFAT, чтобы позволить MMC, точно так же, как я уже делал на Arduino задолго до того, как обнаружил библиотеку Роланд Ригеля.
Я говорил об этом наброске, который я связал, и библиотеку Роланда Ригеля только надеясь, что это будет легче запустить на STM32.
Как я писал, я аппаратный парень, поэтому, пожалуйста, извините за то, что я так наивен на стороне программного обеспечения.
Спасибо.

STM32

STM32
Пт 31 марта 2017 г., 21:32
Привет Zoomx,
за то, что я знаю, это должно быть что -то связанное с инициализацией карт.
Действительно, изменения, которые я внося в библиотеках, касаются инициализации.
Я знаю, что это грубый способ, но он работает, или, по крайней мере, это работало на Arduino.
Спасибо.

STM32

STM32
Пт 31 марта 2017 г., 21:33
Привет, Мартинайотт,
Я согласен с библиотекой SDFAT.
Дело в том, что устройство, на котором мне нужно выполнять обслуживание, не позволяет для SD, но только для MMC и MMC+.
На самом деле мне достаточно получить контент CSD, CID и немноги.
Из -за того, что для моей цели мне все еще пришлось адаптироваться, стандартной библиотеки SD или SDFAT, я хотел узнать о библиотеке Роланд Ригеля, поскольку она изначально управляет MMC и MMC+ и, казалось, мне больше подходил для этой цели.
Спасибо.

STM32

victor_pv
SAT 01 апреля 2017 г. 12:07
По вашему вопросу о #ifdef, тот, который для нашего ядра #if defined(__STM32F1__)

Стивестронг
SAT 01 апреля 2017 14:22
Если бы мне нужно было что -то перенести, я бы начал с комментировать части файлов заголовка, которые связаны с AVR.
Затем пройдите код CPP и замените функциональность.

Например:
- прокомментировать строка 6 файла CPP
- добавить #include "spi.час"
- заменять Линии 219-227 Автор: SPI.BeginTransaction (Spisettings (250000, data_mode0, msb_first));
- и так далее.

STM32
Солнце 02 апреля 2017 г. 15:53
Привет, Victor_pv,
Большое спасибо за ваш подсказка.
Я не ушел, мне нужно только время, чтобы найти решение.
Я попробовал ваше предложение, я положил SD SPI STM32F1.CPP в той же папке модифицированной версии SDFAT, который я сделал, но вещь не работает:

Файл, включенный из C: \ arduino \ Libraries \ SDFAT/SDFAT.H: 38: 0,

от c: \ arduino \ библиотеки \ sdfat \ Примеры \ mmc \ mmc.Ино: 4:

C: \ arduino \ library \ sdfat/sdfile.H: 44: 7: Ошибка: Конфликтный тип возврата, указанный для «Virtual int sdfile :: write (const char*) '

int write (const char* str);

^

В файле, включенном из C: \ arduino \ hardware \ arduino_stm32 \ stm32f1 \ cores \ maple/ardwareserial.H: 38: 0,

от c: \ arduino \ ardware \ arduino_stm32 \ stm32f1 \ cores \ maple/wirish.H: 69,

от c: \ arduino \ hardware \ arduino_stm32 \ stm32f1 \ cores \ maple/arduino.H: 30,

от Sketch \ MMC.Ино.CPP: 1:

C: \ arduino \ arpware \ arduino_stm32 \ stm32f1 \ cores \ maple/print.H: 41: 20: ошибка: переоценка 'Virtual Size_t print :: write (const char*)'

virtual size_t write (const char *str);

^

Статус выхода



Моя модифицированная версия SDFAT основана на основной версии 20131225.
Чтобы разблокировать поддержку MMC для SDFAT, изменения, которые я внес, попадают в SD2Card.CPP и Sdinfo.час.
В основном в SD2Card.CPP я изменил оригинальную линию 176 с

возврат 0;

к

возврат 1;

Это отключает проверку ошибок, в то время как инициализация позволяет коду продолжаться, несмотря на все.

Затем сразу после строки 259

bool sd2card :: begin (uint8_t chipselectpin, uint8_t sckdivisor) {

Я добавил строку 260 как:

bool usecmd1 = false;

Это для определения команды cmd1, которая используется для инициализации карт MMC.

Затем я заменил исходные линии с 309 до 315 на них:

в то время как (cardacmd (acmd41, arg) != R1_ready_state) {
// Проверка на время ожидания
if (((uint16_t) millis () - t0) > Sd_init_timeout) {
ошибка (SD_CARD_ERROR_ACMD41);
goto неудача;
}
}

Это для того, чтобы выполнить действительную инициализацию как для карт SD и MMC.

Наконец в Sdinfo.H Я добавил определение для CMD1 как строка 37 и 38:

/** send_op_cond*/
uint8_t const cmd1 = 0x01;

Это для того, чтобы иметь возможность использовать новую команду.
Я сделал все эти изменения в основе того, что я читал где -то в сети, но я точно забыл, где.
Поэтому я не помню, кто настоящий автор, в любом случае, с Arduino, это работает, хотя мне нужно было изменить оригинальные наброски в SDFAT из -за того, что они больше не функционировали, как будто они просто вне коробки.
В приложении находятся модифицированные файлы и пример наброска для тех, кто может найти его полезным или другим.
Обратите внимание на то, что это очень грубый код, и он работает только на Arduino.
Тем временем я продолжу тест, и я выложу решение, если найду его.
Спасибо.

STM32

STM32
Солнце 02 апреля 2017 г. 15:55
Привет, Стивестронг,
Большое спасибо за полезные советы.
Как вы и другие заставили меня понять, что я все еще слишком новичок, чтобы работать над портированием, поэтому я попробую в будущем.
На самом деле портирование не было в моем намерении, мне просто нужно было что -то, что могло справиться с картами MMC.
Следуя вашим указаниям, я сейчас работаю над SDFAT, что мне может быть гораздо проще из -за того, что в прошлом я преуспел с ним в сторону Arduino.
Спасибо.

STM32

victor_pv
Солнце 02 апреля 2017 г., 17:37
Можете ли вы опубликовать ссылку на версию библиотеки SDFAT, которую вы используете?

STM32
Ср. 05, 2017, 20:37
Привет

@Victor_pv,
Как я написал библиотеку SDFAT, которую я использую, является версией 20131225.
В настоящее время я не могу получить его из репозитория, и важно быть прикрепленным здесь.
Я знаю, что он очень старый, поэтому я скачал более позднюю версию SDFAT 20160719, которую я постараюсь изменить, чтобы разрешить MMC, хотя этот релиз довольно отличается как структура.
Я должен взглянуть на это, прежде чем я смогу внести необходимые изменения, чтобы разрешить карты MMC, но сначала я хотел попробовать Libray с обычными SD -картами.
Как только появится что -то новое, я опубликую.
Бак

STM32

Маленький От.
Здесь началось что -то странное.
Я без проблем собрал пример наброска SDINFO, а затем положил его на синюю таблетку, но код не начинается, как следует.
На самом деле каждый раз, когда я начинаю терминал, он пуст, текст нет:

Версия SDFAT: 20160719

Предполагая, что SD является единственным устройством SPI.
Редактировать Disable_chip_select, чтобы отключить другое устройство.

Предполагая, что выберите SD -штифт: 53
Редактировать SD_CHIP_SELECT, чтобы изменить SD CHIP SELECT PIN.

Введите любого персонажа, чтобы начать

Даже не начинать все это с SD Shield не подключенным.
В эскиз, который я установил
Sd_chip_select = pa4;
и когда связывается SD Shield, я использую

PA5 SD_SCK
Pa6 sd_do (= мисо)
Pa7 sd_di (= mosi)

Я пытался переместить данные на SPI2, но ничего не изменилось, терминал всегда пуст.
Мне кажется, что «синяя таблетка» работает, потому что, используя другие примеры, например, test_rtclock, то терминал правильно показывает данные.
Я использую Arduino IDE 1.8.1 терминал.

victor_pv
Чт, 06 апреля 2017 г., 2:40
STM32 написал:Привет

@Victor_pv,
Как я написал библиотеку SDFAT, которую я использую, является версией 20131225.
В настоящее время я не могу получить его из репозитория, и важно быть прикрепленным здесь.
Я знаю, что он очень старый, поэтому я скачал более позднюю версию SDFAT 20160719, которую я постараюсь изменить, чтобы разрешить MMC, хотя этот релиз довольно отличается как структура.
Я должен взглянуть на это, прежде чем я смогу внести необходимые изменения, чтобы разрешить карты MMC, но сначала я хотел попробовать Libray с обычными SD -картами.
Как только появится что -то новое, я опубликую.
Бак

STM32

Маленький От.
Здесь началось что -то странное.
Я без проблем собрал пример наброска SDINFO, а затем положил его на синюю таблетку, но код не начинается, как следует.
На самом деле каждый раз, когда я начинаю терминал, он пуст, текст нет:

Версия SDFAT: 20160719

Предполагая, что SD является единственным устройством SPI.
Редактировать Disable_chip_select, чтобы отключить другое устройство.

Предполагая, что выберите SD -штифт: 53
Редактировать SD_CHIP_SELECT, чтобы изменить SD CHIP SELECT PIN.

Введите любого персонажа, чтобы начать

Даже не начинать все это с SD Shield не подключенным.
В эскиз, который я установил
Sd_chip_select = pa4;
и когда связывается SD Shield, я использую

PA5 SD_SCK
Pa6 sd_do (= мисо)
Pa7 sd_di (= mosi)

Я пытался переместить данные на SPI2, но ничего не изменилось, терминал всегда пуст.
Мне кажется, что «синяя таблетка» работает, потому что, используя другие примеры, например, test_rtclock, то терминал правильно показывает данные.
Я использую Arduino IDE 1.8.1 терминал.

STM32
Чт, 06 апреля 2017 г., 20:00
Привет, Victor_pv,
SD Shield, который я использую с «синей таблеткой», состоит только по разъему, нет другого оборудования, только 3,3 В.
Для Arduino я использую другой, который имеет конвертер уровня, потому что мой Arduino является одной из серий 5V.
Странная вещь не то, что я могу получить доступ к картам, а в том, что «синяя таблетка» не выполняет эскиз Sdinfo, терминал Arduino IDE не показывает никакого текста.
Я должен проверить шину данных с помощью осциллографа.
Также, запустив все это без какого -либо SD Shield, а именно с использованием только «синей таблетки», на терминале внутри Arduino Ide ничего не появляется.
Это факт.
В любом случае, я посмотрел в библиотеку, и я увидел то, что я думаю, мне нужно измениться, чтобы разблокировать поддержку MMC.
В выходные дни я постараюсь внести некоторые изменения и опубликую результаты.
Из -за проблемы, которую я написал, моя текущая цель состоит в том, чтобы достичь правильного сборника эскизов с помощью SDFAT, измененного мной, чтобы также позволить MMCS.
После этого я преуспею, я выкопаю вопрос о коде, который не появляется в терминале Arduino IDE, что странно, так как другие образцы наброски работают нормально с "Blue Pill".
Спасибо.

STM32

AG123
Чт, 06 апреля 2017 г., 21:26
Привет, STM32
1 -й, я почти ничего не знаю о внутренних картах SD против MMC -карт
Следовательно, я сделал Google и столкнулся с этим сайтом, я думаю, что это может быть довольно полезно в качестве отправной точки для информации
http: // wiki.моребейт.сопутствующий.NZ/WIKI/SDCARDPROTOCOL.HTML

Казалось, что MMC против SD довольно разные с точки зрения * протокола * (я.эн. Команды для доступа к внутренним картам), даже если оба используют шину SPI.
Я не уверен в этом на самом деле, спецификации словесны, и потребуется 1, чтобы рассмотреть, что, возможно, для этих портов «низкого уровня»
я.эн. Возможно, не так «легко» в виде скопления SDFAT, и, возможно, MMC-FAT, можно в конечном итоге переписать большие доли его (надеюсь, нет)
Возможно, кто -то более знакомый с SD против MMC находится в лучшем положении, чтобы прокомментировать это

Кроме того, я ничего не знаю о платформе Atmega (E.глин. Arduino Uno) также могут быть тонкие различия даже с такими вещами, как SPI и т. Д
Проверьте булавки и т. Д., чтобы увидеть, что они в конце концов правильно подключены к SPI и т. Д
http: // wiki.STM32duino.com/index.PHP?title = blue_pill

И с этими «низким уровнем уровня» это может действительно помочь исправить GDB / openocd и т. Д. Для отладков и т. Д., Я не слишком уверен, как тоже

Еще 2 ссылки
http: // elm-chan.org/docs/mmc/mmc_e.HTML
^^^ Это хороший сайт, по -видимому, есть что -то распространенное как в MMC, так и в SD, чтение этой сети
http: // ralimtek.com/stm32_spi_sd/

О да, я думаю, что есть также различные специфики для платформы STM32 '
эн.глин. Заключение периферийного автобуса
http: // электроника.Stackexchange.com/Qu ... Игитал-пот
^^^ Я думаю, что они обслуживаются в библиотеках, которые подключены через stm32_arduin
И такие вещи, как есть 2 шины SPI на STM32F103CBT6, убедитесь, что вы включили/включили правильную шину и «разговариваете» с правильной шиной
http: // www.ул.com/en/microcontrollers/stm32f103c8.HTML

Стивестронг
Пт 07 апреля 2017 г. 11:38
AG123 написал:Казалось, что MMC против SD довольно разные с точки зрения * протокола * (я.эн. Команды для доступа к внутренним картам), даже если оба используют шину SPI.
Я не уверен в этом на самом деле, спецификации словесны, и потребуется 1, чтобы рассмотреть, что, возможно, для этих портов «низкого уровня»
я.эн. Возможно, не так «легко» в виде скопления SDFAT, и, возможно, MMC-FAT, можно в конечном итоге переписать большие доли его (надеюсь, нет)
Возможно, кто -то более знакомый с SD против MMC находится в лучшем положении, чтобы прокомментировать это

AG123
Пт 07 апреля 2017 г., 19:27
@stevestrong

Я «смешанные чувства» по этому поводу. Я не совсем против идеи использования библиотеки «общей» SD / MMC, я.эн. Одна библиотека обслуживает обоих
Как указал в Интернете Elm-Chan, казалось бы, что SD и MMC делятся общими командами
http: // elm-chan.org/docs/mmc/mmc_e.HTML
Я предполагаю, что SD-FAT, возможно, является производной из оригинальной библиотеки Elm-Chan, следовательно, у нее уже может быть коды, которые совместим с картами SD и MMC

Тем не менее, я подумал, что SD против MMC DIVER -MEAR, когда функции, которые попали в новое оборудование (E.глин. Последний интерфейс SD-карт типа UHS / SDIO (не-SPI) и т. Д

Что касается того, почему может быть необходимо разделить библиотеки, самый простой способ подумать - это то, что у нас есть только 20 тыс. ОЗУ в STM32F103CB или STM32F103C8, который составляет Maple Mini и Blue Pill и многие другие платы STM32F103XX (i.эн. C-R средняя плотность Dev, меньше этих V и Z-серии)
Попытка использовать функции, специфичные для SD или MMC, означало бы, что заканчивается из оперативной памяти, прежде чем что -либо может быть сделано

Следовательно, я подумал, что наличие * отдельного * «самого низкого общего знаменателя» IMHO может быть не плохим, просто «самый низкий общий знаменатель» означает выбрасывать коды (я.эн. Снижение функций до минимального набора, но это может означать, что это SD или MMC), что это должно отличаться от SD против MMC.

И, кроме того, SD сегодня гораздо более распространен по сравнению с MMC, я согласен, что их отделение, вероятно, лучше

всего 2с

Стивестронг
Пт 07 апреля 2017 г. 22:15
Моя идея заключалась в том, чтобы только перенести код, который уже доказал, что для этого приложения на других целевых платах.
Так что я не говорю о общей либе, которая должна поддерживать как SD, так и MMC и кто знает, что еще или некоторые экзотические функции.
Я все еще убежден, что переносить либера.
Но из Корса, когда у кого -то есть лучший обзор, что на самом деле работает на заднем плане, другие подходы также были бы осуществимыми.

STM32
Чт 20 апреля 2017 г. 20:03
Привет, ребята,
Я все еще ищу решение, чтобы изменить библиотеку SDFAT, чтобы разрешить карты MMC.
До сих пор я не смог выполнить эту работу, потому что недавний релиз сильно отличается от старого, поэтому трюк, который я использовал в прошлом, больше не работает, честно говоря, даже не такой и тот же трюк с самым старым релизом 20131225, работает с моей «синей таблеткой». ".
В любом случае, занимаясь серфингом в Интернете, я нашел что -то очень похожее на подсказку, которую я использовал в прошлом, чтобы изменить со меня стандартную библиотеку SD Arduino и выпуск библиотеки SDFAT 20131225.
Как ваша ссылка, вот это:

https: // tinyurl.com/kwnnbe4

Внизу, среди некоторых мыслей в >32 Мысли о “Поддержка библиотеки Arduino SD для карт MMC”< объясняется, как трюк в библиотеке SDFAT для Arduino.
Я не сдаюсь, но теперь моя проблема заключается в другой стороне, которую я уже написал здесь, моя «синяя таблетка» не работает, как ожидается, из -за того, что терминал он пуст, нет вывода Эскиз.
С MSO я проверил вывод булавок и все это на 100%, но нет текста в качестве вывода на Arduino IDE 1.8.1 терминал.
Я также попробовал вторую «синюю таблетку» с тем же результатом.
Мне кажется, что две «синие таблетки», которые я использовал, работают, потому что, используя другие примеры на них, например, test_rtclock, тогда терминал правильно показывает данные.
Обе "синие таблетки" у них есть 1.5 -киомовый резистор подтягивания на D+ (R10 на плате).
Может ли кто -то, кто экспериментировал с «синей таблеткой», и карты SD, подтвердить, что вывод работает через USB на терминал?
В конечном итоге может кто -то предоставить пример кода, который можно использовать для тестирования или поместить ссылку на что -то подобное?
Спасибо.

STM32

Стивестронг
Чт 20 апреля 2017 г. 20:13
Попробуйте простой мигающий набросок с простым серийным выводом в петле, не включая заголовок SD -карты.
Проверьте 3.Уровень напряжения 3 В, регулятор борта-неделя.
Это должно быть ваше программное обеспечение, и мы не можем помочь, если вы не опубликуете его.

STM32
Чт 20 апреля 2017 г. 8:50 вечера
Привет, Стивестронг,
Спасибо.

Стивестронг написал:
Попробуйте простой мигающий набросок с простым серийным выводом в петле, не включая заголовок SD -карты.

Я сделал это, используя test_rtclock без проблем.

Стивестронг написал:
Проверьте 3.Уровень напряжения 3 В, регулятор борта-неделя.

Я использовал осциллограф MSO, и все в порядке.

Стивестронг написал:
Это должно быть ваше программное обеспечение, и мы не можем помочь, если вы не опубликуете его.

Мое программное обеспечение - это не мое, просто это пример SDINFO, предоставленный SDFAT Version 20160719.
Вот:
/* * This program attempts to initialize an SD card and analyze its structure. */ #include #include "SdFat.h" /* * SD chip select pin. Common values are: * * Arduino Ethernet shield, pin 4. * SparkFun SD shield, pin 8. * Adafruit SD shields and modules, pin 10. * Default SD chip select is the SPI SS pin. */ const uint8_t SD_CHIP_SELECT = PA4; /* * Set DISABLE_CHIP_SELECT to disable a second SPI device. * For example, with the Ethernet shield, set DISABLE_CHIP_SELECT * to 10 to disable the Ethernet controller. */ const int8_t DISABLE_CHIP_SELECT = -1; SdFat sd; // serial output steam ArduinoOutStream cout(Serial); // global for card size uint32_t cardSize; // global for card erase size uint32_t eraseSize; //------------------------------------------------------------------------------ // store error strings in flash #define sdErrorMsg(msg) sdErrorMsg_F(F(msg)); void sdErrorMsg_F(const __FlashStringHelper* str) { cout << str << endl; if (sd.card()->errorCode()) { cout << F("SD errorCode: "); cout << hex << int(sd.card()->errorCode()) << endl; cout << F("SD errorData: "); cout << int(sd.card()->errorData()) << dec << endl; } } //------------------------------------------------------------------------------ uint8_t cidDmp() { cid_t cid; if (!sd.card()->readCID(&cid)) { sdErrorMsg("readCID failed"); return false; } cout << F("\nManufacturer ID: "); cout << hex << int(cid.mid) << dec << endl; cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { cout << cid.pnm[i]; } cout << F("\nVersion: "); cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; cout << F("Serial number: ") << hex << cid.psn << dec << endl; cout << F("Manufacturing date: "); cout << int(cid.mdt_month) << '/'; cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; cout << endl; return true; } //------------------------------------------------------------------------------ uint8_t csdDmp() { csd_t csd; uint8_t eraseSingleBlock; if (!sd.card()->readCSD(&csd)) { sdErrorMsg("readCSD failed"); return false; } if (csd.v1.csd_ver == 0) { eraseSingleBlock = csd.v1.erase_blk_en; eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; } else if (csd.v2.csd_ver == 1) { eraseSingleBlock = csd.v2.erase_blk_en; eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low; } else { cout << F("csd version error\n"); return false; } eraseSize++; cout << F("cardSize: ") << 0.000512*cardSize; cout << F(" MB (MB = 1,000,000 bytes)\n"); cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); cout << F("eraseSingleBlock: "); if (eraseSingleBlock) { cout << F("true\n"); } else { cout << F("false\n"); } return true; } //------------------------------------------------------------------------------ // print partition table uint8_t partDmp() { cache_t *p = sd.vol()->cacheClear(); if (!p) { sdErrorMsg("cacheClear failed"); return false; } if (!sd.card()->readBlock(0, p->data)) { sdErrorMsg("read MBR failed"); return false; } for (uint8_t ip = 1; ip < 5; ip++) { part_t *pt = &p->mbr.part[ip - 1]; if ((pt->boot & 0X7F) != 0 || pt->firstSector > cardSize) { cout << F("\nNo MBR. Assuming Super Floppy format.\n"); return true; } } cout << F("\nSD Partition Table\n"); cout << F("part,boot,type,start,length\n"); for (uint8_t ip = 1; ip < 5; ip++) { part_t *pt = &p->mbr.part[ip - 1]; cout << int(ip) << ',' << hex << int(pt->boot) << ',' << int(pt->type); cout << dec << ',' << pt->firstSector <<',' << pt->totalSectors << endl; } return true; } //------------------------------------------------------------------------------ void volDmp() { cout << F("\nVolume is FAT") << int(sd.vol()->fatType()) << endl; cout << F("blocksPerCluster: ") << int(sd.vol()->blocksPerCluster()) << endl; cout << F("clusterCount: ") << sd.vol()->clusterCount() << endl; cout << F("freeClusters: "); uint32_t volFree = sd.vol()->freeClusterCount(); cout << volFree << endl; float fs = 0.000512*volFree*sd.vol()->blocksPerCluster(); cout << F("freeSpace: ") << fs << F(" MB (MB = 1,000,000 bytes)\n"); cout << F("fatStartBlock: ") << sd.vol()->fatStartBlock() << endl; cout << F("fatCount: ") << int(sd.vol()->fatCount()) << endl; cout << F("blocksPerFat: ") << sd.vol()->blocksPerFat() << endl; cout << F("rootDirStart: ") << sd.vol()->rootDirStart() << endl; cout << F("dataStartBlock: ") << sd.vol()->dataStartBlock() << endl; if (sd.vol()->dataStartBlock() % eraseSize) { cout << F("Data area is not aligned on flash erase boundaries!\n"); cout << F("Download and use formatter from www.sdcard.org!\n"); } } //------------------------------------------------------------------------------ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { SysCall::yield(); } // use uppercase in hex and use 0X base prefix cout << uppercase << showbase << endl; // F stores strings in flash to save RAM cout << F("SdFat version: ") << SD_FAT_VERSION << endl; if (DISABLE_CHIP_SELECT < 0) { cout << F( "\nAssuming the SD is the only SPI device.\n" "Edit DISABLE_CHIP_SELECT to disable another device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CHIP_SELECT) << endl; pinMode(DISABLE_CHIP_SELECT, OUTPUT); digitalWrite(DISABLE_CHIP_SELECT, HIGH); } cout << F("\nAssuming the SD chip select pin is: ") <= 0); // F stores strings in flash to save RAM cout << F("\ntype any character to start\n"); while (!Serial.available()) { SysCall::yield(); } uint32_t t = millis(); // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with // breadboards. use SPI_FULL_SPEED for better performance. if (!sd.cardBegin(SD_CHIP_SELECT, SPI_HALF_SPEED)) { sdErrorMsg("\ncardBegin failed"); return; } t = millis() - t; cardSize = sd.card()->cardSize(); if (cardSize == 0) { sdErrorMsg("cardSize failed"); return; } cout << F("\ninit time: ") << t << " ms" << endl; cout << F("\nCard type: "); switch (sd.card()->type()) { case SD_CARD_TYPE_SD1: cout << F("SD1\n"); break; case SD_CARD_TYPE_SD2: cout << F("SD2\n"); break; case SD_CARD_TYPE_SDHC: if (cardSize < 70000000) { cout << F("SDHC\n"); } else { cout << F("SDXC\n"); } break; default: cout << F("Unknown\n"); } if (!cidDmp()) { return; } if (!csdDmp()) { return; } uint32_t ocr; if (!sd.card()->readOCR(&ocr)) { sdErrorMsg("\nreadOCR failed"); return; } cout << F("OCR: ") << hex << ocr << dec << endl; if (!partDmp()) { return; } if (!sd.fsBegin()) { sdErrorMsg("\nFile System initialization failed.\n"); return; } volDmp(); }

victor_pv
Чт 20 апреля 2017 г., 21:30
STM32 написал:Привет, Стивестронг,
Спасибо.

Стивестронг написал:
Попробуйте простой мигающий набросок с простым серийным выводом в петле, не включая заголовок SD -карты.

Я сделал это, используя test_rtclock без проблем.

Стивестронг написал:
Проверьте 3.Уровень напряжения 3 В, регулятор борта-неделя.

Я использовал осциллограф MSO, и все в порядке.

Стивестронг написал:
Это должно быть ваше программное обеспечение, и мы не можем помочь, если вы не опубликуете его.

Мое программное обеспечение - это не мое, просто это пример SDINFO, предоставленный SDFAT Version 20160719.
Вот:
/* * This program attempts to initialize an SD card and analyze its structure. */ #include #include "SdFat.h" /* * SD chip select pin. Common values are: * * Arduino Ethernet shield, pin 4. * SparkFun SD shield, pin 8. * Adafruit SD shields and modules, pin 10. * Default SD chip select is the SPI SS pin. */ const uint8_t SD_CHIP_SELECT = PA4; /* * Set DISABLE_CHIP_SELECT to disable a second SPI device. * For example, with the Ethernet shield, set DISABLE_CHIP_SELECT * to 10 to disable the Ethernet controller. */ const int8_t DISABLE_CHIP_SELECT = -1; SdFat sd; // serial output steam ArduinoOutStream cout(Serial); // global for card size uint32_t cardSize; // global for card erase size uint32_t eraseSize; //------------------------------------------------------------------------------ // store error strings in flash #define sdErrorMsg(msg) sdErrorMsg_F(F(msg)); void sdErrorMsg_F(const __FlashStringHelper* str) { cout << str << endl; if (sd.card()->errorCode()) { cout << F("SD errorCode: "); cout << hex << int(sd.card()->errorCode()) << endl; cout << F("SD errorData: "); cout << int(sd.card()->errorData()) << dec << endl; } } //------------------------------------------------------------------------------ uint8_t cidDmp() { cid_t cid; if (!sd.card()->readCID(&cid)) { sdErrorMsg("readCID failed"); return false; } cout << F("\nManufacturer ID: "); cout << hex << int(cid.mid) << dec << endl; cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { cout << cid.pnm[i]; } cout << F("\nVersion: "); cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; cout << F("Serial number: ") << hex << cid.psn << dec << endl; cout << F("Manufacturing date: "); cout << int(cid.mdt_month) << '/'; cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; cout << endl; return true; } //------------------------------------------------------------------------------ uint8_t csdDmp() { csd_t csd; uint8_t eraseSingleBlock; if (!sd.card()->readCSD(&csd)) { sdErrorMsg("readCSD failed"); return false; } if (csd.v1.csd_ver == 0) { eraseSingleBlock = csd.v1.erase_blk_en; eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; } else if (csd.v2.csd_ver == 1) { eraseSingleBlock = csd.v2.erase_blk_en; eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low; } else { cout << F("csd version error\n"); return false; } eraseSize++; cout << F("cardSize: ") << 0.000512*cardSize; cout << F(" MB (MB = 1,000,000 bytes)\n"); cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); cout << F("eraseSingleBlock: "); if (eraseSingleBlock) { cout << F("true\n"); } else { cout << F("false\n"); } return true; } //------------------------------------------------------------------------------ // print partition table uint8_t partDmp() { cache_t *p = sd.vol()->cacheClear(); if (!p) { sdErrorMsg("cacheClear failed"); return false; } if (!sd.card()->readBlock(0, p->data)) { sdErrorMsg("read MBR failed"); return false; } for (uint8_t ip = 1; ip < 5; ip++) { part_t *pt = &p->mbr.part[ip - 1]; if ((pt->boot & 0X7F) != 0 || pt->firstSector > cardSize) { cout << F("\nNo MBR. Assuming Super Floppy format.\n"); return true; } } cout << F("\nSD Partition Table\n"); cout << F("part,boot,type,start,length\n"); for (uint8_t ip = 1; ip < 5; ip++) { part_t *pt = &p->mbr.part[ip - 1]; cout << int(ip) << ',' << hex << int(pt->boot) << ',' << int(pt->type); cout << dec << ',' << pt->firstSector <<',' << pt->totalSectors << endl; } return true; } //------------------------------------------------------------------------------ void volDmp() { cout << F("\nVolume is FAT") << int(sd.vol()->fatType()) << endl; cout << F("blocksPerCluster: ") << int(sd.vol()->blocksPerCluster()) << endl; cout << F("clusterCount: ") << sd.vol()->clusterCount() << endl; cout << F("freeClusters: "); uint32_t volFree = sd.vol()->freeClusterCount(); cout << volFree << endl; float fs = 0.000512*volFree*sd.vol()->blocksPerCluster(); cout << F("freeSpace: ") << fs << F(" MB (MB = 1,000,000 bytes)\n"); cout << F("fatStartBlock: ") << sd.vol()->fatStartBlock() << endl; cout << F("fatCount: ") << int(sd.vol()->fatCount()) << endl; cout << F("blocksPerFat: ") << sd.vol()->blocksPerFat() << endl; cout << F("rootDirStart: ") << sd.vol()->rootDirStart() << endl; cout << F("dataStartBlock: ") << sd.vol()->dataStartBlock() << endl; if (sd.vol()->dataStartBlock() % eraseSize) { cout << F("Data area is not aligned on flash erase boundaries!\n"); cout << F("Download and use formatter from www.sdcard.org!\n"); } } //------------------------------------------------------------------------------ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { SysCall::yield(); } // use uppercase in hex and use 0X base prefix cout << uppercase << showbase << endl; // F stores strings in flash to save RAM cout << F("SdFat version: ") << SD_FAT_VERSION << endl; if (DISABLE_CHIP_SELECT < 0) { cout << F( "\nAssuming the SD is the only SPI device.\n" "Edit DISABLE_CHIP_SELECT to disable another device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CHIP_SELECT) << endl; pinMode(DISABLE_CHIP_SELECT, OUTPUT); digitalWrite(DISABLE_CHIP_SELECT, HIGH); } cout << F("\nAssuming the SD chip select pin is: ") <= 0); // F stores strings in flash to save RAM cout << F("\ntype any character to start\n"); while (!Serial.available()) { SysCall::yield(); } uint32_t t = millis(); // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with // breadboards. use SPI_FULL_SPEED for better performance. if (!sd.cardBegin(SD_CHIP_SELECT, SPI_HALF_SPEED)) { sdErrorMsg("\ncardBegin failed"); return; } t = millis() - t; cardSize = sd.card()->cardSize(); if (cardSize == 0) { sdErrorMsg("cardSize failed"); return; } cout << F("\ninit time: ") << t << " ms" << endl; cout << F("\nCard type: "); switch (sd.card()->type()) { case SD_CARD_TYPE_SD1: cout << F("SD1\n"); break; case SD_CARD_TYPE_SD2: cout << F("SD2\n"); break; case SD_CARD_TYPE_SDHC: if (cardSize < 70000000) { cout << F("SDHC\n"); } else { cout << F("SDXC\n"); } break; default: cout << F("Unknown\n"); } if (!cidDmp()) { return; } if (!csdDmp()) { return; } uint32_t ocr; if (!sd.card()->readOCR(&ocr)) { sdErrorMsg("\nreadOCR failed"); return; } cout << F("OCR: ") << hex << ocr << dec << endl; if (!partDmp()) { return; } if (!sd.fsBegin()) { sdErrorMsg("\nFile System initialization failed.\n"); return; } volDmp(); }

Стивестронг
Пт 21 апреля 2017 г., 7:36 утра
Я хотел бы знать, какой метод загрузки вы используете.
SD -карта с SDFAT LIB в сочетании с USB Serial широко используется многими пользователями здесь, в том числе и я. И это работает.
Но...
USB Serial работает только в том случае, если вы используете «SMT32Duino Bootloader», или вы добавляете флаг линкера «-deserial_usb» в процесс сборки.

Другое дело, что USB-сериал видна на машине Win10 всего через 5 секунд после сброса платы, это время, необходимое для повторного вывода портов COM.
Так что может случиться так, что SW работает ОК, но вы ничего не видите, потому что все выходные данные уже отправляются, прежде чем вы открываете последовательный монитор после загрузки (и сброс платы).
OTOH, линия while (!Serial);

STM32
Пт 21 апреля 2017 г., 8:11 вечера
Привет, Стивестронг,
Спасибо.

Стивестронг написал: Попробуйте какие -то другие примеры SDFAT, чтобы подтвердить, но примеры широко использовались, чтобы они были в порядке.
Некоторые SD -карта не работают так хорошо в режиме SPI, вы можете попробовать разные карты и разные скорости.
Я сделал первоначальный порт библиотеки SDFAT для нашего ядра, и SDCARD, которую я использовал, сначала дал мне много головных болей. Это сработало только несколько раз, поэтому я потратил бесчисленные часы, проверяя код, думая, что что -то должно быть плохим, а затем проверять соединения, тогда это будет работать несколько раз, но затем потерпит неудачу без изменений. В конце концов я решил попробовать более быстрый SDCARD (Sandisk Extreme), и все работало идеально каждый забег, снова и снова.
То, что вы написали, концептуально правильно, но, по моему мнению, в этом случае это не SD -карта, ни скорость SPI, ни соединения, это может быть только код, который работает на «синей таблетке».
Любой может проверить сам без необходимости иметь карту, разъем SD -карты или провода, подключенные к «синей таблетке».
Просто загрузите в «синюю таблетку» эскиз, который я поместил в свой предыдущий пост, и запустите терминал, используя только «синюю таблетку», подключенную только к компьютеру через USB -разъем, а не SD -карта и не подключенный читатель.
В этом случае вы должны получить это сообщение на терминале:

Версия SDFAT: 20160719

Предполагая, что SD является единственным устройством SPI.
Редактировать Disable_chip_select, чтобы отключить другое устройство.

Предполагая, что выберите PIN -код SD Select: PA4
Редактировать SD_CHIP_SELECT, чтобы изменить SD CHIP SELECT PIN.

Введите любого персонажа, чтобы начать


Даже слепо нажав на клавиатуру ничего не происходит, терминал остается пустым, когда вместо этого должно появиться это сообщение:

Cardbegin не удался
SD Errorcode: 0x1
SD Errordata: 0x0

Введите любого персонажа, чтобы начать


С двумя моими "синими таблетками" я не могу получить сообщения, даже не нажав кнопку сброса на плате.
В этом смысл.
Образец эскиза с именем "test_rtclock" полностью работает так же хорошо.
С осциллографом MSO я увидел, что код работает нормально, если в терминал ничего не появляется в терминале.
Оба "синяя таблетки", у меня есть 1, у них есть 1.5 -киомовый резистор подтягивания на D+ (R10 на плате).
Основываясь на всем, что я думаю, это что -то в коде sdinfo.

Стивестронг написал: Я хотел бы знать, какой метод загрузки вы используете.
Я использую плату «синие таблетки» в качестве обычной платы Arduino, используя на борту MicroUSB, сохраняя при этом Pins Boot0 »и« Boot1 », всегда подключенные к GND.

Стивестронг написал: SD -карта с SDFAT LIB в сочетании с USB Serial широко используется многими пользователями здесь, в том числе и я. И это работает.
Но...
USB Serial работает только в том случае, если вы используете «SMT32Duino Bootloader», или вы добавляете флаг линкера «-deserial_usb» в процесс сборки.

Будучи аппаратным парнем, я не совсем понимаю, что вы имеете в виду, в любом случае на моих «синих таблетках» у меня есть загрузчик Roger Clark SMT32Duino.

Стивестронг написал: Другое дело, что USB-сериал видна на машине Win10 всего через 5 секунд после сброса платы, это время, необходимое для повторного вывода портов COM.
Так что может случиться так, что SW работает ОК, но вы ничего не видите, потому что все выходные данные уже отправляются, прежде чем вы открываете последовательный монитор после загрузки (и сброс платы).

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

Стивестронг написал: while (!Serial);

Стивестронг
Сб 22 апреля 2017 г. 7:28 утра
Пример "test_rtclock" не использует сериал USB, поэтому вы не можете сравнивать с другими эскизами, которые его используют.
В примере "test_rtclock" используется сериал USB в основном цикле, поэтому даже если первые образцы (в течение 5 секунд) не показаны, остальные будут показаны в серийном мониторе.
STM32 написал:Будучи аппаратным парнем, я не совсем понимаю, что вы имеете в виду, в любом случае на моих «синих таблетках» у меня есть загрузчик Roger Clark SMT32Duino.

STM32
Сб 29 апреля 2017 г. 16:21
Привет, Стивестронг,
Извините за поздний ответ.
Спасибо, ваш подсказка работает!
Сначала приятно знать, что «test_rtclock» отличается от других примеров из -за того, что он использует сериал USB в основной петле, спасибо!
Тогда я должен указать, что неправильно понял "SMT32duino Bootloader" вещь.
Я использовал его с самого начала и, конечно, с "SMT32duino Bootloader"В качестве метода загрузки, так что на моей стороне все уже было правильным с самого начала.
То же самое, что и выше, я уже знаю, как проверить все предупреждающие сообщения, включив словесные сообщения в
Arduino IDE: файл -> Предпочтения: показать известный выход во время: Компиляция - Установите флажок.

Я повторяю, что, наконец, используя «задержку (6000)», как вы писали непосредственно перед выводом каких -либо последовательных сообщений, очень спасибо, большое спасибо!
/* * This program attempts to initialize an SD card and analyze its structure. */ #include #include "SdFat.h" /* * SD chip select pin. Common values are: * * Arduino Ethernet shield, pin 4. * SparkFun SD shield, pin 8. * Adafruit SD shields and modules, pin 10. * Default SD chip select is the SPI SS pin. */ const uint8_t SD_CHIP_SELECT = PA4; /* * Set DISABLE_CHIP_SELECT to disable a second SPI device. * For example, with the Ethernet shield, set DISABLE_CHIP_SELECT * to 10 to disable the Ethernet controller. */ const int8_t DISABLE_CHIP_SELECT = -1; SdFat sd; // serial output steam ArduinoOutStream cout(Serial); // global for card size uint32_t cardSize; // global for card erase size uint32_t eraseSize; //------------------------------------------------------------------------------ // store error strings in flash #define sdErrorMsg(msg) sdErrorMsg_F(F(msg)); void sdErrorMsg_F(const __FlashStringHelper* str) { cout << str << endl; if (sd.card()->errorCode()) { cout << F("SD errorCode: "); cout << hex << int(sd.card()->errorCode()) << endl; cout << F("SD errorData: "); cout << int(sd.card()->errorData()) << dec << endl; } } //------------------------------------------------------------------------------ uint8_t cidDmp() { cid_t cid; if (!sd.card()->readCID(&cid)) { sdErrorMsg("readCID failed"); return false; } cout << F("\nManufacturer ID: "); cout << hex << int(cid.mid) << dec << endl; cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { cout << cid.pnm[i]; } cout << F("\nVersion: "); cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; cout << F("Serial number: ") << hex << cid.psn << dec << endl; cout << F("Manufacturing date: "); cout << int(cid.mdt_month) << '/'; cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; cout << endl; return true; } //------------------------------------------------------------------------------ uint8_t csdDmp() { csd_t csd; uint8_t eraseSingleBlock; if (!sd.card()->readCSD(&csd)) { sdErrorMsg("readCSD failed"); return false; } if (csd.v1.csd_ver == 0) { eraseSingleBlock = csd.v1.erase_blk_en; eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; } else if (csd.v2.csd_ver == 1) { eraseSingleBlock = csd.v2.erase_blk_en; eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low; } else { cout << F("csd version error\n"); return false; } eraseSize++; cout << F("cardSize: ") << 0.000512*cardSize; cout << F(" MB (MB = 1,000,000 bytes)\n"); cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); cout << F("eraseSingleBlock: "); if (eraseSingleBlock) { cout << F("true\n"); } else { cout << F("false\n"); } return true; } //------------------------------------------------------------------------------ // print partition table uint8_t partDmp() { cache_t *p = sd.vol()->cacheClear(); if (!p) { sdErrorMsg("cacheClear failed"); return false; } if (!sd.card()->readBlock(0, p->data)) { sdErrorMsg("read MBR failed"); return false; } for (uint8_t ip = 1; ip < 5; ip++) { part_t *pt = &p->mbr.part[ip - 1]; if ((pt->boot & 0X7F) != 0 || pt->firstSector > cardSize) { cout << F("\nNo MBR. Assuming Super Floppy format.\n"); return true; } } cout << F("\nSD Partition Table\n"); cout << F("part,boot,type,start,length\n"); for (uint8_t ip = 1; ip < 5; ip++) { part_t *pt = &p->mbr.part[ip - 1]; cout << int(ip) << ',' << hex << int(pt->boot) << ',' << int(pt->type); cout << dec << ',' << pt->firstSector <<',' << pt->totalSectors << endl; } return true; } //------------------------------------------------------------------------------ void volDmp() { cout << F("\nVolume is FAT") << int(sd.vol()->fatType()) << endl; cout << F("blocksPerCluster: ") << int(sd.vol()->blocksPerCluster()) << endl; cout << F("clusterCount: ") << sd.vol()->clusterCount() << endl; cout << F("freeClusters: "); uint32_t volFree = sd.vol()->freeClusterCount(); cout << volFree << endl; float fs = 0.000512*volFree*sd.vol()->blocksPerCluster(); cout << F("freeSpace: ") << fs << F(" MB (MB = 1,000,000 bytes)\n"); cout << F("fatStartBlock: ") << sd.vol()->fatStartBlock() << endl; cout << F("fatCount: ") << int(sd.vol()->fatCount()) << endl; cout << F("blocksPerFat: ") << sd.vol()->blocksPerFat() << endl; cout << F("rootDirStart: ") << sd.vol()->rootDirStart() << endl; cout << F("dataStartBlock: ") << sd.vol()->dataStartBlock() << endl; if (sd.vol()->dataStartBlock() % eraseSize) { cout << F("Data area is not aligned on flash erase boundaries!\n"); cout << F("Download and use formatter from www.sdcard.org!\n"); } } //------------------------------------------------------------------------------ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { SysCall::yield(); } delay(6000); // use uppercase in hex and use 0X base prefix cout << uppercase << showbase << endl; // F stores strings in flash to save RAM cout << F("SdFat version: ") << SD_FAT_VERSION << endl; if (DISABLE_CHIP_SELECT < 0) { cout << F( "\nAssuming the SD is the only SPI device.\n" "Edit DISABLE_CHIP_SELECT to disable another device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CHIP_SELECT) << endl; pinMode(DISABLE_CHIP_SELECT, OUTPUT); digitalWrite(DISABLE_CHIP_SELECT, HIGH); } cout << F("\nAssuming the SD chip select pin is: ") <= 0); // F stores strings in flash to save RAM cout << F("\ntype any character to start\n"); while (!Serial.available()) { SysCall::yield(); } uint32_t t = millis(); // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with // breadboards. use SPI_FULL_SPEED for better performance. if (!sd.cardBegin(SD_CHIP_SELECT, SPI_HALF_SPEED)) { sdErrorMsg("\ncardBegin failed"); return; } t = millis() - t; cardSize = sd.card()->cardSize(); if (cardSize == 0) { sdErrorMsg("cardSize failed"); return; } cout << F("\ninit time: ") << t << " ms" << endl; cout << F("\nCard type: "); switch (sd.card()->type()) { case SD_CARD_TYPE_SD1: cout << F("SD1\n"); break; case SD_CARD_TYPE_SD2: cout << F("SD2\n"); break; case SD_CARD_TYPE_SDHC: if (cardSize < 70000000) { cout << F("SDHC\n"); } else { cout << F("SDXC\n"); } break; default: cout << F("Unknown\n"); } if (!cidDmp()) { return; } if (!csdDmp()) { return; } uint32_t ocr; if (!sd.card()->readOCR(&ocr)) { sdErrorMsg("\nreadOCR failed"); return; } cout << F("OCR: ") << hex << ocr << dec << endl; if (!partDmp()) { return; } if (!sd.fsBegin()) { sdErrorMsg("\nFile System initialization failed.\n"); return; } volDmp(); }