Уважаемые форумчане. Помогите разобраться с проблемой. Модуль считывателя 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, чтобы она начала работать с Мегой? Или может дело не в библиотеке?
А в чем тогда? Подскажите плиз - куда копать?
А в чем тогда?
"не в бобине"
Прежде чем лезть и менять все подряд в библиотеке, разберитесь, например, чем отличается аппаратное SPI, для которого вы пытались менять пины, и программное. которое вы пытались включить одновременно с первым...
Библиотека Sd отлично работает с Мегой
Прежде чем лезть и менять все подряд в библиотеке... Я бы не полез в нее вообще, если бы не необходимость. Я и не лез сначала. Сначала я подключил SD-модуль к 51-53 пинам. Поменял в скетче SD.begin(4) на SD.begin(53). В ответ получил "initialization failed!" Ну и начал эксперементировать. А как надо было?
Бог с ним с кодом в библиотеке. Вернул все назад. Подключил выходы SD-модуля так: MOSI - 51, MISO-50, SCK-52, CS- 53, VCC- 5V, GND-GND. В скетче поменял SD.begin(4) на SD.begin(53). В ответ - "initialization failed!". Что я делаю не так?
СS на 53 не забыли подключить? На Уно этот же модуль работает?
По поводу того, что у вас написано ниже первого абзаца в заглавном сообщении - никуда в библиотеку лезть не надо, при смене платы в ИДЕ на Мега пины SPI автоматически меняются на пины Меги. Тем более не нужно трогать настройки SPI библиотеки и включать софтовый SPI/
Если модуль работает на Уно - ищите проблемы в Меге, может там SPI пины не работают, или, например, не пропаяны
Или с подключением напутано (мисо с моси перепутаны или ещё чего).
Подключил выходы SD-модуля так: ... CS- 53..... Что я делаю не так?
Вот это и делаешь не так. Chip Select подключаемых устройств не нужно подключать на CS самой ардуинки. Ты хоть на одной схеме подключения этого модуля к Уно видел, чтобы CS цепляли к CS платы? Или, всё ж таки, на ногу №4, к примеру?
На UNO этот же модуль с этой же карточкой работает без проблем.
Я не понял про CS- выход SD-модуля - так куда его нужно цеплять? У меня он сейчас прицеплен на 53 пин ардуины. А нужно оставить на 4-ом?...
Я не понял про CS- выход SD-модуля - так куда его нужно цеплять? У меня он сейчас прицеплен на 53 пин ардуины. А нужно оставить на 4-ом?...
на любой свободный цифровой, например я на меге обычно цепляю на пин 9 или 10. Не забудь только в коде begin() с этим пином прописать
Или с подключением напутано (мисо с моси перепутаны или ещё чего).
было такое.... Но еще 3 дня назад исправлено
Я не понял про CS- выход SD-модуля - так куда его нужно цеплять? У меня он сейчас прицеплен на 53 пин ардуины. А нужно оставить на 4-ом?...
на любой свободный цифровой, например я на меге обычно цепляю на пин 9 или 10. Не забудь только в коде begin() с этим пином прописать
Если мне память не изменяет, я так делал, я уже запутался в комбинациях как и что я делал...
Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял?
Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял?
да
Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял?
да
Большое спасибо за подсказку. Сегодня попробую и обязательно отпишусь.
Итак. MOSI - 51, MISO-50, SCK-52. СS - на 10!!! + SD.begin(10) - правильно я понял?
да
Вы оказались правы. Подключил таким образом - все заработало. Видимо я когда "менял варианты" что-то все-таки перепутал. Большое спасибо!
Вы тоже оказались правы! я видимо действительно перепутал провода. Сейчас все работает. Спасибо