Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Sonstiges » AVR/Atmega - SPI-read - BASCOM » Themenansicht

Autor Thread - Seiten: -1-
000
01.09.2020, 18:06 Uhr
srn

Avatar von srn

Hallo,

ich hoffe, es gibt hier jemanden unter Euch, der zu allen Stichworten im Betreff ein Experte ist.
Bislang nahm ich an, daß das SPI-Protokoll eher einfach zu handhaben ist, aber seit geraumer Zeit plage ich mich mit dem Problem herum, von einem Slave lesen zu müssen und keine gültigen Werte zu erhalten. Das Schreiben zum Slave hingegen funktioniert problemlos.
Nachfolgend sind die Quellcodeauszüge, die hoffentlich darstellen, was ich erreichen will.


Quellcode:

' Port-Pins des Slave
CONST Clear_cs = 0
CONST Set_cs   = 1
Vs1003_dreq Alias Pinf.5  : Config Vs1003_dreq = Input  : Vs1003_dreq = 1
Vs1003_xcs  Alias Portf.3 : Config Vs1003_xcs  = Output : Vs1003_xcs  = Set_cs
Vs1003_xdcs Alias Portf.6 : Config Vs1003_xdcs = Output : Vs1003_xdcs = Set_cs
Vs1003_xres Alias Portf.4 : Config Vs1003_xres = Output : Set Vs1003_xres
Vs1003_miso Alias PinB.3  : Config Vs1003_miso = Input
Vs1003_mosi Alias PortB.2 : Config Vs1003_mosi = Output
Vs1003_clck Alias PortB.1 : Config Vs1003_clck = Output

' HW-SPI einrichten - zunächst maximale Geschwindigkeit
Config Spi = Hard, Interrupt = Off, Data Order = Msb, Master = Yes, _
                   Polarity = Low, Phase = 0, Clockrate = 4, Noss = 1
Spiinit



Der folgende Code ist eine (erste) Variante vom Slave zu lesen.


Quellcode:

' Zweck    : Liest einen Registerwert vom VS1003 ein.
' Parameter: Adresse des einzulesenden Registers.
Sub Vs_read_register(ByVal byAddress As Byte)

    Local byB As Byte, wWH as Word, wWL as Word
    Local bySPIF as Byte

    wVSRegisterValue = 0

    ' Minimale SPI-Frequenz
    spcr = SPCR OR &B00000011

    Call Vs_check_dreq()

    Vs1003_xcs = Clear_cs

    ' Ca. 3 µs warten.
    NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP
    NOP : NOP : NOP : NOP : NOP
    NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP
    NOP : NOP : NOP : NOP : NOP
    NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP : NOP
    NOP : NOP : NOP : NOP : NOP

    byB = Vs_read
    Shiftout Vs1003_mosi, Vs1003_clck, byB, 1
    Shiftout Vs1003_mosi, Vs1003_clck, byAddress, 1
    byB = 0
    Shiftin Vs1003_miso, Vs1003_clck, byB, 1
    wVSRegisterValue = byB
    Shift wVSRegisterValue, Left, 8
    byB = 0
    Shiftin Vs1003_miso, Vs1003_clck, byB, 1
    wVSRegisterValue = wVSRegisterValue + byB

    Vs1003_xcs = Set_cs
    ' Maximale SPI-Frequenz
    spcr = SPCR AND &B11111100

    print wVSRegisterValue
    print wVSRegisterValue

End Sub



Und das ist die 2. Variante (gleiche Prozedur, als Code-Ausschnitt).


Quellcode:

    byB = Vs_read
    Spiout byB, 1
    Spiout byAddress, 1
    byB = 0
    SPDR = byB
    while bySPIF <> 128
        bySPIF = SPSR AND &B10000000
    wend
    wWH = SPDR
    SPDR = byB
    while bySPIF <> 128
        bySPIF = SPSR AND &B10000000
    wend
    wWL = SPDR



In beiden Fällen kommt als gelesener Wert immer FF bzw. FFFF zurück, was falsch ist. Ich bin mir sicher, daß die Ursache weder im Slave, noch in der Verwendung von BASCOM liegt. Das Problem ist mit hoher Wahrscheinlichkeit mein falsches Verständnis.

Falls mir jemand helfen möchte und noch weitere Informationen benötigt, dann bitte hier oder per Email schreiben.

Vielen Dank.
-SRN

PS: Wie dem Code sicher zu entnehmen ist, geht es um das M366. Es betrifft den Alternativschaltkreis VS1053 und nicht in erster Linie den VS1003, von dem ich nicht lesen muß.
--
http://www.kc-und-atari.de/ --- M004
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
01.09.2020, 19:32 Uhr
ambrosius



Hallo René,

