3wire SPI mit Bascom

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • 3wire SPI mit Bascom

      Ein schönes WE wünsche ich...

      Frage: Kann man mit Bascom ein 3wire-SPI aufsetzen?
      Ich habe einen Feuchte-Temperatursensor (HTS221 mit SPI), der auf einer Leitung SDI und SDO hat.
      Man gibt zunächst 8bits aus (6Bit-Adresse und zwei weitere) und liest dann die nächsten 8 Bit ein mit dem Wert des Registers.

      Ich versuche gerade, das zu Fuss zu machen, die Kiste hustet mir aber was... a_76_270feff1

      Gruss
      Peer
    • hier noch mal der code für ein Register:

      'who_am_I einlesen...
      Config Sdi = Output
      Dim Who_am_i As Byte
      Cs = 1
      Clk = 1
      Adresse = &B10001111
      Cs = 0

      For I = 7 To 0 Step -1
      Sdi = Adresse.i
      Clk = 0 : Waitms 1 : Clk = 1 : Waitms 1
      Next I
      Config Sdi = Input
      Sdi = 1
      Waitms 1
      For I = 7 To 0 Step -1
      Clk = 0 : Waitms 1 : Clk = 1
      Who_am_i.i = Sdi
      Waitms 1
      Next I
      Cs = 1
      ------------------------------------------

      Die Waits habe ich nur aus Verzweiflung eingebaut, falls der Sensor einwenig lahm sein sollte...

      CS und Clock auf high (CS und Clock arbeiten von high nach low)
      Ich ziehe CS auf 0, um den Übertragungsvorgang zu starten
      Dann übertrage ich die 6Bit Adresse incl. den ersten zwei bits, die ich per Hand addiert hatte (MSB ist 1, das heist, es soll aus einem Register "gelesen" werden, das zweite ist 0: nur eine Adresse abarbeiten (sonst kann man wohl auch beliebig viele auslesen, die hintereinander liegen)), dann folgt die 6Bit Adresse
      Dann schalte ich SDI von Ausgang auf Eingang und versuche, die nächsten 8Bits zu lesen.
      Dann ziehe ich CS wieder auf high, um den Vorgang zu beenden.

      Mache ich da prinzpiell alles falsch?

      Gruss
      Peer
    • Peer Gehrmann schrieb:

      Frage: Kann man mit Bascom ein 3wire-SPI aufsetzen?
      SPI hat eigentlich immer 3 Wires plus GND, leider hat das der HTS122 nicht.

      Peer Gehrmann schrieb:

      Mache ich da prinzpiell alles falsch?
      Der Chip ist etwas eigenartig, deine Idee ist aber im Prinzip richtig.
      Warum benutzt du nicht einfach die Bascom-eigenen Befehle Spiout/Spiin oder Shiftout/Shiftin?
    • im Datenblatt ist das als 3wire gezeichnet...
      ...hat SPI normalerweise nicht ein Din und ein Dout-Kanal? Das macht mit CS und Clk dann doch 4wire, oder habe ich jetzt was quer?

      Wie auch immer, ich könnten natürlich auch mit SPIIN und OUT abeiten, aber dann brauche ich ja wieder 4 Leitungen durch die Definitionen der Config:

      (Bascom-Hilfe)


      Config Spi = Soft , Din =Pinb.0 , Dout =Portb.1 , Ss =Portb.2 , Clock =Portb.3
      Spiinit
      Spiout A(1), 4 'write 4 bytes a(1), a(2) , a(3) and a(4)


      oder kann ich das einfach vor Spiin/out wechsel einfach umschreiben bzw. einfach beide Kanäle mit dem gleichen Port belegen?

      Gruss
      Peer
    • Peer Gehrmann schrieb:

      Das macht mit CS und Clk dann doch 4wire, oder habe ich jetzt was quer?
      ja, CS kommt auch noch dazu für die Slaveauswahl. aber normalerweise werden nur 3 wires gezählt, SCK/SDI/SDO

      Peer Gehrmann schrieb:

      oder kann ich das einfach vor Spiin/out wechsel einfach umschreiben bzw. einfach beide Kanäle mit dem gleichen Port belegen?
      versuch macht kluch ;)

      Peer Gehrmann schrieb:

      habe mir gerade mal shiftout/in angeguckt, probier ich mal...
      das wäre zum Test erstmal die Variante meiner Wahl.
      Der Chip ist aber mit 10Mhz SPI-Takt schnell genug für Hardware-SPI (für später), du brauchst also keine Pausen.
    • Peer Gehrmann schrieb:

      ist natürlich toll, dass die im Datenblatt von 3wire reden, wobei es offensichtlich nur zwei hat..
      ja, 3wire ist woanders gebräuchlicher, bei uns heißt es eher SPI

      Murmel schrieb:

      über CS SPI oder I2C (TWI) selectierbar.
      Damit sollte die Hürde genommen sein.
      Ich würde hier auch zu I2C tendieren, einfach weil es eindeutiger ist.
      Die Geschwindigkeit ist bei einem Feuchte/Temperatursensor auch nicht wirklich nötig.
      Ganz nebenbei, ich habe hier den MS5611 auf dem Tisch und hatte auch die Wahl zwischen SPI und I2C. Ich habe letzteres gewählt ;)
    • so, i2c ging nicht, weil das Schutzbeschaltung vor war, die Pullups für I2C also hätten per Hand eingelötet werden müssen...nicht schön.

      Nach Analysen beim Entwickler auf dem Oszi ging es dann aber sowohl "zu Fuß", als auch mit shiftin und shiftout wunderbar, wobei die shift-Funktion natürlich viel aufgeräumter ist und zumindest im Editor sehr viel übersichtlicher wird und Fehler bei der ganzen CS und Clk Setzerei vermieden werden.

      Das Teil ging nicht, weil...

      1. die Schutzbeschaltung (die eigentlich obligat ist) das Signal des Sensors arg gestört hatte
      2. noch ein paar Register gesetzt werden mussten, um die Kiste zu starten (beim booten läuft die nicht einfach von allein...doof).

      Gelernt:
      Ohne Signalverlauf auf Ozi keine Chance, den/die Fehler zu finden...also erst mal ein Oszi anschaffen und einigermaßen damit umgehen lernen!

      Gruss
      Peer
    • ...hier noch mal ein Code, wenn mal wieder Jemand mit dem HTS Feuchte und Temperatur messen will...
      Die ganzen Berechnungen poste ich hier nicht, weil die im Datenblatt stehen (man muss noch eine Menge Register lesen und die ADC-Werte des Sensors interpolieren) und das dann recht lang würde.

      Aber hier sind die wichtigen Startfunktionen (kann auch anders eingerichtet werden...DAtenblatt) und mal ein "who-am-I" Register ausgelesen:

      --------------------------------------------------------------------------------
      Config Porta.7 = Output
      Porta.7 = 1
      Cs Alias Porta.7
      Cs = 1

      Config Porta.6 = Output
      Clk Alias Porta.6
      Clk = 1

      Soutp Alias Porta.5
      Config Soutp = Output
      Sinp Alias Pina.5
      Config Sinp = Input

      '...Sensor starten...
      Dim Sensor_start As Byte
      Dim Adresse As byte

      Adresse = &B00100000
      Sensor_start = &B10000010
      Clk = 1 'Clock und CS starten von high
      Cs = 1

      '...zwei Register beschreiben um den Sensor zu starten...

      Cs = 0 'cs auf low, weil dann Spi-Mode gestart wird...
      Shiftout Soutp , Clk , Adresse , 0 , 8 , 100
      Shiftout Soutp , Clk , Sensor_start , 1 , 8 , 100
      Cs = 1' cs high, stop lesen...

      Waitms 70 'Startzeit des Sensors abwarten, es sind ca. 40us


      '...Beispiel für ein Register-Read....

      'who_am_I einlesen...
      Dim Who_am_i As Byte
      Adresse = &B10001111
      Clk = 1 'nur nochmal zur Sicherheit hochziehen....
      Cs = 1

      Cs = 0
      Shiftout Soutp , Clk , Adresse , 0 , 8 , 100
      Shiftin Sinp , Clk , Who_am_i , 1 , 8 , 100
      Cs = 1

      -------------------------------------------------------------------------------

      an Mod: bei Bedarf (sehe gerade...) bitte nach Codeschnipsel verschieben...
      Danke.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Peer Gehrmann ()