Arduino M0 - Программный SPI для работы с SD-Картой, кто сталкивался?

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем trv, 19 мар 2019.

  1. trv

    trv Нуб

    Доброе утро! Кто сталкивался или кто может подсказать в какую сторону "копать", прошу помощи в следующей проблеме:
    1. Контроллер Arduino M0;
    2. Модуль SD-Card Reader;
    Задача: подключить используя библиотеки SPI.h и SD.h модуль SD-Card Reader к МК, при этом, для шины SPI использовать пины контроллера 11-MOSI(DI), 12-MISO(DO), 13-SCK(CLK), пин SS(CS) - любой.
    В связи с тем, что на 32-битных контроллерах нет возможности использовать библиотеку SoftwareSerial, при необходимости инициализировать программные Serial я использовал средства SERCOM'a, Serial интерфейсы работают без проблем. При этом, SERCOM позволяет инициализировать также SPI и Wire, Wire мне пока не нужен, а вот с SPI у меня не получается... Пример кода, которым пытаюсь решить задачу:
    Код (C++):
    #include <Arduino.h>        
    #include "wiring_private.h"   // Библиотека даёт возможность изменения функций пинов МК (pinPeripheral() function)
    #include <SPI.h>
    #include <SD.h>

    SPIClass localSPI (&sercom1, 12, 13, 11, SPI_PAD_0_SCK_1, SERCOM_RX_PAD_3);

    #define chipSelect 10

    void setup()
    {
      SerialUSB.begin(115200);
      while (!SerialUSB) {};                // Ожидание инициализации Serial-порта
      SerialUSB.println(F("Start Programm!"));
      SerialUSB.println(F("Initializing SD card ..."));

      localSPI.begin();
      pinPeripheral(11, PIO_SERCOM);
      pinPeripheral(12, PIO_SERCOM);
      pinPeripheral(13, PIO_SERCOM);

      if (!SD.begin(chipSelect))
        {
          SerialUSB.println(F("Card failed, or not present!"));
          return;
        }
      else
        {
          SerialUSB.println(F("Card present!"));
        }

    }

    void loop()
    {
     
    }
    Кто сталкивался с подобными задачами - прошу помощи!
     
  2. Ок. Пример из IDE будет работать замечательно.

    А это тут при чем?
     
  3. trv

    trv Нуб

    Дело в том, что на плате Arduino M0 пины шины SPI выведены на контакты ICSP (отдельная колодка). Пины 11,12,13 простые GPIO... Поэтому пример из IDE работать на этих пинах не будет и не работает, проверял на 3-х платах М0.... Отсуда и просьба о помощи, т.к. задействовать отдельную колодку не получиться...
     
  4. trv

    trv Нуб

    Про Serial и 32-битные контроллеры написал просто для информации...
     
  5. Нет. Там это тоже на пинах 11 12 13. У вас ошибка где-то еще.
     
  6. trv

    trv Нуб

    Перебрал 3-и платы Arduino M0, все что есть в наличии... Не работает SD-карта ни на одном...
     
  7. DetSimen

    DetSimen Guest

    Неправильно перебирал, значить.
     
  8. trv

    trv Нуб

    Вечером, ещё раз попробую...
     
  9. parovoZZ

    parovoZZ Гуру

    ТС прав - разведены совершенно разные ноги. Смотрите схему.
     
  10. Разные. И 11 12 13 - SPI. Ну в конце концов можно и там и там попробовать, на случай если ардуино идиоты и сами себе подлянки делают.
     
  11. trv

    trv Нуб

    Согласно datasheet'у на Arduino M0, SPI есть и на отдельной колодке ICSP
    2019-03-19_21-54-08.png
    также SPI присутствует на пинах 11,12,13
    2019-03-19_21-53-31.png
    у самого контроллера эти пины
    2019-03-19_21-55-01.png
    однако, я подключаю SD-Card reader купленный в амперке, к пинам МК, также купленном в амперке, при этом, если я подключаю SD-card к пинам ICSP - картридер работает, читает и пишет на карту, если я подключаю к пинам 11,12,13 - не работает картридер... при этом SS(CS) - 10 пин, 8 пин, 4 пин - не работает. Есть еще два МК, один куплен в чип-дип, второй куплен у robotdyn, не один МК с SD на пинах 11,12,13 не работает... скетч для тестирования беру из примера на амперка-вики, SD-картридер... и куда копать не представляю...
    Код (C++):
    #include <SPI.h>
    #include <SD.h>

    #define chipSelect 10

    void setup()
    {
      SerialUSB.begin(115200);
      while (!SerialUSB) {};                // Ожидание инициализации Serial-порта
      SerialUSB.println(F("Start Programm!"));
      SerialUSB.println(F("Initializing SD card ..."));

      if (!SD.begin(chipSelect))
        {
          SerialUSB.println(F("Card failed, or not present!"));
          return;
        }
      else
        {
          SerialUSB.println(F("Card present!"));
        }

    }

    void loop()
    {
    }
     
    Последнее редактирование: 19 мар 2019
  12. Daniil

    Daniil Гуру

    1. Вы выложили не весь код. Он не скомпилируется, т.к. не определены ни F, ни SerialUSB. Из чего делаю вывод, что косяк может быть в коде.
    2. Посмотрите как на ваших картинках обозначены выводы SPI
    PBxx_S4_SPI_yyyy - выведены на колодку icsp.
    Mosi, miso... - выведены на колодку с номерами 6, 5, 4, 3
    подозреваю, что это разные spi и, соответственно, обращяться к ним надо по-разному. (из-за того, что имеют разные названия, если их где-то еще на схеме не объединили)
     
  13. trv

    trv Нуб

    SerialUSB - это класс Serial на МК - его не нужно определять... F - это _FlashStringHelper для экономии памяти при выводе в сериал... скетч, который я привел в постах - компилируется без ошибок, но не работает с SD при подключении через пины 11,12,13
     
  14. Daniil

    Daniil Гуру

    не все работали с ардуино м0, поэтому такие вещи хотелось бы, чтобы были сразу.
    Еще раз.
    На колодку icsp выведен spi1.
    на стандартную io колодку выведен spi2.
    Оставляя скетч без изменений у вас не будет работать spi2. Если там еще парочка собак не зарыто.
     
  15. parovoZZ

    parovoZZ Гуру

    Вроде как это тот самый момент, когда надо очень внимательно прочитать даташит. Особенно секцию SERCOM.
     
  16. trv

    trv Нуб

    я не могу найти описания работы SERCOM именно под Arduino M0, согласно даташиту на сам SERCOM, я все делаю, как написано (код из 1-го поста) - не работает... я не понимаю, что я делаю не так... поэтому прошу помощи у более опытных коллег...
     
  17. trv

    trv Нуб

    Из описания на сайте производителя "SPI: on the ICSP header. These pins support SPI communication using the SPI library. Note that the SPI pins are not connected to any of the digital I/O pins as they are on the Uno, They are only available on the ICSP connector. This means that if you have a shield that uses SPI, but does NOT have a 6-pin ICSP connector that connects to the M0's 6-pin ICSP header, the shield will not work."
    Тут речь о том, что если шилд не имеет колодки для подключения ICSP то шилд не будет работать по SPI, про SERCOM нет ни слова...
     
  18. trv

    trv Нуб

    Код (C++):
    #include <Arduino.h>      
    #include "wiring_private.h"   // Библиотека даёт возможность изменения функций пинов МК (pinPeripheral() function)
    #include <SPI.h>

    SPIClass localSPI (&sercom1, 12, 13, 11, SPI_PAD_0_SCK_1, SERCOM_RX_PAD_3);

    void setup()
    {
      SerialUSB.begin(115200);
      while (!SerialUSB) {};                // Ожидание инициализации Serial-порта
      SerialUSB.println(F("Start Programm!"));

      localSPI.begin();
      pinPeripheral(11, PIO_SERCOM);
      pinPeripheral(12, PIO_SERCOM);
      pinPeripheral(13, PIO_SERCOM);

    }

    uint8_t i = 0;

    void loop()
    {
      SerialUSB.println(i);
      localSPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
      localSPI.transfer(i++);
      localSPI.endTransaction();
    }
    Используя осциллограф, убедился что localSPI живет, на пине 11 есть активность, на пине 13 синхронизация - остался вопрос, главный, как прикрутить к localSPI модуль SD-Card reader??? Помогите кто в теме, очень прошу помощи...
     
  19. В библиотеку зашито, что на работает только с основным интерфейсом SPI. Может имеет смысл поискать другую библиотеку. Иначе придется править ее исходный код
     
    Daniil нравится это.
  20. trv

    trv Нуб

    я так понимаю, сейчас идёт речь о библиотеке SD.h, попробую поискать альтернативу, чтобы можно было прописывать интерфесы SPI.