Forum: Mikrocontroller und Digitale Elektronik SPI Schnittstelle, Problem mit Datenausgabe


von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
ich hätte eine Frage zu der SPI Schnittstelle. Das Problem ist, dass auf 
der Datenleitung nur die letzten 8bit ausgegeben werden, d.h. bei 0xffff 
gibt er nur 0x00ff aus. Obwohl ich die 16bit eingestellt habe.
Bei dem Bild ist die blaue Spur der CLK, die rote Spur ist das 
gewünschte Signal und die grüne Spur ist das Signal, dass ich 
tatsächlich erhalte.

Ich verwende den dsPIC33FJ256MC710A, den PCD Compailer con CCS, und das 
dsPICDEM MCLV Board.
1
#include <33FJ256MC710A.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#fuses XT,PR_PLL, NOWDT
5
#use delay (crystal=8M,clock=80M)
6
#use SPI(DI=PIN_F7, DO=PIN_F8,CLK=PIN_F6,bits=16)
7
8
void main()
9
{
10
    set_tris_f(0);
11
    set_tris_e(0);
12
    setup_spi(SPI_MASTER |SPI_MODE_16B| SPI_CLK_DIV_7 |SPI_L_TO_H);
13
    while(1)
14
    {
15
        spi_write(0xffff);
16
        delay_us(3);
17
    }
18
}
mfg

: Bearbeitet durch User
von Kris M. (kristijan_m)


Lesenswert?

Schreib das 0xffff mal in eine uint16 variable und schreib dann



spi_write(variable);

von Martin (Gast)


Lesenswert?

PS: den Code den ich ausgebe ist nicht 0xffff, sondern 0xaaaa.


@Kris M.
Daran liegt es nicht, ist das gleiche Signal wie zuvor.

von Kris M. (kristijan_m)


Lesenswert?

Was passiert wenn du nur 8 bit ausgibst? Probier mal bitte aus. Ich 
denke derweil nach :D

von Martin (Gast)


Lesenswert?

Ich habe es gerade auprobiert und es gibt mir wieder nur die letzten 
8bit aus.

von Kris M. (kristijan_m)


Lesenswert?

ah ok ich denke ich hab da was gefunden.

Ich kenn mich mit PIC nicht so gut aus, aber das sollte allgemein gültig 
sein.


versuch mal sowas hier (ich achte mal nicht auf syntex^^)

#include <33FJ256MC710A.h>
#include <stdio.h>
#include <stdlib.h>
#fuses XT,PR_PLL, NOWDT
#use delay (crystal=8M,clock=80M)
#use SPI(DI=PIN_F7, DO=PIN_F8,CLK=PIN_F6,bits=16)


main()
{
spi(uint16_t byte)
}//main ende

uint16_t spi(uint16_t byte)
{
byte= 0xaaaa

set_tris_f(0);
    set_tris_e(0);
    setup_spi(SPI_MASTER |SPI_MODE_16B| SPI_CLK_DIV_7 |SPI_L_TO_H);
    while(1)
    {
        spi_write(byte);
        delay_us(3);
    }
}//spi ende

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

Setze nach der Initialisierung mit "setup_spi(SPI_MASTER |SPI_MODE_16B| 
SPI_CLK_DIV_7 |SPI_L_TO_H);" nochmal die SPI-Schnittstelle auf 16 Bit 
mit: SPI1CON1.MODE16 = 1; (oder wie das beim CCS gemacht wird).
(wäre ja nicht die erste fehlerhaft Lib eines Compilers)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie sieht denn der Prototyp der Funktion spi_write aus?

von Martin (Gast)


Lesenswert?

Das mit dem SPIxCON1 Register setzten funktioniert auch nicht...

von Kris M. (kristijan_m)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wie sieht denn der Prototyp der Funktion spi_write aus?

jo also wenn das geschriebene bis jetzt nicht funktioniert hat, würde 
ich auch mal in der funktion spi_write() nachschauen...

