1-проводной SPI помогите разобраться

Тема в разделе "Arduino & Shields", создана пользователем DrProg, 30 май 2015.

  1. DrProg

    DrProg Вечный нерд

    Собрал вот такую схему. Сижу битый час безуспешно пытаюсь запустить. Принцип работы примерно понятен, но возникло несколько вопросов.
    Например, насколько я понимаю, для записи данных ножка микросхемы ST_CP (защелка) должна быть притянута к земле, то есть LOW. Но при передачи данных она постоянно в HIGH, согласно схеме сигналов. Каким образом данные должны попадать в регистр в таком случае?
    Механизм передачи нулей и единиц более мене понятен, для нуля сигнал на DS должен быть LOW при подаче HIGH на SH_CP, при единице, соответственно HIGH, но добиться синхронизации пока не могу. Подаю разной продолжительности перепады но увы.
    Больше всего смущает latch конечно, не стыкуются мои знания по регистру с этим способом его защелкивания.
     
  2. Unixon

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

    Данные сдвигаются сигналом SHIFT (ST_SH).

    Что мешает воспользоваться частью библиотеки от QuadDisplay?

    Регистр запоминает бит и байт по переднему фронту SHIFT (SH_CP) и LATCH (ST_CP)
     
  3. Unixon

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

    DelayWire.h
    Код (Text):

    #ifndef DELAYWIRE_H
    #define DELAYWIRE_H

    #include <Arduino.h>

    void dwSendByte(uint8_t pin, byte data, byte n = 8);
    void dwLatch(uint8_t pin);

    #endif
     
    DelayWire.cpp
    Код (Text):

    #include "DelayWire.h"

    void dwSendByte(uint8_t pin, byte data, byte n)
    {
     for (byte i = n; i > 0; i--)
     {
      if (data & 1)
      {
      noInterrupts();
      digitalWrite(pin, LOW);
      digitalWrite(pin, HIGH);
      interrupts();
      delayMicroseconds(30);
      }
      else
      {
      digitalWrite(pin, LOW);
      delayMicroseconds(15);
      digitalWrite(pin, HIGH);
      delayMicroseconds(60);
      }
      data >>= 1;
     }
    }

    void dwLatch(uint8_t pin)
    {
     digitalWrite(pin, LOW);
     delayMicroseconds(100);
     digitalWrite(pin, HIGH);
     delayMicroseconds(300);
    }
     
     
    DrProg нравится это.
  4. DrProg

    DrProg Вечный нерд

    Спасибо за код, разобрался! Оказывается я все делал правильно кроме одного места, а именно при установке единицы делал задержку 5мкс, но видимо даже этого много, как только убрал (подсмотрев пример) так все заработало.
    Единственная проблема: в том и другом случае последний бит получается нулевым, т.к. вероятно закидывается вместе с защелкой.
     
    Последнее редактирование: 1 июн 2015
  5. DrProg

    DrProg Вечный нерд

    А вообще штука нестабильная, очень капризная, есть смысл использовать только в случае крайней необходимости при критической нехватке ножек. Но в качестве учебного материала покатит.