Teensy 3.1 + SD Card Module (как подключить?)

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем PlaaPlaaa, 26 июл 2016.

  1. PlaaPlaaa

    PlaaPlaaa Нуб

    Всем привет!
    В ходе создания проекта, с целью отладки показателей датчиков, появилась необходимость записи логов куда то в файл.

    Дано:
    1. Teensy 3.1 (http://vk.cc/5q4kk8);
    2. SPI SD Card Module (http://vk.cc/5q4nEK).
    Цель: примитивна и описана выше

    Что сделано:

    1. платы подключены по прикрепленной ниже схеме (интернет сказал что примерно так и нужно). Стоит сразу сказать все найденные примеры указывали на разнообразные пины ardruino, а вот к Teensy будто никто не подключал.
    2. Код. Тут самое интересное. Согласно примерам нужно делать так:

    Код (C++):
    // библиотека SD-module
    #include <SD.h>
    // библиотека SPI - пока, что не ведомая мне стихия
    #include <SPI.h>

    File logFile;
    // типовой пример из библиотеки "SD" для создания файла и вывода в Serial сообщения что всё хорошо
    void SDCheck()
    {
      Serial.print("Initializing SD card...");

      if (!SD.begin(chipSelect)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");

      if (SD.exists("example.txt")) {
        Serial.println("example.txt exists.");
      }
      else {
        Serial.println("example.txt doesn't exist.");
      }

      // open a new file and immediately close it:
      Serial.println("Creating example.txt...");
      logFile = SD.open("example.txt", FILE_WRITE);
      logFile.close();

      // Check to see if the file exists:
      if (SD.exists("example.txt")) {
        Serial.println("example.txt exists.");
      }
      else {
        Serial.println("example.txt doesn't exist.");
      }

      // delete the file:
      Serial.println("Removing example.txt...");
      SD.remove("example.txt");

      if (SD.exists("example.txt")){
        Serial.println("example.txt exists.");
      }
      else {
        Serial.println("example.txt doesn't exist.");
      }
    }

    void setup()
    {
    // открываем последовательный порт
      Serial.begin(9600);
      // инициализация SD
      SD.begin();
    // запускаем функцию
    SDcheck();
    }

    void loop()
    {
    // тут какой то код, и по факту для SD ничего пока что не происходит
    }
     

    Как результат написал "initialization failed!" и был таков.
    Что смущает ни в одном примере не нашел как корректно в SPI на Teensy объявлять подключенные пины. Нужно ли это делать вообще. Увы пока и из всех возможных вариантов ничего не помогло, или я не там искал.

    Заранее благодарен!
     

    Вложения:

    • image.jpeg
      image.jpeg
      Размер файла:
      1,8 МБ
      Просмотров:
      1.502
    Последнее редактирование: 26 июл 2016
  2. geher

    geher Гуру

    Сразу замечу, что сам SD карту не подключал, только другие SPI устройства, причем только с 3.3 В питанием.

    Возможные засады:
    1. Питание. Если Teensy не 3.2, то она на пин 3.3 В выдает только 100 мА (и то не всегда). SD карте может и не хватить.
    2. Опять питание. Какое напряжение питания должно быть у модуля? 5 или 3.3?
    3. Инициализация SPI. Теоретически, по умолчанию на SPI назначаются те пины, которые помечены SPIшными пометками на схеме более темным шрифтом. И как-то специально их назначать не надо. При этом смутно помнится. что есть какие-то ограничения на использование конкретных выводов SPI с какими-то другими возможностями.
    Перед вызовом
    SD.begin();
    надо вроде как вызвать
    SPI.begin();
    Если возникнет такая необходимость, можно назначить пины для SPI (естественно, только из подписанных соответствующим образом на схеме) такими вызовами
    SPI.setCS(номер пина);
    SPI.setMISO(номер пина);
    SPI.setSCK(номер пина);
    4, Инициализация SD. Наверное стоит при инициализации SD указать номер пина CS, подключенный к SD.
    В вашем случае вроде как
    SD.begin(10);
    Также смутно припоминаю, что вне зависимости от того, к какому пину подключен CS SD модуля, следует явно назначать режим CS пина на Teensy в OUTPUT (особенности библиотеки SD). Пин, к которому подключен CS модуля, естественно, тоже должен быть назначен в OUTPUT.
     
  3. PlaaPlaaa

    PlaaPlaaa Нуб

    Тогда по порядку:
    1. Питается сейчас sd вместе с остальной оснасткой успешно (как по мне) от выхода "Vin 3.7 - 5.5 volts" и что то я тут подумал что это не правильно, особенно учитывая, что внешнее питание (Батарейки) предлагают заводить именно туда. Видимо отдельно нужно искать решение.
    2. В спецификации написано 5.
    3. SPI.begin объявил, не помогло.
    Необходимость объявления пинов пока не понял. Ведь у нас дальше идет обращение лишь к одному из них (так называемый CS), а он уже явно объявлен (не указал в коде, но оно и правда есть).
    4. SD.begin(10) пробовал, SD.begin(CS) (ссылаясь на объявленный пин выше) пробовал. Пока ничего.
    К слову, а если ему пину CS дать свойство OUTPUT, как он будет читать информацию с карты? Или хотябы проверять создался ли там файл?

    Если нужна, дополнительная информация и я что то не написал, спрашивайте.
    Пока попробую собрать схему только на тинзи и СД модуле. И написать все заново. А то 3 вечер на смарку))

    Еще раз спасибо
     
  4. geher

    geher Гуру

    CS - это CHIP SELECT. Управление включением-выключением обмена с устройством. Потому нужен только как выход. Режимы работы других выводов SPI вроде как управляется из самой библиотеки SPI, а потому самому их выставлять не надо.
    А на получение данных при общении микроконтроллера по SPI только MISO работает.

    VIn, естественно, предназначен для подачи питания на Teensy, но, если мне память не изменяет, по умолчанию (без разрыва перемычки) на этот вывод идет напрямую +5В с разъема USB.

    По поводу п.2. чисто теоретически 5В модуль может "не понимать" сигналы 3.3В логики, хотя у большинства модулей с 5В логикой такой проблемы не наблюдается.