библиотека sdFat, софтварный SPI на Arduino M0 для работы с SD-картами - не работает метод ls

traveler
Offline
Зарегистрирован: 27.09.2018

Имеется контроллер 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 с их именами, размерами и датой изменения файла.

Кто сталкивался с данными трудностями прошу помочь!

b707
Offline
Зарегистрирован: 26.05.2017

Первое - на контроллере Arduino M0 есть хардварный SPI, только пины другие. Что мешает подключится к ним, вместо 10,11,12?

По последнему вопросу - если нет метода вывода готового каталога с имеами и размерами - значит выводите отдельно имя, отдельно размер - и потом компонуйте вместе. Но, честно говоря, думаю что вы просто не разобрались. Не верю. что из аж 4х вариантов LS() ни один не выводит имена. Читайте внимательнее.

traveler
Offline
Зарегистрирован: 27.09.2018

b707 пишет:

Первое - на контроллере Arduino M0 есть хардварный SPI, только пины другие. Что мешает подключится к ним, вместо 10,11,12?

изменить пины - не вариант решения...

b707 пишет:

По последнему вопросу - если нет метода вывода готового каталога с имеами и размерами - значит выводите отдельно имя, отдельно размер - и потом компонуйте вместе. Но, честно говоря, думаю что вы просто не разобрались. Не верю. что из аж 4х вариантов LS() ни один не выводит имена. Читайте внимательнее.

Читал - применял различный вариант вызова метода ls() - пустая строка или "1" - т.е. true, имен файлов нет, только размер при вызове size().

b707
Offline
Зарегистрирован: 26.05.2017

traveler пишет:

изменить пины - не вариант решения...

почему же?

Цитата:
применял различный вариант вызова метода ls() - пустая строка или "1" - т.е. true, имен файлов нет, только размер при вызове size().

дайте ссылку на ту библиотеку. которую используете - а то в SDFat я вообще не нашел такого примера

b707
Offline
Зарегистрирован: 26.05.2017

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

Думаю, будет правильнее решать проблему по частям. Сначала возьмите обычную Ардуино Уно, подключитесь к "железному" SPI и добейтесь, чтобы примеры библиотеки заработали. Потом перекиньте подключение на софтовый СПИ. Потом, если все получится - переходите на ваш контроллер.

А иначе шансы решить задачу не велики.

traveler
Offline
Зарегистрирован: 27.09.2018

спасибо за ответ!

с другими контроллерами проблем нет!

как это работает... это работает! Я спросил помощи у тех, кто сталкивался с софтовым SPI, кто не сталкивался - тот сразу предлагает менять пины... ещё раз спасибо!

b707
Offline
Зарегистрирован: 26.05.2017

traveler пишет:

как это работает... это работает! Я спросил помощи у тех, кто сталкивался с софтовым SPI, кто не сталкивался - тот сразу предлагает менять пины... ещё раз спасибо!

99% что вывод или не вывод имени файла НУ НИКАК не связан с софтовым SPI. Но чтобы разделить возможные источники проблем, я бы действовал так, как написал. А вы можете продолжать ждать уникального спеца, который решал именно вашу задачу именно на вашем контроллере.

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

traveler
Offline
Зарегистрирован: 27.09.2018

проблема связана с библиотекой и моим не пониманием её методов в части листинга директор и. на хардварноом SPI живёт ethernet.

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

повторюсь - с железным SPI работает библиотека SD, и там с листингом директории проблем нет. даже на М0, если картридер подключить к железному SPI, то всё работает, и с SD, и с SdFat.

b707
Offline
Зарегистрирован: 26.05.2017

traveler пишет:

проблема связана с библиотекой и моим не пониманием её методов в части листинга директор и. на хардварноом SPI живёт ethernet.

на SPI можно подключить ethernet и SD одновременно, шина SPI поддерживает подключение нескольких девайсов

 

А чтобы выдать готовое решение вашей проблемы с листингом на софт-СПИ - кто-то должен собрать соответвующую схему и отладить код. Вы правда ожидаете. что кто-то будет связываться с этим без оплаты?

traveler
Offline
Зарегистрирован: 27.09.2018

b707 пишет:

на SPI можно подключить ethernet и SD одновременно, шина SPI поддерживает подключение нескольких девайсов

Ну, чтобы поморгать светодиодом, всегда можно переподключить пины, а для того, чтобы решить задачу, не верно изменять ее, задачи, условия... Как правило "знатоки" и "гуру" идут таким путем, советую использовать другие пины... (кавычки применены сознательно). И кстати, как быть, если нужно одновременно использовать и SD-карту и Ethernet, при условии, что оба модуля "сидят" на одном SPI? Ах, да, для поморгать светодиодом на плате этого не требуется...

b707 пишет:

А чтобы выдать готовое решение вашей проблемы с листингом на софт-СПИ - кто-то должен собрать соответвующую схему и отладить код. Вы правда ожидаете. что кто-то будет связываться с этим без оплаты?

Я вроде, по-русски написал, кто сталкивался, что уже само собой подразумевает, и наличие контроллера на базе Arduino M0, и применять в прошлом, софтовый SPI... и при этом, на этом форуме несколько тысяч человек, которые действительно являются специалистами, а не простыми форумчанами, ради накрутки количества постов на форуме... 

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

b707
Offline
Зарегистрирован: 26.05.2017

traveler пишет:

 И кстати, как быть, если нужно одновременно использовать и SD-карту и Ethernet, при условии, что оба модуля "сидят" на одном SPI?

Ваша ирония в данном случае смотрится довольно глупо. Прежде чем спорить вы бы почитали описание SPI. что ли....

Два-три устройства на одном SPI совершенно запросто можно использовать одновременно. Если уж такие связанные вещи, как экран и его тач удается пользовать на одном SPi, то уж эзернет и СД-карту, чьи функции не пересекаются никак - вообще запросто.