Разобраться с ковертером логики 3.3v - 5v

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем djdance, 5 ноя 2012.

  1. djdance

    djdance Нерд

    Есть плата на 3.3V, управляется по SPI, хочу её к Ардуино.
    Вопрос: нужен логик конвертер? Дуплексный? достаточно такого?

    http://www.mikroe.com/add-on-boards/power-supply/3-3v-5v-voltage-translator/

    а может еще и такого в противоположном направлении? :confused: я что-то не уверен.
    http://www.mikroe.com/add-on-boards/power-supply/5v-3-3v-voltage-translator/

    PS да, у меня есть спаркфановский конвертер. И у него 4 пина, вроде для SPI хватит. Но суппорт очень лаконично советует обе (обе!) свои. Зачем обе-то? В чем подвох.
     
  2. Unixon

    Unixon Оракул Модератор

    С SPI вообще то все просто, в отлиие от I2C или прочих 1,2-wire с двунаправленными линиями :)
    Т.к. в SPI все линии однонаправленные, поступаем еще проще - все выходящие линии из 5V логики в 3.3V пропускаем через резисторные делители, а все входящие линии из 3.3V логики в 5V пропускаем как есть, у них уровни часто совместимые в этом направлении. Единственное, от чего, возможно, стоит защититься - это от случайного включения входного пина в режим выхода с выдачей высокого уровня, но тут спасет либо входной транзистор либо даже слабенький стабилитрон ну или еще диод Шоттки от пина к +3.3V шине в прямом направлении.

    А двунаправленные трансиверы - это конечно круто, но очень тяжелая артиллерия для SPI.
     
  3. djdance

    djdance Нерд

    о, спасибо, ваш абзац стоит нескольких часов гугления.

    > С SPI вообще то все просто, в отлиие от I2C или прочих 1,2-wire с двунаправленными линиями
    зато протокол посложнее :)

    > тяжелая артиллерия для SPI.
    ну стоит-то она копейки, или вы имеете в виду ТТХ? (отклик, надежность, м?)
     
  4. Unixon

    Unixon Оракул Модератор

    Нет, в том смысле смысле, что есть более простое схемотехническое решение, что не стоит городить спциальный чип или тем более целый многоканальный breakout-board с ним, там где достаточно нескольких пассивных компонентов. С точки зрения пользования готовым решением оно может быть и проще, но хочется чтобы было понимание, что вообще то это слегка перебор.
     
  5. djdance

    djdance Нерд

    понял, да.

    А как вообще проверить, что SPI работает? вроде все припаял, а шилд не звучит. Есть какие-то контрольные процедуры? С i2c ясно - если устройство и шина живы, они однозначно определяются, и дальше дело за алгоритмом. А в SPI байты уходят, а чего-то типа АСК не существует.... (?)
     
  6. Unixon

    Unixon Оракул Модератор

    Да собственно то же самое... вы устройству посылаете определенный запрос, оно тоже отвечает каким-то определенным образом. А по какой шине это делается уже дело третье. Если ведомое устройство вообще не может (не умеет, не должно) отвечать, ну тогда только по косвенным признакам.
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Посмотрите пример подключения SD-карты к Ардуино (по всем интернетам валяется) - там как раз SPI на резисторных делителях. Я проверял, работает.
    Как проверить SPI - а просто соединить MOSI и MISO разве нельзя? Тогда на приеме будем видеть то, что отправили.
     
  8. djdance

    djdance Нерд

    надо имхо через буфер какой-то соединять, я же не могу одновременно писать и читать в однозадачном ардуино
     
  9. Unixon

    Unixon Оракул Модератор

    Давайте разделим проблему на части попроще:
    1) прохождение сигнала в обе стороны;
    2) работа устройств по протоколу;
    Если у вас (1) все в порядке, проблема может быть только в программе.
     
  10. djdance

    djdance Нерд

    спасибо что возитесь :)
    читаю с регистра, допустим, VOL - получаю 65535. И с регистра SPI_MODE читаю тоже 65535. Совсем плохо.

    У этой платы есть DREQ - нога "помедленней, я записываю". На неё у меня логикконвертера не хватило, висит в воздухе, разбираюсь, можно ли вообще без неё.

    А еще режим SDI - передача данных - с чем это едят, непонятно пока
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

    Чтение и запись в SPI происходит одновременно (аппаратно, многозадачность тут ни при чем), не надо никакого буфера.
    Например, точно так же отлаживают обмен по последовательному порту - коротят TX и RX и получают обратно все отправленное.
     
  12. djdance

    djdance Нерд

    как же одновременно, если в коде строчки идут друг за другом, и надо сначала закрыть одну транзакцию, чтобы начать другую. Или приведите "одновременный" код чтения-записи
     
  13. Megakoteyka

    Megakoteyka Оракул Модератор

    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);
     
  14. djdance

    djdance Нерд

    спасибо, по гуглссылке любопытно , пошел читать.

    а вот по библе ардуино принятый байт - это не совсем то, насколько я понял. Если вам устройство что-то непрерывно шлет, вы вот так не вклинитесь в этот поток, что-то передав и приняв без нарушения принимаемого потока.
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    Вот еще интересно http://nnm.ru/blogs/e-troll/arduino-spi/

    Почему не то? SPI тот же самый... И логика работы интерфейса - одновременный обмен в обе стороны.