ich hatte einmal ein ähnliches Problem, allerdings bei einem LCD-Controller, welcher über SPI angesprochen wurde. Er hatte ein paar Steuerregister, welche man beschreiben und lesen konnte. Allerdings nicht einzeln. Es mußten immer alle Register geschrieben und gelesen werden, obwohl es für jedes einzelne eine Adresse gab. Einzeladdressierung war weder beim Schreiben noch Lesen möglich. Es mußte immer der gesamte Registersatz hintereinander beschrieben/gelesen werden, auch wenn sich nur ein einzelnes Bit geändert hatte/geändert werden sollte. Vielleicht ist das bei Deinem Baustein auch so. Ist nur so eine Idee.
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
01.09.2020, 19:32 Uhr
Enrico
Default Group and Edit


In der Hlife hab ich Befehle spiin, spiout, spislave,
shift, shiftin, shiftout gefunden.
Leider geht die Hilfe nicht mehr.
Ich habe mit Sicherheit auch eine wesentlich ältere Version
von BASCOM.
Ev. sind shiftin, shiftout doch die falschen Befehle fürs SPI?
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
01.09.2020, 19:57 Uhr
ambrosius



Soweit ich der BASCOM-Hilfe entnehmen kann, sind SPIIN und SPIOUT die Lese- und Schreibbefehle für SPI, wenn der Hardware-Modus benutzt wird, d.h., die Hardware-Schnittstelle benutzt wird. Es gibt ja auch noch eine Simulation für jedes beliebige Pin. Dabei ist beim Schreiben zu beachten, das zwischen den einzelnen Bytes eine Weile gewartet werden muß:

"When SPI is used in HW(hardware) mode, there might be a small delay/pause after each byte that is sent. This is caused by the SPI hardware and the speed of the bus. After a byte is transmitted, SPSR bit 7 is checked. This bit 7 indicates that the SPI is ready for sending a new byte."

Die NOP-Ansammlung im ersten Listing kannst Du auch mit WAITUS 3 (3µS warten) abkürzen.
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
01.09.2020, 21:07 Uhr
srn

Avatar von srn

Hallo Holger,

richtig, ich benutze den HW-Modus.
Den von Dir zitierten Text kenne ich, aber ich hatte den bislang anders interpretiert, nämlich als Hinweis.
D.h. die Pause entsteht aufgrund der SPI-Hardware und wird von den Kommandos SPIIN/SPIOUT schon so berücksichtigt. Es kann also vorkommen, daß die beiden Kommandos etwas verzögert "zurückkommen".

Du scheinst das aber so zu interpretieren, als ob der Anwender das berücksichtigen, d.h. eine künstliche Pause programmieren müßte. Sehe ich das so richtig.

Der Idee aus Deinem ersten Beitrag gehe ich mal nach, denke aber nicht, daß dem so ist. Die Datenblätter zum VS1003/VS1053 beschreiben das nicht so.

Danke für Deine Hilfe.
Viele Grüße.
René
--
http://www.kc-und-atari.de/ --- M004
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
01.09.2020, 21:48 Uhr
ambrosius



Hallo René,

also wie ich das verstehe, wird unter HW-Bedingungen gefordert, eine Pause von mindestens 3µs einzulegen, um der Hardware die nötige Zeit zu geben, die Daten auch auszugeben und dann die internen Register neu zu laden. Gibt ja auch Sinn, die Ausgabe (seriell) braucht halt Zeit.
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
02.09.2020, 13:20 Uhr
srn

Avatar von srn

Hallo Holger,

Du hast natürlich Recht. Da habe ich das bislang mißverstanden.
Ich bin jetzt wieder auf die direkten Bascom-Kommandos zurückgegangen und der Code sieht nun aus.

Quellcode:

byB = Vs_read
Spiout byB, 1
Waitus 5
byB = byAdress
Spiout byB, 1
Waitus 5
byB = 0
Spiout byB, 1
Waitus 5
Spiin wWH, 1
byB = 0
Spiout byB, 1
Waitus 5
Spiin wWL, 1

print wWH
print wWL



Und weiterhin kommt nur 255 (FF) dabei heraus.
Ich kapier das beim besten Willen.
Irgendwas muß ich hier ganz gravierend falsch machen, aber mir gehen die Ideen aus.
Im Internet finden sich genügend Beispiel zum Register auslesen.
Die machen alle das Gleiche, genauso wie mein Code. Manche haben nach jedem OUT ein Delay, manche haben kein Delay.

Viele Grüße.
René
--
http://www.kc-und-atari.de/ --- M004
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
02.09.2020, 14:20 Uhr
Enrico
Default Group and Edit


Oder die Übergabe der Daten aus dem Sub programm klappt nicht,
weil die Daten nur lokal sind?

Mit Sub VAL - Zeug hatte ich schnell sein gelassen,
da komme ich auch nur durcheinander.
Lieber mehr Variablen, die dann aber überall gelten.
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
02.09.2020, 17:09 Uhr
srn

Avatar von srn

