библиотека sdFat, софтварный SPI на Arduino M0 для работы с SD-картами - не работает метод ls
- Войдите на сайт для отправки комментариев
Имеется контроллер Arduino M0, модуль SD-card reader. Схема подключения проста, однако, с учетом особенностей контроллера М0, к пинам 10,11,12 подключить картридер можно только используя библиотеку sdFat.h и софтовый SPI, используя объект класса SdFatSoftSpi. Используя скетч примера File List пытаюсь получить содержание каталога root на SD-карте:
#include <Arduino.h> #include "wiring_private.h" // Библиотека даёт возможность изменения функций пинов МК (pinPeripheral() function) #include <SPI.h> // Библиотека для работы по интерфейсу SPI #include "SdFat.h" // Библиотека работающая с объектами класса SPI, созданных программно (SERCOM) #define Serial SerialUSB const uint8_t SD_CHIP_SELECT = 10; // Объявляем пин SS(CS) для работы с SD-Card const uint8_t SOFT_MOSI_PIN = 11; // Объявляем пин MOSI(DI) для работы с SD-Card const uint8_t SOFT_MISO_PIN = 12; // Объявляем пин MISO(DO) для работы с SD-Card const uint8_t SOFT_SCK_PIN = 13; // Объявляем пин SCK(SCL) для работы с SD-Card SdFatSoftSpi<SOFT_MISO_PIN, SOFT_MOSI_PIN, SOFT_SCK_PIN> sd_card; // Инициализация объекта класса SPI для работы с SD-Card File root; void setup() { SerialUSB.begin(115200); // Инициализация объекта Serial для работы с монитором COM-порта while (!SerialUSB) {}; // ОТЛАДКА. Ожидание инициализации монитора Serial-порта if (!sd_card.begin(SD_CHIP_SELECT)) SerialUSB.println(F("SD-Card error!")); else SerialUSB.println(F("SD-Card wiring and inserted!")); root = sd_card.open("/"); listDirectory(root, 0); SerialUSB.println(F("listing directory it's over!")); } void loop() {} void listDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (!entry) { break; // файлов в директории больше нет } for (uint8_t i = 0; i < numTabs; i++) { SerialUSB.print('\t'); } SerialUSB.print(entry.name()); if (entry.isDirectory()) { SerialUSB.println("/"); listDirectory(entry, numTabs + 1); } else { SerialUSB.print(F("\t\t")); SerialUSB.println(entry.size(), DEC); } entry.close(); } }
и вроде бы, все компилируется, но работает "криво". А именно, в мониторе порта выводится следующее
SD-Card wiring and inserted! use getName() 623 use getName() 120084 use getName() 2542 use getName() 21919 use getName() 33286 use getName() 28068 use getName() 51 use getName() 30097 use getName() 330 listing directory it's over!
т.е. лист файлов присутствует, только с размерами файлов и без их имен. В методах библиотеки sdFat и класса SdFatSoftSpi нет метода name(), поэтому строка SerialUSB.print(entry.name()); в скетче возвращает сообщение use getName(), которого также нет в классе SdFatSoftSpi.
После прочтения описания библиотеки sdFat.h понимаю, что необходимо использовать метод ls(), которых в классе SdFatSoftSpi 4 варианта. Но не один из этих 4-х вариантов метода ls() не позволяет вывести список файлов каталога root с их именами, размерами и датой изменения файла.
Кто сталкивался с данными трудностями прошу помочь!
Первое - на контроллере Arduino M0 есть хардварный SPI, только пины другие. Что мешает подключится к ним, вместо 10,11,12?
По последнему вопросу - если нет метода вывода готового каталога с имеами и размерами - значит выводите отдельно имя, отдельно размер - и потом компонуйте вместе. Но, честно говоря, думаю что вы просто не разобрались. Не верю. что из аж 4х вариантов LS() ни один не выводит имена. Читайте внимательнее.
Первое - на контроллере Arduino M0 есть хардварный SPI, только пины другие. Что мешает подключится к ним, вместо 10,11,12?
изменить пины - не вариант решения...
По последнему вопросу - если нет метода вывода готового каталога с имеами и размерами - значит выводите отдельно имя, отдельно размер - и потом компонуйте вместе. Но, честно говоря, думаю что вы просто не разобрались. Не верю. что из аж 4х вариантов LS() ни один не выводит имена. Читайте внимательнее.
Читал - применял различный вариант вызова метода ls() - пустая строка или "1" - т.е. true, имен файлов нет, только размер при вызове size().
изменить пины - не вариант решения...
почему же?
дайте ссылку на ту библиотеку. которую используете - а то в SDFat я вообще не нашел такого примера
traveler - думаю, что с наскока решить проблему не получится. У вас и контроллер не тот, и подключение другое и, кроме того, как мне кажется. вы плохо понимаете, как это работает.
Думаю, будет правильнее решать проблему по частям. Сначала возьмите обычную Ардуино Уно, подключитесь к "железному" SPI и добейтесь, чтобы примеры библиотеки заработали. Потом перекиньте подключение на софтовый СПИ. Потом, если все получится - переходите на ваш контроллер.
А иначе шансы решить задачу не велики.
спасибо за ответ!
с другими контроллерами проблем нет!
как это работает... это работает! Я спросил помощи у тех, кто сталкивался с софтовым SPI, кто не сталкивался - тот сразу предлагает менять пины... ещё раз спасибо!
как это работает... это работает! Я спросил помощи у тех, кто сталкивался с софтовым SPI, кто не сталкивался - тот сразу предлагает менять пины... ещё раз спасибо!
99% что вывод или не вывод имени файла НУ НИКАК не связан с софтовым SPI. Но чтобы разделить возможные источники проблем, я бы действовал так, как написал. А вы можете продолжать ждать уникального спеца, который решал именно вашу задачу именно на вашем контроллере.
И вот хоть убей не понимаю, что мешает подключится к другим пинам? Или вы. как многие новички - сначала развели плату, а потом начали еее программировать?
проблема связана с библиотекой и моим не пониманием её методов в части листинга директор и. на хардварноом SPI живёт ethernet.
вопрос мой был не про плату и ее трассировку, а про использование методов класса.
повторюсь - с железным SPI работает библиотека SD, и там с листингом директории проблем нет. даже на М0, если картридер подключить к железному SPI, то всё работает, и с SD, и с SdFat.
проблема связана с библиотекой и моим не пониманием её методов в части листинга директор и. на хардварноом SPI живёт ethernet.
на SPI можно подключить ethernet и SD одновременно, шина SPI поддерживает подключение нескольких девайсов
А чтобы выдать готовое решение вашей проблемы с листингом на софт-СПИ - кто-то должен собрать соответвующую схему и отладить код. Вы правда ожидаете. что кто-то будет связываться с этим без оплаты?
на SPI можно подключить ethernet и SD одновременно, шина SPI поддерживает подключение нескольких девайсов
Ну, чтобы поморгать светодиодом, всегда можно переподключить пины, а для того, чтобы решить задачу, не верно изменять ее, задачи, условия... Как правило "знатоки" и "гуру" идут таким путем, советую использовать другие пины... (кавычки применены сознательно). И кстати, как быть, если нужно одновременно использовать и SD-карту и Ethernet, при условии, что оба модуля "сидят" на одном SPI? Ах, да, для поморгать светодиодом на плате этого не требуется...
А чтобы выдать готовое решение вашей проблемы с листингом на софт-СПИ - кто-то должен собрать соответвующую схему и отладить код. Вы правда ожидаете. что кто-то будет связываться с этим без оплаты?
Я вроде, по-русски написал, кто сталкивался, что уже само собой подразумевает, и наличие контроллера на базе Arduino M0, и применять в прошлом, софтовый SPI... и при этом, на этом форуме несколько тысяч человек, которые действительно являются специалистами, а не простыми форумчанами, ради накрутки количества постов на форуме...
Что касается моих прошлых вопросов, то многие, действительно знатоки и гуру, помогали и мне и другим, не требуя оплаты... но опять же, помочь поморгать светодиодом, это удел "знатоков" и "гуру" в кавычках.
И кстати, как быть, если нужно одновременно использовать и SD-карту и Ethernet, при условии, что оба модуля "сидят" на одном SPI?
Ваша ирония в данном случае смотрится довольно глупо. Прежде чем спорить вы бы почитали описание SPI. что ли....
Два-три устройства на одном SPI совершенно запросто можно использовать одновременно. Если уж такие связанные вещи, как экран и его тач удается пользовать на одном SPi, то уж эзернет и СД-карту, чьи функции не пересекаются никак - вообще запросто.