Библиотека SD не работает с Arduino Mega ?

cyberman
Offline
Зарегистрирован: 30.10.2018

Уважаемые форумчане. Помогите разобраться с проблемой. Модуль считывателя SD карт 

https://arduino-kit.ru/product/modul-rc051-modul-micro-sd-kartyi-pamyati-dlya-arduino-2.

Arduino Mega 2560. Arduino IDE 1.8.9. SD карта на 2Г ,отформатированная на ПК в FAT16. Пытаюсь выполнить пример ReadWrite.ino из examples, которые с библиотекой SD. Пример не работает.

Что я делал. Подцепал  SPI-пины SD-модуля на 50-52 пины Ардуины, при этом CS последовательно пытался прицепить на 4,10,53, меняя при этом в скетче строку SD.begin(4)). То же самое, но подцепая SPI-пины SD-модуля на 11-13 пины ардуины. Тоже самое, но питание SD-модуля от 3.3 V. Тоже самое, но питание ардуины и соответственно модуля не от ПК  через USB, а от источника 12 V. Во всех вариантах я вижу один и тот же ответ: "initialization failed!". С примером CardInfo.ino тоже самое. При этом на UNO все благополучно работает. 

Накопал в инете что нужно в модуле Sd2Card.h изменить номера пинов в строках

uint8_t const SD_CHIP_SELECT_PIN = 10;
/** SPI Master Out Slave In pin */
uint8_t const SPI_MOSI_PIN = 11;
/** SPI Master In Slave Out pin */
uint8_t const SPI_MISO_PIN = 12;
/** SPI Clock pin */
uint8_t const SPI_SCK_PIN = 13;
 
на соответствующие 50-е пины
 
Поменял, ничего не изменилось. Вгляделся в код. Понял что менять эти константы просто так бесполезно, нужно еще 
//#define MEGA_SOFT_SPI 0
установить в единицу. Там, собственно, так и написано:
 * Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos.
Поменял. После этого пример просто тупо перестал компилироваться с ошибкой 
C:\Program Files (x86)\arduino-1.8.9\libraries\SD\src\utility\Sd2Card.cpp:172:5: error: 'SDCARD_SPI' was not declared in this scope
что абсолютно логично, потому что SDCARD_SPI устанавливается в значение "SPI" только если НЕ определена SOFTWARE_SPI, а она как раз-таки становится определена, если MEGA_SOFT_SPI == 1. В противном случае SDCARD_SPI остается пустой! Я несколько удивился. На одном сайте нашел совет закомментировать 
#define USE_SPI_LIB
в Sd2Card.h  и Sd2Card.cpp. Закомментировал. Стала вылезать ошибка 
C:\Program Files (x86)\arduino-1.8.9\libraries\SD\src\SD.cpp:356:15: error: 'class Sd2Card' has no member named 'setSpiClock'
что абсолютно логично, потому что этот метод определяется только если USE_SPI_LIB определена, а я ее своими руками только что закомментировал...
#ifdef USE_SPI_LIB
  uint8_t setSpiClock(uint32_t clock); 
Впадаю в ступор - разработчики библиотеки SD вообще свою библиотеку на Меге не только не отлаживали, но даже не компилировали что ли? Можно конечно еще что-нибудь где-нибудь закомментировать или раскомментировать, но сколько же это может продолжаться...? 
Подскажите плиз - что и где нужно поправить в библиотеке SD, чтобы она начала работать с Мегой? Или может дело не в библиотеке? 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cyberman пишет:
Или может дело не в библиотеке?
Боюсь, что так и есть.

cyberman
Offline
Зарегистрирован: 30.10.2018

А в чем тогда? Подскажите плиз - куда копать? 

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

cyberman пишет:

А в чем тогда?

"не в бобине"

Прежде чем лезть и менять все подряд в библиотеке, разберитесь, например, чем отличается аппаратное SPI, для которого вы пытались менять пины, и программное. которое вы пытались включить одновременно с первым...

