SPI Schnittstelle, Problem mit Datenausgabe

Gast #3636760
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
Angehängte Dateien:
#3636835
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
#3637110
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
#3637167
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
#3637210
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren