000
01.09.2020, 18:06 Uhr
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 |