Das hatte ich auch schon geprüft Enrico. Die Übergaben sind in Ordnung.
Hat einer von Euch beiden vielleicht die Möglichkeit, das Lesen von einem Slave zu testen?
Welche BASCOM-Version verwendet Ihr?
--
http://www.kc-und-atari.de/ --- M004
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
02.09.2020, 17:25 Uhr
Enrico
Default Group and Edit


Ich habe Version 2.0.7.6
Das SPI-Interface hatte ich immer nur zum Programmieren
mittels avrdude genommen.
Irgendeine SPI-Hardware habe ich gar nicht.
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
02.09.2020, 18:32 Uhr
ambrosius



Ich habe die 2.0.7.8, dürfte funktional aber das Gleiche sein. Für SPI wüßte ich jetzt keine Anwendung zum ausprobieren, habe auch nur einen USB-Programmer für die Atmegas.
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
02.09.2020, 18:43 Uhr
ambrosius



Was mir noch aufgefallen ist: in 000 schreibst Du unter SPIConfig:

' HW-SPI einrichten - zunächst maximale Geschwindigkeit
Config Spi = Hard, Interrupt = Off, Data Order = Msb, Master = Yes, _
Polarity = Low, Phase = 0, Clockrate = 4, Noss = 1

In der Hilfe zu meinem BASCOM ist aber beschrieben:

....
Syntax for hardware SPI

CONFIG SPI|SPIHARD = HARD, INTERRUPT=ON|OFF, DATA_ORDER = LSB|MSB , MASTER = YES|NO , POLARITY = HIGH|LOW , PHASE = 0|1, CLOCKRATE = 4|16|64|128 , NOSS=1|0 , SPIIN=value
.....

wobei ein zusätzliches SPIIN=value benötigt wird:


Quellcode:

SPIIN
When reading from the SPI slave, it should not matter what kind of data you send. But some chips require a value of 255 while others require a value of 0. By default, when the SPIIN option is not provided, a value of 0 will be sent to the SPI slave. With this SPIIN option you can override this value.



Ich nehme mal an, daß der Slave auf die gleichen Bedingungen programmiert wurde.
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
02.09.2020, 20:10 Uhr
srn

Avatar von srn

Hallo Holger,

das SPIIN in der config ist optional. Wird es nicht angegeben, ist es 0.
Den Slave kann ich nicht programmieren, an dessen Firmware komme ich nicht heran. Das sollte aber auch nicht notwendig sein.

Ihm ist es egal, welcher Wert beim read gesendet wird (lt. Datenblatt ignoriert er nach der read-Anforderung jeden Wert auf MOSI -> any further
data on SI is ignored by the chip). CPOL/CPHA sind auf 00, sowohl beim AVR als auch beim VS1003. Jedenfalls interpretiere ich das Datenblatt des VS so.

Ich tippe so langsam auf einen Bug in BASCOM, kann aber dazu nichts brauchbares im Netz finden.
Deshalb auch meine Frage nach Euren Versionen und die Bitte, es mal mit einem x-beliebigen Slave zu versuchen.

Viele Grüße.
René
--
http://www.kc-und-atari.de/ --- M004
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
03.09.2020, 20:16 Uhr
R09

Avatar von R09

Guten Abend
Etwas Abweichend aber SPI und Bascom Problem an AD9833.
evtl hilft der Hinweis ja weiter.
https://www.roboternetz.de/community/threads/45486-Suche-Bascom-Beispiel-f%C3%BCr-AD9833
zweiter Eintrag.
Bernd
--
Leider ist die Motivation vieler Menschen ihre verkümmerten kognitiven Resourcen zu updaten äußerst gering....
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
04.09.2020, 14:34 Uhr
srn

Avatar von srn

Danke Bernd. Ich meine, das hätte ich auch schon einmal probiert, weil lt. dem DB des VS es nicht zwingend eine Pause zw. jedem Byte geben muß. Aber ich habe es vorhin noch einmal probiert und zwar gleich mit einem Long:

Quellcode:

Local lRegRead as Long, wRegValue as Word
' Bit 0-7 -> Read, 8-15 -> Status-Register, 16-31 einzulesender Wert
lRegRead = &B00000000_00000000_00000001_00000011

Spiout lRegRead, 4
Spiin wRegValue, 2
Print wRegValue       ' Ausgabe ist 65535, also Dreck


Ich frage mich ernsthaft, wie die x-tausend Arduino-Beispiele im Netz, mit exakt dem gleichen Decodermodul, wie ich es verwende, funktionieren. Bei fast allen wird mindestens ein Registerwert (Volume) eingelesen und dieser weiterverarbeitet.
--
http://www.kc-und-atari.de/ --- M004
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
04.09.2020, 20:08 Uhr
ambrosius



Hast Du schon einmal eines dieser Beispiele zum Test ausprobiert? Wenn das funktioniert, bist Du wenigstens sicher, daß die Verdrahtung und Hardware funktioniert.
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Sonstiges ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek