Приветствую, уважаемые! Собственно, этот пост затеян для тех, кто по каким-то причинам не может поженить одновременную работу SD-модуля с другими железками, работающими по hardware SPI, например, с тем-же W5100 от Wiznet. Собственно, описание того, с чем столкнулся я, и будет изложено ниже. Итак... Есть у китайцев вот такой модуль SD: http://ru.aliexpress.com/item/New-A...-Storage-Expansion-Board-For/32259529871.html Работает, как водится, по SPI, на борту сразу стаб на 3,3В, и микруха-драйвер всего этого добра. Подключается и работает - на раз, к качеству карточек особо не требователен, работает с теми же китайскими. У меня в проекте используется в качестве даталоггера, к SPI подключен такэе графический LCD-экран на контроллере ST7920. И вот захотел я добавить в проект поддержку ещё одного шлюза между контроллером и внешним миром: был только Wi-Fi, захотелось ещё и по Ethernet. Прикупил отдельный модуль на W5100, и - давай подсоединять. А оно - не взлетает ни в какую: то не получается проинициализировать SD, то - W5100 не получает IP по DHCP. Пару вечеров копания в интернетах (спасибо вмес, кто так или иначе тогда помог - ребятам с ардуинору, саутй изиэлектроникс и великому гуглу) и мозгового штурма (наблюдая за результатом вызова функции Ethernet.localIP() и тупя в мониторе порта на 255.255.255.255) привели к следующим выводам: этот зараза-модуль, имею в виду SD - имеет жёсткую подтяжку линий данных SPI к питанию! И даже когда CS модуля в высоком уровне - линии всё равно тянутся вверх! Чем это нам чревато? Да всё просто - отключили вы модуль SD от SPI поднятием его линии выбора ведомого, а оно, сволочь, тянет линии SPI вверх. В этот момент ардуина пытается прочитать, чего там ей ответил W5100, например, читает - а в линии одни единички, она задрана вверх модулем! Какой вывод можно сделать из всего этого и как это добро победить? Вывод простой: юзать верные модули, это во-первых. Во-вторых, раз уж попался не самый верный модуль, то не отчаиваться, а исправить ситуацию. Поправить можно разными способами: 1. Варварско-паяльный. Берём - и убираем подтяжку линий у модуля. Требует прямых рук для пайки (не мой случай, с мелочёвкой не могу), аккуратности, наличия ещё одного модуля в запасе (на всякий, вдруг с первым не прокатит ); 2. Инженерно-технологичный: берём старую добрую 74HC125, и вешаем MISO SD-модуля через один канал микрухи, CS модуля запараллеливаем с выводом OE канала микрухи - всё! Строго говоря, мне второй способ видится более предпочтительным: во-первых, не корёжим модуль, обеспечивая некую прозрачность замены. Во-вторых, мне кажется, что лучше все линии MISO всех модулей, работающих по SPI - заводить через указанную микруху, т.к. неизвестно ещё - чего там китайцы с подтяжками намудрят завтра или послезавтра. Итог: пара лишних соединительных проводков и микруха - и сейчас у меня на макетке успешно трудятся SD, W5100 и LCD-экран, гоняя данные по одной шине. Думаю, когда буду добавлять туда nRF - всё будет так же прозрачно и без плясок с бубном из-за MISO. Во всяком случае - верю в это Такая вот шаурма.
Ну мы уже заложились на nRF, в принципе. Весна покажет, кто где с...л, как известно Если не устроит - будем думать за RFM69. У нас одно требование - чтобы в тиньку, желательно, уместилось - планируются выносные беспроводные модули с датчиками для проекта в подписи.
Дык... Вы про размер сказали - я фото в инете нашел. Модуль очень маленький , управляется по SPI и логика управления приблизительно как и nRF. Только на 433 Мгц (значит дальше бьет) и не глючный - пока не подделывают.
Столкнулся с данным феноменом, так и не докумекал причину. Решил по своему, беспроводно-софтверным путем. В файлах библиотеки SD пару строк закоментил и одну раскоментил, в результате SDCard посадил на soft SPI: в Sd2Card.cpp: Код (C++): //#define USE_SPI_LIB в Sd2Card.h: Код (C++): #define MEGA_SOFT_SPI 1 //#define USE_SPI_LIB далее по тексту ищем определение выводов и правим по вкусу: Код (C++): /** SPI chip select pin */ 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;