wenn da ne 8bit variable irgendwo übergeben wird, kannst du vorher 
modelieren was du willst

von Kris M. (kristijan_m)


Lesenswert?

Stehen bei deinem Compiler irgendwelche Warnungen?
Viele Leute reagieren nur bei Fehlern auf Compiler Meldungen ;)

Auch die Warnungen bedeuten was...

Ps. du kannst deinen Compiler auf empfindlich stellen. Somit bringt er 
dir mehr Warnungen. Ist oftmals die beste Lösung bei nicht 100% 
funktionierendem Code

von Chris B. (dekatz)


Lesenswert?

Also der dsPIC33 ist ein 16-Bit Kontroller und dessen FSR sind alle 16 
Bit Breit - da will ich doch hoffen das da keine 8-Bit-"Dinger" 
übergeben werden. Wenn doch, dann Compiler in die Tonne!

von Karl H. (kbuchegg)


Lesenswert?

Aus der Doku
1
spi_write( ) spi_write2( )
2
Syntax: spi_write([wait],value);
3
       spi_write2([wait],value);
4
5
Parameters: value is an 8 bit int
6
            wait- an optional parameter specifying whether the
7
           function will wait for the SPI transfer to complete
8
           before exiting. Default is TRUE if not specified.
9
10
Returns: Nothing
11
12
Function: Sends a byte out the SPI interface. This will cause 8
13
         clocks to be generated. This function will write the value
14
15
....
16
17
18
Also See: spi_read(), spi_data_is_in(), SPI Overview,
19
          spi_write_16(), spi_read_16()

manchmal ist es eben doch nicht verkehrt, mal einen Blick in die Doku zu 
werfen und nicht einfach irgendwas anzunehmen

https://www.ccsinfo.com/downloads/PCDReferenceManual.pdf

: Bearbeitet durch User
von Kris M. (kristijan_m)


Lesenswert?

;)

von Justus S. (jussa)


Lesenswert?

Chris B. schrieb:
> Also der dsPIC33 ist ein 16-Bit Kontroller und dessen FSR sind alle 16
> Bit Breit -

und alle möglichen an SPI anschliessbaren "Gegenstücke" arbeiten 
natürlich auch auf 16-Bit-Basis...

von Chris B. (dekatz)


Lesenswert?

Justus Skorps schrieb:
> Chris B. schrieb:
>> Also der dsPIC33 ist ein 16-Bit Kontroller und dessen FSR sind alle 16
>> Bit Breit -
>
> und alle möglichen an SPI anschliessbaren "Gegenstücke" arbeiten
> natürlich auch auf 16-Bit-Basis...

Nein, aber wenn ich schon auf 16-Bit-Mode stelle dann wird das 
hoffenlich auch einen Grund haben - oder etwa nicht?

von Karl H. (kbuchegg)


Lesenswert?

Chris B. schrieb:
> Justus Skorps schrieb:
>> Chris B. schrieb:
>>> Also der dsPIC33 ist ein 16-Bit Kontroller und dessen FSR sind alle 16
>>> Bit Breit -
>>
>> und alle möglichen an SPI anschliessbaren "Gegenstücke" arbeiten
>> natürlich auch auf 16-Bit-Basis...
>
> Nein, aber wenn ich schon auf 16-Bit-Mode stelle dann wird das
> hoffenlich auch einen Grund haben - oder etwa nicht?

Schon.
Es hat aber auch einen Grund, warum die spi_write Funktion das einen 
feuchten Kehrricht interessiert.
Schliesslich benutzt man einen DSPic um einen auf Speed zu machen. Dem 
widersprucht es ein bischen, wenn spi_write jedesmal wieder neu 
analysiert, ob du den SPI auf 16 Bit geschaltet hast. Soweit kann man 
das einem Entwickler schon zumuten, dass er in so einem Fall dann eben 
nicht spi_write sondern spi_write_16 benutzt.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.