Есть плата на 3.3V, управляется по SPI, хочу её к Ардуино. Вопрос: нужен логик конвертер? Дуплексный? достаточно такого? http://www.mikroe.com/add-on-boards/power-supply/3-3v-5v-voltage-translator/ а может еще и такого в противоположном направлении? я что-то не уверен. http://www.mikroe.com/add-on-boards/power-supply/5v-3-3v-voltage-translator/ PS да, у меня есть спаркфановский конвертер. И у него 4 пина, вроде для SPI хватит. Но суппорт очень лаконично советует обе (обе!) свои. Зачем обе-то? В чем подвох.
С SPI вообще то все просто, в отлиие от I2C или прочих 1,2-wire с двунаправленными линиями Т.к. в SPI все линии однонаправленные, поступаем еще проще - все выходящие линии из 5V логики в 3.3V пропускаем через резисторные делители, а все входящие линии из 3.3V логики в 5V пропускаем как есть, у них уровни часто совместимые в этом направлении. Единственное, от чего, возможно, стоит защититься - это от случайного включения входного пина в режим выхода с выдачей высокого уровня, но тут спасет либо входной транзистор либо даже слабенький стабилитрон ну или еще диод Шоттки от пина к +3.3V шине в прямом направлении. А двунаправленные трансиверы - это конечно круто, но очень тяжелая артиллерия для SPI.
о, спасибо, ваш абзац стоит нескольких часов гугления. > С SPI вообще то все просто, в отлиие от I2C или прочих 1,2-wire с двунаправленными линиями зато протокол посложнее > тяжелая артиллерия для SPI. ну стоит-то она копейки, или вы имеете в виду ТТХ? (отклик, надежность, м?)
Нет, в том смысле смысле, что есть более простое схемотехническое решение, что не стоит городить спциальный чип или тем более целый многоканальный breakout-board с ним, там где достаточно нескольких пассивных компонентов. С точки зрения пользования готовым решением оно может быть и проще, но хочется чтобы было понимание, что вообще то это слегка перебор.
понял, да. А как вообще проверить, что SPI работает? вроде все припаял, а шилд не звучит. Есть какие-то контрольные процедуры? С i2c ясно - если устройство и шина живы, они однозначно определяются, и дальше дело за алгоритмом. А в SPI байты уходят, а чего-то типа АСК не существует.... (?)
Да собственно то же самое... вы устройству посылаете определенный запрос, оно тоже отвечает каким-то определенным образом. А по какой шине это делается уже дело третье. Если ведомое устройство вообще не может (не умеет, не должно) отвечать, ну тогда только по косвенным признакам.
Посмотрите пример подключения SD-карты к Ардуино (по всем интернетам валяется) - там как раз SPI на резисторных делителях. Я проверял, работает. Как проверить SPI - а просто соединить MOSI и MISO разве нельзя? Тогда на приеме будем видеть то, что отправили.
надо имхо через буфер какой-то соединять, я же не могу одновременно писать и читать в однозадачном ардуино
Давайте разделим проблему на части попроще: 1) прохождение сигнала в обе стороны; 2) работа устройств по протоколу; Если у вас (1) все в порядке, проблема может быть только в программе.
спасибо что возитесь читаю с регистра, допустим, VOL - получаю 65535. И с регистра SPI_MODE читаю тоже 65535. Совсем плохо. У этой платы есть DREQ - нога "помедленней, я записываю". На неё у меня логикконвертера не хватило, висит в воздухе, разбираюсь, можно ли вообще без неё. А еще режим SDI - передача данных - с чем это едят, непонятно пока
Чтение и запись в SPI происходит одновременно (аппаратно, многозадачность тут ни при чем), не надо никакого буфера. Например, точно так же отлаживают обмен по последовательному порту - коротят TX и RX и получают обратно все отправленное.
как же одновременно, если в коде строчки идут друг за другом, и надо сначала закрыть одну транзакцию, чтобы начать другую. Или приведите "одновременный" код чтения-записи
http://arduino.cc/en/Reference/SPITransfer http://arduino.ru/Reference/Library/SPI/transfer Параметры: - отправляемое значение - SS-пин - режим передачи Возвращаемое значение: - принятый байт Вот еще народ пишет... https://groups.google.com/forum/#!topic/ioio-users/H-buDLwYHDI А тут помимо всего прочего есть интересные картинки... http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus Предлагаю попробовать так: Код (Text): byte sent = 0x55; byte rcvd = SPI.transfer(sent);
спасибо, по гуглссылке любопытно , пошел читать. а вот по библе ардуино принятый байт - это не совсем то, насколько я понял. Если вам устройство что-то непрерывно шлет, вы вот так не вклинитесь в этот поток, что-то передав и приняв без нарушения принимаемого потока.
Вот еще интересно http://nnm.ru/blogs/e-troll/arduino-spi/ Почему не то? SPI тот же самый... И логика работы интерфейса - одновременный обмен в обе стороны.
коллеги, а как быть когда наоборот, МК с логикой на 3.3в а управляемый чип по SPI работает на 5в логике ?
да так же - нужен логик конвертер. К счастью, с момента первого сообщения в этой ветке они сильно подешевели Раз этак в 20-30.