Библиотека Sd отлично работает с Мегой

cyberman
Offline
Зарегистрирован: 30.10.2018

Прежде чем лезть и менять все подряд в библиотеке... Я бы не полез в нее вообще, если бы не необходимость. Я и не лез сначала. Сначала я подключил SD-модуль к 51-53 пинам. Поменял в скетче SD.begin(4) на SD.begin(53). В ответ получил "initialization failed!" Ну и начал эксперементировать. А как надо было? 

cyberman
Offline
Зарегистрирован: 30.10.2018

Бог с ним  с кодом в библиотеке. Вернул все назад. Подключил выходы SD-модуля так: MOSI - 51, MISO-50, SCK-52, CS- 53, VCC- 5V, GND-GND. В скетче поменял SD.begin(4) на SD.begin(53). В ответ - "initialization failed!". Что я делаю не так? 

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

СS на 53 не забыли подключить? На Уно этот же модуль работает?

По поводу того, что у вас написано ниже первого абзаца в заглавном сообщении - никуда в библиотеку лезть не надо, при смене платы в ИДЕ на Мега пины SPI автоматически меняются на пины Меги. Тем более не нужно трогать настройки SPI библиотеки и включать софтовый SPI/

Если модуль работает на Уно - ищите проблемы в Меге, может там SPI пины не работают, или, например, не пропаяны

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
например, не пропаяны

Или с подключением напутано (мисо с моси перепутаны или ещё чего).

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

cyberman пишет:

 Подключил выходы SD-модуля так: ... CS- 53..... Что я делаю не так? 

Вот это и делаешь не так. Chip Select подключаемых устройств не нужно подключать на CS самой ардуинки. Ты хоть на одной схеме подключения этого модуля к Уно видел, чтобы CS цепляли к CS платы? Или, всё ж таки, на ногу №4, к примеру?

cyberman
Offline
Зарегистрирован: 30.10.2018

На UNO этот же модуль с этой же карточкой работает без проблем. 

Я не понял про CS- выход SD-модуля - так куда его нужно цеплять? У меня он сейчас прицеплен на 53 пин ардуины. А нужно оставить на 4-ом?... 

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

cyberman пишет:

Я не понял про CS- выход SD-модуля - так куда его нужно цеплять? У меня он сейчас прицеплен на 53 пин ардуины. А нужно оставить на 4-ом?... 

на любой свободный цифровой, например я на меге обычно цепляю на пин 9 или 10. Не забудь только в коде begin() с этим пином прописать

cyberman
Offline
Зарегистрирован: 30.10.2018

ЕвгенийП пишет:

b707 пишет:
например, не пропаяны

Или с подключением напутано (мисо с моси перепутаны или ещё чего).

было такое.... Но еще 3 дня назад исправлено

cyberman
Offline
Зарегистрирован: 30.10.2018

b707 пишет:

cyberman пишет:

Я не понял про CS- выход SD-модуля - так куда его нужно цеплять? У меня он сейчас прицеплен на 53 пин ардуины. А нужно оставить на 4-ом?... 

на любой свободный цифровой, например я на меге обычно цепляю на пин 9 или 10. Не забудь только в коде begin() с этим пином прописать

Если мне память не изменяет, я так делал, я уже запутался в комбинациях как и что я  делал...

Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял? 

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

cyberman пишет:

Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял? 

да

cyberman
Offline
Зарегистрирован: 30.10.2018

b707 пишет:

cyberman пишет:

Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял? 

да

Большое спасибо за подсказку. Сегодня попробую и обязательно отпишусь. 

cyberman
Offline
Зарегистрирован: 30.10.2018

b707 пишет:

cyberman пишет:

Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял? 

да

Вы оказались правы. Подключил таким образом - все заработало. Видимо я когда "менял варианты" что-то все-таки перепутал. Большое спасибо!

cyberman
Offline
Зарегистрирован: 30.10.2018

Вы тоже оказались правы! я видимо действительно перепутал провода. Сейчас все работает. Спасибо