Assemblerfrage zum SPI-Treiber

Compiler

rbr50
 
Avatar
 
Subject:

Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 11:01  ·  #1
Hallo,

ich versuche mich gerade an einer SPI-Kommunikation. Dazu benutze ich den Hardwaretreiber SPIDriver. (aktueller Compiler wird verwendet)

Nun habe ich ein Verständnisproblem mit dem Assemblercode, den der Compiler erzeugt.
So wie ich den Code verstehe, wird beim Lesen mit SPIinpByte immer zuerst ein Nullbyte gesendet, in SYSTEM._SPIputget. Habeich das richtig verstanden? Ist das denn richtig so?
Wenn ja, bitte warum?

Viele Grüße aus dem herbstlichem Petershagen!

Rolf


Code

                        ; ============ Library ============

SYSTEM._SPIputget:
                        OUT       SPDR,_ACCA
                        .EXECOFF
SYSTEM._L0172:
                        IN        _ACCA, SPSR
                        SBRS      _ACCA, 7
                        RJMP      SYSTEM._L0172
                        .EXECON
                        IN        _ACCA, SPDR
                        RET

SYSTEM.SPIoutByte:
                        CBI       PORTB, 4
                        RCALL     SYSTEM._SPIputget
                        SBI       PORTB, 4
                        RET

SYSTEM.SPIinpByte:
                        CBI       PORTB, 4
                        CLR       _ACCA
                        RCALL     SYSTEM._SPIputget
                        SBI       PORTB, 4
                        RET
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 13:24  ·  #2
Hallo Rolf,

ein SPI Slave kann niemals von sich aus irgendwas senden.
Der Master muss beim Abfragen des SPI Slave 8 Clocks generieren so dass der Slave
mit jedem Clock Puls ein bit ausgeben kann. Der Master lässt in dieser Zeit seine
Daten Leitung inaktiv bzw. '0'. Da sieht dann so aus als würde der Master eine Null
senden.

rolf
rbr50
 
Avatar
 
Subject:

Re: Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 17:00  ·  #3
Hallo Rolf! ;-)

Ich glaube, ich habe mal wieder undeutlich gefragt. Es geht mir um den generiereten Assemblercode. Wenn ich die Funktion SPIinpByte benutzte, wird auf jeden Fall im erzeugtem Assemblercode die Routine SYSTEM._SPIputget aufgerufen. Und diese macht als erstes ein

CBI PORTB, 4
CLR _ACCA
OUT SPDR,_ACCA


Also wird doch eine Null gesendet?
Wenn das so ist, verstehe ich das warum nicht, da ich eigentlich bei SPIinpByte ein reines Lesen erwartet hätte.


Vielen Dank für Deine Engelsgeduld!

Rolf
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 17:07  ·  #4
Hallo Rolf,

ich habe das schon richtig verstanden und auch korrekt beantwortet.
Es gibt beim SPI kein getrenntes Lesen und Schreiben.
Indem diese Null gesendet wird, wird im gleichen Vorgang immer auch ein Byte
vom Slave gelesen.

rolf
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 17:31  ·  #5
Hi,

ist in den Datenblättern doch sehr anschaulich dargestellt:
Attachments
Assemblerfrage zum SPI-Treiber
Filename: SPI.png
Filesize: 18.37 KB
Title:
Download counter: 76
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1408
Registered: 03 / 2005
Subject:

Re: Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 17:43  ·  #6
Hi Rolf.

SPI transmits and receives simultaneously. There are 4 lines, MOSI (which stands for Master Out Slave In) MISO (which stands for Master In Slave Out) SS (which stands for Slave Select) and Clock. Only the slave with its slave select line should toggle the MISO line and only the Master should toggle the MOSI line. Usually the master toggles the clock line. There is data on both the MISO and MOSI lines when the clock operates. So both the master and slave MUST send data, even if they don't have any data to send. Hence the send of zero.

The clock does not have to be regular (like a standard clock) but the slave must be able to keep up with the clock rate generated.
rbr50
 
Avatar
 
Subject:

Re: Assemblerfrage zum SPI-Treiber

 · 
Posted: 29.07.2012 - 18:50  ·  #7
Hi Rolf, hi Gunter, hi Merlin!

Many thanks for spending time to my perhaps stupid question. I read the datasheet, certainly. But don't understand. Together with your help it's now clear.

Thanks again and best regards, Rolf
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   119   134 · Page-Gen-Time: 0.032807s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI